防爆玻璃门网站建设江苏提升关键词排名收费

web/2025/10/5 23:16:52/文章来源:
防爆玻璃门网站建设,江苏提升关键词排名收费,北京房地产网站建设,项目ppt制作模板JDBC快速入门 PS#xff1a;上传图片有点问题#xff0c;我整理成了PDF格式#xff0c;方便看图文。 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1#xff0c;JDBC概述 在开发中我们使用的是java语言#xff0c;那么势必要通过java语言操作数据库…JDBC快速入门 PS上传图片有点问题我整理成了PDF格式方便看图文。 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1JDBC概述 在开发中我们使用的是java语言那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称( Java DataBase Connectivity ) Java 数据库连接 我们开发的同一套Java代码是无法操作不同的关系型数据库因为每一个关系型数据库的底层实现细节都不一样。如果这样问题就很大了在公司中可以在开发阶段使用的是MySQL数据库而上线时公司最终选用oracle数据库我们就需要对代码进行大批量修改这显然并不是我们想看到的。我们要做到的是同一套Java代码操作不同的关系型数据库而此时sun公司就指定了一套标准接口JDBCJDBC中定义了所有操作关系型数据库的规则。众所周知接口是无法直接使用的我们需要使用接口的实现类而这套实现类称之为驱动就由各自的数据库厂商给出。 1.2 JDBC本质 官方sun公司定义的一套操作所有关系型数据库的规则即接口各个数据库厂商去实现这套接口提供数据库驱动jar包我们可以使用这套接口JDBC编程真正执行的代码是驱动jar包中的实现类 1.3 JDBC好处 各数据库厂商使用相同的接口Java代码不需要针对不同数据库分别开发可随时替换底层数据库访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC接口操作哪儿个关系型数据库就需要导入该数据库的驱动包如需要操作MySQL数据库就需要再项目中导入MySQL数据库的驱动包。如下图就是MySQL驱动包 2JDBC快速入门 先来看看通过Java操作数据库的流程 第一步编写Java代码 第二步Java代码将SQL发送到MySQL服务端 第三步MySQL服务端接收到SQL语句并执行该SQL语句 第四步将SQL语句执行的结果返回给Java代码 2.1 编写代码步骤 创建工程导入驱动jar包 注册驱动 Class.forName(com.mysql.jdbc.Driver);获取连接 Connection conn DriverManager.getConnection(url, username, password);Java代码需要发送SQL给MySQL服务端就需要先建立连接 定义SQL语句 String sql “update…” ;获取执行SQL对象 执行SQL语句需要SQL执行对象而这个执行对象就是Statement对象 Statement stmt conn.createStatement();执行SQL stmt.executeUpdate(sql); 处理返回结果 释放资源 2.2 具体操作 创建新的空的项目 定义项目的名称并指定位置 对项目进行设置JDK版本、编译版本 创建模块指定模块的名称及位置 导入驱动包 将mysql的驱动包放在模块下的lib目录随意命名下并将该jar包添加为库文件 在添加为库文件的时候有如下三个选项 Global Library 全局有效Project Library : 项目有效Module Library 模块有效 在src下创建类 编写代码如下 /*** JDBC快速入门*/ public class JDBCDemo {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接String url jdbc:mysql://127.0.0.1:3306/db1;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql update account set money 2000 where id 1;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//受影响的行数//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();} }3JDBC API详解 3.1 DriverManager DriverManager驱动管理类作用 注册驱动 registerDriver方法是用于注册驱动的但是我们之前做的入门案例并不是这样写的。而是如下实现 Class.forName(com.mysql.jdbc.Driver);我们查询MySQL提供的Driver类看它是如何实现的源码如下 在该类中的静态代码块中已经执行了 DriverManager 对象的 registerDriver() 方法进行驱动的注册了那么我们只需要加载 Driver 类该静态代码块就会执行。而 Class.forName(com.mysql.jdbc.Driver); 就可以加载 Driver 类。 提示 MySQL 5之后的驱动包可以省略注册驱动的步骤自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类 获取数据库连接 参数说明 url 连接路径 语法jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1参数键值对2… 示例jdbc:mysql://127.0.0.1:3306/db1 细节 如果连接的是本机mysql服务器并且mysql服务默认端口是3306则url可以简写为jdbc:mysql:///数据库名称?参数键值对 配置 useSSLfalse 参数禁用安全连接方式解决警告提示 user 用户名 poassword 密码 3.2 Connection Connection数据库连接对象作用 获取执行 SQL 的对象管理事务 3.2.1 获取执行对象 普通执行SQL对象 Statement createStatement()入门案例中就是通过该方法获取的执行对象。 预编译SQL的执行SQL对象防止SQL注入 PreparedStatement prepareStatement(sql)通过这种方式获取的 PreparedStatement SQL语句执行对象是我们一会重点要进行讲解的它可以防止SQL注入。 执行存储过程的对象 CallableStatement prepareCall(sql)通过这种方式获取的 CallableStatement 执行对象是用来执行存储过程的而存储过程在MySQL中不常用所以这个我们将不进行讲解。 3.2.2 事务管理 先回顾一下MySQL事务管理的操作 开启事务 BEGIN; 或者 START TRANSACTION;提交事务 COMMIT;回滚事务 ROLLBACK; MySQL默认是自动提交事务 接下来学习JDBC事务管理的方法。 Connection几口中定义了3个对应的方法 开启事务 参与autoCommit 表示是否自动提交事务true表示自动提交事务false表示手动提交事务。而开启事务需要将该参数设为为false。 提交事务 回滚事务 具体代码实现如下 /*** JDBC API 详解Connection*/ public class JDBCDemo3_Connection {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql1 update account set money 3000 where id 1;String sql2 update account set money 3000 where id 2;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();try {// 开启事务conn.setAutoCommit(false);//5. 执行sqlint count1 stmt.executeUpdate(sql1);//受影响的行数//6. 处理结果System.out.println(count1);int i 3/0;//5. 执行sqlint count2 stmt.executeUpdate(sql2);//受影响的行数//6. 处理结果System.out.println(count2);// 提交事务//程序运行到此处说明没有出现任何问题则需求提交事务conn.commit();} catch (Exception e) {// 回滚事务//程序在出现异常时会执行到这个地方此时就需要回滚事务conn.rollback();e.printStackTrace();}//7. 释放资源stmt.close();conn.close();} }3.3 Statement 3.3.1 概述 Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。 执行DDL、DML语句 执行DQL语句 该方法涉及到了 ResultSet 对象而这个对象我们还没有学习一会再重点讲解。 3.3.2 代码实现 执行DML语句 /*** 执行DML语句* throws Exception*/ Test public void testDML() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql update account set money 3000 where id 1;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//执行完DML语句受影响的行数//6. 处理结果//System.out.println(count);if(count 0){System.out.println(修改成功~);}else{System.out.println(修改失败~);}//7. 释放资源stmt.close();conn.close(); }执行DDL语句 /*** 执行DDL语句* throws Exception*/ Test public void testDDL() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql drop database db2;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//执行完DDL语句可能是0//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close(); }注意 以后开发很少使用java代码操作DDL语句 3.4 ResultSet 3.4.1 概述 ResultSet结果集对象作用 封装了SQL查询语句的结果。 而执行了DQL语句后就会返回该对象对应执行DQL语句的方法如下 ResultSet executeQuery(sql)执行DQL 语句返回 ResultSet 对象那么我们就需要从 ResultSet 对象中获取我们想要的数据。ResultSet 对象提供了操作查询结果数据的方法如下 boolean next() 将光标从当前位置向前移动一行判断当前行是否为有效行 方法返回值说明 true 有效航当前行有数据false 无效行当前行没有数据 xxx getXxx(参数)获取数据 xxx : 数据类型如 int getInt(参数) String getString(参数)参数 int类型的参数列的编号从1开始String类型的参数 列的名称 如下图为执行SQL语句后的结果 一开始光标指定于第一行前如图所示红色箭头指向于表头行。当我们调用了 next() 方法后光标就下移到第一行数据并且方法返回true此时就可以通过 getInt(id) 获取当前行id字段的值也可以通过 getString(name) 获取当前行name字段的值。如果想获取下一行的数据继续调用 next() 方法以此类推。 3.4.2 代码实现 /*** 执行DQL* throws Exception*/ Test public void testResultSet() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql select * from account;//4. 获取statement对象Statement stmt conn.createStatement();//5. 执行sqlResultSet rs stmt.executeQuery(sql);//6. 处理结果 遍历rs中的所有数据/* // 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){//6.2 获取数据 getXxx()int id rs.getInt(1);String name rs.getString(2);double money rs.getDouble(3);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println(--------------);}*/// 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){//6.2 获取数据 getXxx()int id rs.getInt(id);String name rs.getString(name);double money rs.getDouble(money);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println(--------------);}//7. 释放资源rs.close();stmt.close();conn.close(); }3.5 案例 需求查询account账户表数据封装为Account对象中并且存储到ArrayList集合中 代码实现 /*** 查询account账户表数据封装为Account对象中并且存储到ArrayList集合中* 1. 定义实体类Account* 2. 查询数据封装到Account对象中* 3. 将Account对象存入ArrayList集合中*/ Test public void testResultSet2() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql select * from account;//4. 获取statement对象Statement stmt conn.createStatement();//5. 执行sqlResultSet rs stmt.executeQuery(sql);// 创建集合ListAccount list new ArrayList();// 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){Account account new Account();//6.2 获取数据 getXxx()int id rs.getInt(id);String name rs.getString(name);double money rs.getDouble(money);//赋值account.setId(id);account.setName(name);account.setMoney(money);// 存入集合list.add(account);}System.out.println(list);//7. 释放资源rs.close();stmt.close();conn.close(); }3.6 PreparedStatement PreparedStatement作用 预编译SQL语句并执行预防SQL注入问题 对上面的作用中SQL注入问题大家肯定不理解。那我们先对SQL注入进行说明. 3.6.1 SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句用以达到执行代码对服务器进行攻击的方法。 在今天资料下的 day03-JDBC\资料\2. sql注入演示 中修改 application.properties 文件中的用户名和密码文件内容如下 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/test?useSSLfalseuseUnicodetruecharacterEncodingUTF-8 spring.datasource.usernameroot spring.datasource.password1234在MySQL中创建名为 test 的数据库 create database test;在命令提示符中运行今天资料下的 day03-JDBC\资料\2. sql注入演示\sql.jar 这个jar包。 此时我们就能在数据库中看到user表 接下来在浏览器的地址栏输入 localhost:8080/login.html 就能看到如下页面 我们就可以在如上图中输入用户名和密码进行登陆。用户名和密码输入正确就登陆成功跳转到首页。用户名和密码输入错误则给出错误提示如下图 但是我可以通过输入一些特殊的字符登陆到首页。 用户名随意写密码写成 or 1 1 这就是SQL注入漏洞也是很危险的。当然现在市面上的系统都不会存在这种问题了所以大家也不要尝试用这种方式去试其他的系统。 那么该如何解决呢这里就可以将SQL执行对象 Statement 换成 PreparedStatement 对象。 3.6.2 代码模拟SQL注入问题 Test public void testLogin() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name sjdljfld;String pwd or 1 1;String sql select * from tb_user where username name and password pwd;// 获取stmt对象Statement stmt conn.createStatement();// 执行sqlResultSet rs stmt.executeQuery(sql);// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();stmt.close();conn.close(); }上面代码是将用户名和密码拼接到sql语句中拼接后的sql语句如下 select * from tb_user where username sjdljfld and password or 1 1从上面语句可以看出条件 username sjdljfld and password 不管是否满足而 or 后面的 1 1 是始终满足的最终条件是成立的就可以正常的进行登陆了。 接下来我们来学习PreparedStatement对象. 3.6.3 PreparedStatement概述 PreparedStatement作用 预编译SQL语句并执行预防SQL注入问题 获取 PreparedStatement 对象 // SQL语句中的参数值使用占位符替代 String sql select * from user where username ? and password ?; // 通过Connection对象获取并传入对应的sql语句 PreparedStatement pstmt conn.prepareStatement(sql);设置参数值 上面的sql语句中参数使用 ? 进行占位在之前之前肯定要设置这些 ? 的值。 PreparedStatement对象setXxx(参数1参数2)给 ? 赋值 Xxx数据类型 如 setInt (参数1参数2) 参数 参数1 的位置编号从1 开始 参数2 的值 执行SQL语句 executeUpdate(); 执行DDL语句和DML语句 executeQuery(); 执行DQL语句 注意 调用这两个方法时不需要传递SQL语句因为获取SQL语句执行对象时已经对SQL语句进行预编译了。 3.6.4 使用PreparedStatement改进 Test public void testPreparedStatement() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name zhangsan;String pwd or 1 1;// 定义sqlString sql select * from tb_user where username ? and password ?;// 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);// 设置的值pstmt.setString(1,name);pstmt.setString(2,pwd);// 执行sqlResultSet rs pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();pstmt.close();conn.close(); }执行上面语句就可以发现不会出现SQL注入漏洞问题了。那么PreparedStatement又是如何解决的呢它是将特殊字符进行了转义转义的SQL如下 select * from tb_user where username sjdljfld and password \or \1\ \13.6.5 PreparedStatement原理 PreparedStatement 好处 预编译SQL性能更高防止SQL注入将敏感字符进行转义 Java代码操作数据库流程如图所示 将sql语句发送到MySQL服务器端 MySQL服务端会对sql语句进行如下操作 检查SQL语句 检查SQL语句的语法是否正确。 编译SQL语句。将SQL语句编译成可执行的函数。 检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。 执行SQL语句 接下来我们通过查询日志来看一下原理。 开启预编译功能 在代码中编写url时需要加上以下参数。而我们之前根本就没有开启预编译功能只是解决了SQL注入漏洞。 useServerPrepStmtstrue配置MySQL执行日志重启mysql服务后生效 在mysql配置文件my.ini中添加如下配置 log-outputFILE general-log1 general_log_fileD:\mysql.log slow-query-log1 slow_query_log_fileD:\mysql_slow.log long_query_time2java测试代码如下 /*** PreparedStatement原理* throws Exception*/ Test public void testPreparedStatement2() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写// useServerPrepStmtstrue 参数开启预编译功能String url jdbc:mysql:///db1?useSSLfalseuseServerPrepStmtstrue;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name zhangsan;String pwd or 1 1;// 定义sqlString sql select * from tb_user where username ? and password ?;// 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);Thread.sleep(10000);// 设置的值pstmt.setString(1,name);pstmt.setString(2,pwd);ResultSet rs null;// 执行sqlrs pstmt.executeQuery();// 设置的值pstmt.setString(1,aaa);pstmt.setString(2,bbb);// 执行sqlrs pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();pstmt.close();conn.close(); }执行SQL语句查看 D:\mysql.log 日志如下: 上图中第三行中的 Prepare 是对SQL语句进行预编译。第四行和第五行是执行了两次SQL语句而第二次执行前并没有对SQL进行预编译。 小结 在获取PreparedStatement对象时将sql语句发送给mysql服务器进行检查编译这些步骤很耗时执行时就不用再进行这些步骤了速度更快如果sql模板一样则只需要进行一次检查、编译 4数据库连接池 4.1 数据库连接池简介 数据库连接池是个容器负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接而不是再重新建立一个 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 好处 资源重用提升系统响应速度避免数据库连接遗漏 之前我们代码中使用连接是没有使用都创建一个Connection对象使用完毕就会将其销毁。这样重复创建销毁的过程是特别耗费计算机的性能的及消耗时间的。 而数据库使用了数据库连接池后就能达到Connection对象的复用如下图 连接池是在一开始就创建好了一些连接Connection对象存储起来。用户需要连接数据库时不需要自己创建连接而只需要从连接池中获取一个连接进行使用使用完毕后再将连接对象归还给连接池这样就可以起到资源重用也节省了频繁创建连接销毁连接所花费的时间从而提升了系统响应的速度。 4.2 数据库连接池实现 标准接口DataSource 官方(SUN) 提供的数据库连接池标准接口由第三方组织实现此接口。该接口提供了获取连接的功能 Connection getConnection()那么以后就不需要通过 DriverManager 对象获取 Connection 对象而是通过连接池DataSource获取 Connection 对象。 常见的数据库连接池 DBCPC3P0Druid 我们现在使用更多的是Druid它的性能比其他两个会好一些。 Druid德鲁伊 Druid连接池是阿里巴巴开源的数据库连接池项目 功能强大性能优秀是Java语言最好的数据库连接池之一 4.3 Driud使用 导入jar包 druid-1.1.12.jar定义配置文件加载配置文件获取数据库连接池对象获取连接 现在通过代码实现首先需要先将druid的jar包放到项目下的lib下并添加为库文件 项目结构如下 编写配置文件如下 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql:///db1?useSSLfalseuseServerPrepStmtstrue usernameroot password1234 # 初始化连接数量 initialSize5 # 最大连接数 maxActive10 # 最大等待时间 maxWait3000使用druid的代码如下 /*** Druid数据库连接池演示*/ public class DruidDemo {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection connection dataSource.getConnection();System.out.println(connection); //获取到了连接后就可以继续做其他操作了//System.out.println(System.getProperty(user.dir));} }5JDBC练习 5.1 需求 完成商品品牌数据的增删改查操作 查询查询所有数据添加添加品牌修改根据id修改删除根据id删除 5.2 案例实现 5.2.1 环境准备 数据库表 tb_brand -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int,-- 描述信息description varchar(100),-- 状态0禁用 1启用status int ); -- 添加数据 insert into tb_brand (brand_name, company_name, ordered, description, status) values (三只松鼠, 三只松鼠股份有限公司, 5, 好吃不上火, 0),(华为, 华为技术有限公司, 100, 华为致力于把数字世界带入每个人、每个家庭、每个组织构建万物互联的智能世界, 1),(小米, 小米科技有限公司, 50, are you ok, 1);在pojo包下实体类 Brand /*** 品牌* alt 鼠标左键整列编辑* 在实体类中基本数据类型建议使用其对应的包装类型*/ public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态0禁用 1启用private Integer status;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status status;}Overridepublic String toString() {return Brand{ id id , brandName brandName \ , companyName companyName \ , ordered ordered , description description \ , status status };} }5.2.2 查询所有 /*** 查询所有* 1. SQLselect * from tb_brand;* 2. 参数不需要* 3. 结果ListBrand*/Test public void testSelectAll() throws Exception {//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql select * from tb_brand;;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数//5. 执行SQLResultSet rs pstmt.executeQuery();//6. 处理结果 ListBrand 封装Brand对象装载List集合Brand brand null;ListBrand brands new ArrayList();while (rs.next()){//获取数据int id rs.getInt(id);String brandName rs.getString(brand_name);String companyName rs.getString(company_name);int ordered rs.getInt(ordered);String description rs.getString(description);int status rs.getInt(status);//封装Brand对象brand new Brand();brand.setId(id);brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(ordered);brand.setDescription(description);brand.setStatus(status);//装载集合brands.add(brand);}System.out.println(brands);//7. 释放资源rs.close();pstmt.close();conn.close(); }5.2.3 添加数据 /*** 添加* 1. SQLinsert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);* 2. 参数需要除了id之外的所有参数信息* 3. 结果boolean*/ Test public void testAdd() throws Exception {// 接收页面提交的参数String brandName 香飘飘;String companyName 香飘飘;int ordered 1;String description 绕地球一圈;int status 1;//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,ordered);pstmt.setString(4,description);pstmt.setInt(5,status);//5. 执行SQLint count pstmt.executeUpdate(); // 影响的行数//6. 处理结果System.out.println(count 0);//7. 释放资源pstmt.close();conn.close(); }5.2.4 修改数据 /*** 修改* 1. SQLupdate tb_brandset brand_name ?,company_name ?,ordered ?,description ?,status ?where id ?* 2. 参数需要所有数据* 3. 结果boolean*/Test public void testUpdate() throws Exception {// 接收页面提交的参数String brandName 香飘飘;String companyName 香飘飘;int ordered 1000;String description 绕地球三圈;int status 1;int id 4;//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql update tb_brand\n set brand_name ?,\n company_name ?,\n ordered ?,\n description ?,\n status ?\n where id ?;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,ordered);pstmt.setString(4,description);pstmt.setInt(5,status);pstmt.setInt(6,id);//5. 执行SQLint count pstmt.executeUpdate(); // 影响的行数//6. 处理结果System.out.println(count 0);//7. 释放资源pstmt.close();conn.close(); }5.2.5 删除数据 /*** 删除* 1. SQLdelete from tb_brand where id ?* 2. 参数需要id* 3. 结果boolean*/ Test public void testDeleteById() throws Exception {// 接收页面提交的参数int id 4;//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql delete from tb_brand where id ?;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数pstmt.setInt(1,id);//5. 执行SQLint count pstmt.executeUpdate(); // 影响的行数//6. 处理结果System.out.println(count 0);//7. 释放资源pstmt.close();conn.close(); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

潍坊网站定制个人手机网站

文章目录 1. 导航栏样式进一步调整2. 入驻企业信息展示栏2.1 Title设置2.2 具体信息添加 3. 轮播图4. 注册登录按钮及其他信息5. 一些五颜六色的、丰富视觉效果的中间件…… 1. 导航栏样式进一步调整 这种导航栏,选中的时候字体变蓝色,可能还是不够美观&…

网站建设 全是乱码做网站 赚广告费

博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。这是一个科研互助群,主要围绕机器人,无人驾驶,无人机方面的感知定位,决策规划,以及论文发表经验,以方便大家很好很快的科研…

安徽网站建设seo优化php 公司网站源码

01报警人哎,110,这边打架了。(南方口音)警察在哪里?报警人在fa ben 市场门口嘛。警察什么“发奔”市场,没听过这个地方,你能讲清楚点吗?报警人就是那个卖“发发”草草的市场嘛,哎,这都不知道,…

企业用什么做网站北京网站建设找华网天下

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

php网站添加验证码龙岩优化怎么做搜索

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容,本章回中将介绍关于MediaQuery的优化.闲话休提,让我们一起Talk Flutter吧。 1. 问题描述 我们在…

最新网站建设的模板怎么查看网站是用什么系统做的

java方法可选参数在Java类中设计方法时,某些参数对于其执行而言可能是可选的。 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的。 从本文中, 您将学习如何在Java中处理可选参数 。 我们将专注于常规方…

网站后台素材街道门户网站的建设思路

​ 我的博客是一个技术分享平台,涵盖了机器学习、数据可视化、大数据分析、数学统计学、推荐算法、Linux命令及环境搭建,以及Kafka、Flask、FastAPI、Docker等组件的使用教程。 在这个信息时代,数据已经成为了一种新的资源,而机…

最容易被收录的网站网页设计图片居中怎么设置

一、介绍 工厂模式可以分为 3 个小类 简单工厂模式工厂方法模式抽象工厂模式 工厂模式的工厂类,并不一定以 Factory 结尾,例如 DataFormat、Calender 他们都是工厂类,通过静态方法来创建实例。 除此之外,创建对象的方法名称一…

学院网站建设的特色南宁网络推广方法

这里写自定义目录标题 1 Lua1.1 简介1.1.1 注释1.1.2 变量1.1.3 数据类型1.1.4 控制结构1.1.5 函数1.1.6 模块1.1.7 字符串操作1.1.8 错误处理1.1.9 标准库 1.2 Redis和Lua脚本结合优点1.3 Lua脚本应用和调试1.3.1 缓存更新1.3.2 原子操作1.3.3 数据处理1.3.4 分布式锁1.3.5 Re…

天元建设集团有限公司经济官司seo排名方案

标题描述一、解决方法解决代码二、关于高度问题简单讲一下jquery中的 height(),innerHeight()、outHeight(),js中的offsetHeight、clientHeight、scrollHeight。如何获取没有给出高度的元素的高度?详细介绍offsetHeight,clientHeight,scrollH…

怎样在文章后做网站链接网站seo的内容是什么

TextField对象相关的属性和方法,内容十分丰富,下面几个表格: 表一 TextField 对象的方法 方法 说明 TextField.addListener 加入接收触发事件如文本域内容变化或滚动变化的监听对象,触发事件可以参看最后一个表。 TextField.getDe…

网站源码cms深圳品牌展会

想要更快更高效地做事,一定会带来问题,我们要做的是 保证事情一定要做对坚定不移地解决问题,寻找方法,而不是回归慢速 这里有几个典型的例子 从单周期CPU,到多周期CPU,是为了提速,我们不必再…

微信开发商成都网站seo外包

目录 1. 问题现象 2. 原因分析 3. 解决方法 1. 问题现象 因为业务需求,需要利用子线程向主线程发送数据。像这种子线程和主线程进行数据交互时,一般都是通过Qt的信号槽机制来实现。如下代码: void myClass::doBusiness() {…

如何跳过网站会员沈阳市住房和城乡建设厅网站

曾经在我的一篇《控制面板的创建》中介绍过WinCE控制面板的结构,不过由于那篇文章其目的只在于控制面板如何调用EXE程序,故对控制面板也仅是泛泛而谈.不过在这篇文章中,我们将对WinCE的使用方法来个整体的详解. 1.控制面板的结构 控制面板其实也是个动态链接库…

手机端视频网站模板什么是网络营销中的终极诉求

1、演示 2、水印的目的 版权保护:水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息,以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时,可以追溯到原始作者或版权所有者,从而加强版权保护。 身份识…

asp网站加速网站增加外链的方法有哪些

SD3303A是一款大功率高亮度LED驱动芯片,可以提供 1A的电流驱动3W的LED。具有高效率,低功耗等特点 ,适用于电池供电的LED照明设备。 SD3303A具有开路保护和过温保护。 SD3303A需要使用两颗10uF(或者更大)的瓷 片电容,来保证电路性能…

3g 手机网站电子商务网站建设有哪些知识点

1.关闭在线DRC功能,可以避免布线时候一卡一卡的问题: 取消在线DRC的勾选: 2.AD的在线封装库,非常好用: 如何优雅地服用AD 21的在线元件库 – 吴川斌的博客 (mr-wu.cn) 3.如何恢复Altium Designer23默认窗口布局 打开…

冠县住房和城乡建设局网站淘宝客建站教程

SpringCloud Ribbon中的7种负载均衡策略 Ribbon 介绍负载均衡设置7种负载均衡策略1.轮询策略2.权重策略3.随机策略4.最小连接数策略5.重试策略6.可用性敏感策略7.区域敏感策略 总结 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端…

营销型网站建设策划案wix网站建设

1、typescript的基础类型 如下表: 数据类型 关键字 描述 任意类型 any 生命any的变量可以赋值任意类型的值 数字类型 number 整数或分数 字符串类型 string 使用单引号(‘’)或者双引号(“”)来表示字符串…

百度搜索网站提交网站建设 模块

相信大多数人在学习单片机的时候,都是从最基本的8位MCU开始的。一般来说,8位单片机最常见的是三个系列是:51系列、AVR系列、PIC系列。而前段时间,群里讨论了一个问题:在51单片机上跑RTOS有没有意义?关于这个…