java中JDBC的讲解 |
您所在的位置:网站首页 › model在java中 › java中JDBC的讲解 |
1. JDBC入门
1.1编写步骤
创建工程,导入驱动jar包 注册驱动 Class.forName("com.mysql.jdbc.Driver");获取连接 Java代码需要发送SQL给MySQL服务端,就需要先建立连接 Connection conn = DriverManager.getConnection(url, username,password);定义SQL语句 String sql = “update…” ;获取执行SQL对象 执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象 Statement stmt = conn.createStatement();执行SQL stmt.executeUpdate(sql);处理返回结果 释放资源 1.2具体操作创建新的空的项目 定义项目的名称,并指定位置 对项目进行设置,JDK版本、编译版本 创建模块,指定模块的名称及位置 导入驱动包 将mysql的驱动包放在模块下的lib目录(随意命名)下,并将该jar包添加为库文件 在添加为库文件的时候,有如下三个选项 Global Library : 全局有效 Project Library : 项目有效 Module Library : 模块有效 在src下创建类 具体代码 package com.shujuku.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; /** * JDBC快速入门 */ public class JDBCDemo { public static void main(String[] args) throws Exception { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 String url = "jdbc:mysql://127.0.0.1:3306/schoolinfo"; //3306/ 后面写要连接的数据库的名字 String username = "root"; String password = "*******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义SQL语句 String sql = "update yuangong set salary = 3000 where id = 8005"; // String sql = "select * form yuangong"; //4.获取执行sql的对象Statement Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql); //受影响的行数 //6.处理结果 System.out.println(count); //7.释放资源 stmt.close(); conn.close(); //因为先开connection后开statement,所以先释放statement } } 2. JDBC API详解 2.1 DriverManage(驱动管理类)作用2.1.1 注册驱动:registerDriver(Driverdriver); //使用DriverManager注册给定的驱动程序 在Class.ForName中已经有了,没有也可以,在jar包中已经有了,所以Class.ForName删除也可以驱动成功 2.1.2 getConnection(Stringurl, String user, String password); //尝试建议与给定数据库URL的连接 url : 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1& 参数键值对2 … 例:jdbc:mysql://127.0.0.1:3306/db1 注意:本机mysql服务器,并且端口是3306,可简写为:jdbc:mysql:///数据库名称?参数键值对。(三个斜杠) 配置useSSL = false 参数,禁用安全连接方式,解决警告提示 2.2 Connection(数据库连接对象) 作用 2.2.1 获取执行SQL的对象: 普通执行SQL对象:StatementcreateStatement() 预编译SQL的执行SQL对象:防止SQL注入 PreparedStatement preparedStatement(sql) 后面详讲
执行存储过程的对象(不重要): CallableStatement prepareCall(sql)
2.2.2 管理事务: MySQL事务管理: 开启事务:BEGIN;/START TRANSACTION; (begin; start transaction) 提交事务:COMMIT; 回滚事务:ROLLBACK; (MySQL默认自动提交事务)
JDBC事务管理:Connection接口中定义了3个对应的方法 开启事务:setAutoCommit(boolean autoCommit) : true为自动提交事务;false为手动提交事务,即为开启事务 提交事务:commit() 回滚事务:rollback() 代码 package com.shujuku.jdbc.api2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * JDBC API:Connection */ public class JDBCDemo3 { public static void main(String[] args) throws Exception { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///schoolinfo"; String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义SQL语句 // String sql = "select * form yuangong"; String sql1 = "update yuangong set salary = 3000 where id = 8005"; String sql2 = "update yuangong set salary = 3000 where id = 8004"; //4.获取执行sql的对象Statement Statement stmt = conn.createStatement(); //开启事务 conn.setAutoCommit(false); try { //5.执行sql int count1 = stmt.executeUpdate(sql1); //受影响的行数 //6.处理结果 System.out.println(count1); //异常 int i = 3/0; /** * 出现错误两个都不会更改----- */ //5.执行sql int count2 = stmt.executeUpdate(sql2); //受影响的行数 //6.处理结果 System.out.println(count2); //提交事务 conn.commit(); } catch (Exception e) { //事务回滚,上面出现异常会回滚 conn.rollback(); e.printStackTrace(); } //7.释放资源 stmt.close(); conn.close(); //因为先开connection后开statement,所以先释放statement } }报错回滚 在回滚报错后,数据库中的数据两条都不会改变 2.3 Statement的作用执行SQL语句 int executeUpdate(sql) : 执行DML(对数据的增删改)、DDL语句(对表和库的增删改查) 返回值:(1)DML语句影响的行数 (2)DDL语句执行后,执行成功后也可能返回0
ResultSet executeQuery(sql) : 执行DQL语句(对数据的查询操作,后面讲) 返回值:ResultSet结果集对象 DML package com.shujuku.jdbc.api4; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * JDBC API: Statement */ public class JDBCDemo4 { @Test public void testDML() throws SQLException { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///schoolinfo"; String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义SQL语句 String sql = "update yuangong set salary = 3000 where id = 8005"; //1.更改数据 //4.获取执行sql的对象Statement Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql); //1.受影响的行数,即执行DML的返回值, 输出:>1(成功),0(失败) //6.处理结果 System.out.println(count); if(count > 0){ System.out.println("修改成功~"); System.out.println("修改成功~"); }else{ System.out.println("修改失败~"); } //7.释放资源 stmt.close(); conn.close(); //因为先开connection后开statement,所以先释放statement } }DDL 创建新的数据库: package com.shujuku.jdbc.api4; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * JDBC API: Statement */ public class JDBCDemo4 { @Test public void testDML() throws SQLException { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///schoolinfo"; String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义SQL语句 // String sql = "update yuangong set salary = 3000 where id = 8005"; //1.更改数据 String sql ="create database db2"; //2.创建新的数据库 //4.获取执行sql的对象Statement Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql); //1.受影响的行数,即执行DML的返回值, 输出:>1(成功),0(失败) //6.处理结果 System.out.println(count); if(count > 0){ System.out.println("修改成功~"); System.out.println("修改成功~"); }else{ System.out.println("修改失败~"); } //7.释放资源 stmt.close(); conn.close(); //因为先开connection后开statement,所以先释放statement } }删除数据库: //5.执行sql int count = stmt.executeUpdate(sql); //1.受影响的行数,即执行DML的返回值, 输出:>1(成功),0(失败) /* 2.执行DDL语句,执行成功后返回不一定大于0.如:删除数据库,所以不能用count来判断是否成功 */ package com.shujuku.jdbc.api4; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * JDBC API: Statement */ public class JDBCDemo4 { @Test public void testDML() throws SQLException { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///schoolinfo"; String username = "root"; String password = "*******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义SQL语句 // String sql = "select * form yuangong"; // String sql = "update yuangong set salary = 3000 where id = 8005"; //1.更改数据 // String sql ="create database db2"; //2.创建新的数据库 String sql = "drop database db2"; //3.删除数据库 //4.获取执行sql的对象Statement Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql); //1.受影响的行数,即执行DML的返回值, 输出:>1(成功),0(失败) /* 2.执行DDL语句,执行成功后返回不一定大于0.如:删除数据库,所以不能用count来判断是否成功 */ //6.处理结果 System.out.println(count); // if(count > 0){ // System.out.println("修改成功~"); // System.out.println("修改成功~"); // }else{ // System.out.println("修改失败~"); // } //7.释放资源 stmt.close(); conn.close(); //因为先开connection后开statement,所以先释放statement } } 2.4 ResultSet作用封装了DQL查询语句的结果 ResultSet stmt.executeQuery(sql) : 执行DQL语句,返回ResultSet对象(对数据的查询操作) 获取查询结果 Boolean next() : (1)将光标从当前位置向前移一行(2)判断当前行是否有效行 返回值 true :有效行,当前行有数据 false :无效行,当前行没有数据 xxx getXxx(参数) :获取数据 xxx :是数据类型;如:intgetint(参数) ;String getString(参数) 返回列的对应的类型 参数:(选择行) int :列的编号,从1开始 String :列的名称
使用步骤:代码用循环 1.游标向下移动一行,并判断该行是否有数据:next() 2.获取数据:getXxx(参数) //循环判断游标是否是最后一行末尾 while(rs.next()){ //获取数据 rs.getXxx(参数) } 处理结果中有两种方法 package com.shujuku.jdbc.api5; import com.shujuku.pojo.Account; import org.junit.Test; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * JDBC API: Result */ public class JDBCDemo5 { @Test public void testResult() throws SQLException { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///schoolinfo"; String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义sql String sql = "select *from yuangong"; //4.获取statement对象 Statement stmt = conn.createStatement(); //5.执行sql ResultSet rs = stmt.executeQuery(sql); //6.处理结果,遍历rs中的所有数据 //6.1游标向下移动一行,并判断该行是否有数据 /** *1.第一种方法 */ // while (rs.next()){ // int id = rs.getInt(1); // String name = rs.getString(2); // double money =rs.getDouble(6); // // System.out.println(id); // System.out.println(name); // System.out.println(money); // // System.out.println("--------------"); // } /** * 2.第二种方法:重载 */ while (rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); double money =rs.getDouble("salary"); System.out.println(id); System.out.println(name); System.out.println(money); System.out.println("--------------"); } //释放资源 rs.close(); stmt.close(); conn.close(); }案例: /** * 查询yuangong表数据,封装为Account对象中,并且存储到ArrayList集合中 * 1.定义实体类 * 2.查询数据,封装到Account对象中 * 3.存储到ArrayList集合中 * @throws SQLException */ @Test public void testResult2() throws SQLException { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///schoolinfo"; String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //3.定义sql String sql = "select *from yuangong"; //4.获取statement对象 Statement stmt = conn.createStatement(); //5.执行sql ResultSet rs = stmt.executeQuery(sql); //创建集合 List list = new ArrayList(); /** * 2.重载 */ while (rs.next()){ //每查询一个数据都要创建一个对象 Account account = new Account(); int id = rs.getInt("id"); String name = rs.getString("name"); double money =rs.getDouble("salary"); //赋值 account.setId(id); account.setName(name); account.setMoney(money); //存入集合 list.add(account); } System.out.println(list); //释放资源 rs.close(); stmt.close(); conn.close(); } }需要新建一个Account的实体类 public class Account { private int id; private String name; private double money; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } }结果 2.5 PreparedStatement作用2.5.1 预编译SQL语句并行执行:预防SQL注入问题 SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。 SQL注入: public class JDBCDemo6 { /** *用户注入 */ @Test public void testLogin_Inject() throws SQLException { //2.获取链接 //简写 String url = "jdbc:mysql:///studentdb"; String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //接收用户输入,用户名和密码 String name = "adfag"; String pwd = "' or '1' = '1"; //注入成功 String sql = "select * from admin where username = '"+name+"' and password = '"+pwd+"' "; //获取stmt对象 Statement stmt = conn.createStatement(); //执行sql ResultSet rs = stmt.executeQuery(sql); //判断是否成功 if(rs.next()){ System.out.println("登录成功"); }else { System.out.println("登录失败"); } //释放资源 rs.close(); stmt.close(); conn.close(); } }在SQL语句中显示:先执行 username= 'afadhfh' and password = '' 然后就执行or '1'='1' 最后结果是true。 2.5.2 解决 (1)获取PreparedStatement对象 //SQL语句中的参数值,使用?占位符替代 String sql = “select * from user where username = ? andpassword = ?”;
//通过Connection对象获取,并传入对应的sql语句 PreparedStatement pstmt = conn.preparedStatement(sql); (2)设置参数 preparedStatement对象:setXxx(参数1,参数2):给?赋值 Xxx:数据类型;如:setInt(参数1,参数2) 参数: 参数1:?的位置编号,从1开始 参数2:?的值 (3)执行SQL executeUpdate(); / executeQuery(); :不需要再传送sql语句 原理:对传入的字符串中的敏感字符串进行转义,' or '1' = '1 à \' or \'1\' = \'1 开启PreparedStatement的预编译功能:(在url中) useServerPrepStmts=true String url = "jdbc:mysql:///studentdb?useServerPrepStmts=true"; //useServerPrepStmts=true开启预编译具体实现 /** * PreparedStatement:原理 * @throws SQLException */ @Test public void testPreparedStatement2() throws SQLException { //1.注册驱动 /** * 用"com.mysql.cj.jdbc.Driver" * "com.mysql.jdbc.Driver"已经被弃用 */ //Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取链接 //简写 String url = "jdbc:mysql:///studentdb?useServerPrepStmts=true"; //开PreparedStatement的预编译功能 String username = "root"; String password = "******"; Connection conn = DriverManager.getConnection(url, username, password); //接收用户输入,用户名和密码 String name = "user"; String pwd = "' or '1' = '1"; //定义SQL String sql = "select * from admin where username = ? and password = ?"; //获取pstmt对象 PreparedStatement pstmt = conn.prepareStatement(sql); //设置?值 pstmt.setString(1,name); pstmt.setString(2,pwd); //执行sql ResultSet rs = pstmt.executeQuery(); //判断是否成功 if(rs.next()){ System.out.println("登录成功"); }else { System.out.println("登录失败"); } //释放资源 rs.close(); pstmt.close(); conn.close(); } 3. 数据库连接池标准接口:DataSource (都要实现这个接口) 功能:获取连接 Connection getConnection() 常见的数据库连接池 DBCP C3P0 Druid Druid(德鲁伊) 阿里巴巴开源数据库连接池项目 功能强大,性能优秀,用得较多。 Druid使用步骤 (1)导入包:druid-1.1.12.jar (2)定义配置文件 (3)加载配置文件 (4)获取数据库连接池对象 (5)获取连接 打印出连接对象; 具体实现 (1)导入包:druid-1.1.12.jar (2)定义配置文件 driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql:///text?useServerPrepStmts=true username=root password=****** # 初始化连接数量 initialSize=5 # 最大连接数 maxActive=10 # 最大等待时间 maxWait=3000使用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")); //写src/druid.properties会出现路径问题:找不到 //4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5.获取数据库连接Connection Connection connection = dataSource.getConnection(); System.out.println(connection); /* 复制路径:复制到输出的路径的没有显示的路径,如下面显示到:jdbc,所以从jdbc_demo开始写 user.dir;是项目列表第一个路径 */ // System.out.println(System.getProperty("user.dir")); //获取当前路径:D:\c语言\java\学习项目\jdbc } }注:System.out.println(System.getProperty("user.dir")); 这个是获取当前路径,在写路径时要从输出的最后的文件夹下一个目录开始 结果: 4. 练习:查询:查询所有数据 添加:添加品牌 修改:根据id修改 删除:根据id删除
4.1 准备环境 数据库表tb_brand 实体类:Brand 测试用例: 数据库:createTABLE tb_brand( id intPRIMARY KEY auto_increment COMMENT 'id主键', brand_nameVARCHAR(20) COMMENT '品牌名称', compay_nameVARCHAR(20) COMMENT '企业名称', orderedint COMMENT '排序字段', descriptionVARCHAR(100) COMMENT '描述信息', statusint COMMENT '状态:0:禁用,1:启用' );
数据: insertinto tb_brand (brand_name,compay_name,ordered,description,status) values ('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0), ('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1), ('小米','小米技术有限公司',50,'are you ok',1); SELECT * from tb_brand; 可以将相同的符号、英文等同时替换掉其他符号等,快捷键:选中要替换的按Ctrl+r,上面的是原来的,下面是要替换的,最后点Replace All 同时编辑每一行(整列的编辑)的代码快捷键:Alt+鼠标左键 然后选中要编辑的区域 格式化代码(对应上面的分号回到末尾):Ctrl+Alt+l 在pojo包下实体类 Brand /** * 品牌 * 类型和名称 */ public class Brand { //id 主键 private Integer id; // 品牌名称 private String brandName; // 企业名称 private String compayName; // 排序字段 private Integer ordered; // 描述信息 private String description; //状态 private Integer status; // Integer包装类型,默认值为null。 int有默认值,status没有给值 默认0,status = 0 是有含义,对业务产生影响 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 getCompayName() { return compayName; } public void setCompayName(String compayName) { this.compayName = compayName; } 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; } @Override public String toString() { return "Brand{" + "id=" + id + ", brandName='" + brandName + '\'' + ", compayName='" + compayName + '\'' + ", ordered=" + ordered + ", description='" + description + '\'' + ", status=" + status + '}'; } } 4.2 查询所有获取Connection 定义SQL:select * from tb_brand; 获取PreparedStatement对象 设置参数:不需要 执行SQL 处理结果:List (有很多数据,封装Brand对象,封装成list集合) 释放资源 /** * 查询所有 * 1. SQL:select * from tb_brand; * 2. 设置参数:不需要 * 3. 处理结果:List */ @Test public void testSelectAll() throws Exception { //1.获取Connection //3.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); //4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5.获取数据库连接Connection Connection conn = dataSource.getConnection(); //System.out.println(connection); //2.定义SQL String sql = "select * from tb_brand;"; //获取pstmt对象 PreparedStatement pstmt = conn.prepareStatement(sql); //4.设置参数 //5.执行SQL ResultSet rs = pstmt.executeQuery(); Brand brand = null; //节约占空间,复用该变量 List brands = new ArrayList(); //6.处理结果 while (rs.next()){ //获取数据 int id = rs.getInt("id"); String brandName = rs.getString("brand_name"); String companyName = rs.getString("compay_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.setCompayName(companyName); brand.setOrdered(ordered); brand.setDescription(description); brand.setStatus(status); //装载集合 brands.add(brand); //调用brands,调用brands中的add,把创建的brand对象放进的brands } System.out.println(brands); //7.释放资源 rs.close(); pstmt.close(); conn.close(); // System.out.println(System.getProperty("user.dir")); } 4.3 添加数据1.编写SQL:insert intotb_brand(brand_name,company_name, ordered,description, status) values(?,?,?,?,?); 2. 参数:需要,除了id之外的所有参数信息 3. 结果:boolean (true/false) /** * 添加 * 1. SQL:insert into tb_brand(brand_name,company_name, ordered,description, status) * values(?,?,?,?,?); * 2. 参数:需要,除了id之外的所有参数信息 * 3. 结果:boolean (true/false) */ @Test public void testAdd() throws Exception { //接收页面提交的参数,(定义一些成员变量来模拟) String brandName = "香飘飘"; String compayName = "香飘飘"; int ordered = 1; String description = "绕地球一圈"; int status = 1; //1.获取Connection //3.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); //4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5.获取数据库连接Connection Connection conn = dataSource.getConnection(); //System.out.println(connection); //2.定义SQL String sql = "insert into tb_brand(brand_name,compay_name,ordered ,description ,status) value (?,?,?,?,?);"; //不用id //获取pstmt对象 PreparedStatement pstmt = conn.prepareStatement(sql); //4.设置参数(对问号设置参数) pstmt.setString(1,brandName); pstmt.setString(2,compayName); pstmt.setInt(3, ordered); pstmt.setString(4,description); pstmt.setInt(5, status); //5.执行SQL int count = pstmt.executeUpdate(); //影响的行数 //6.处理结果,输出boolean类型的值 System.out.println(count > 0); //7.释放资源 pstmt.close(); conn.close(); } 4.4 修改数据1. SQL: updatetb_brand setbrand_name = ?, company_name=?, ordered =?, description= ?, status =? where id= ? 2. 参数:需要,Brand对象所有数据 3. 结果:boolean /** * 修改 * 1. SQL: update tb_brand * set brand_name = ?, * company_name= ?, * ordered = ?, * description = ?, * status = ? * where id = ? * 2. 参数:需要,Brand对象所有数据 * 3. 结果:boolean */ @Test public void testUpdate() throws Exception { //接收页面提交的参数,(定义一些成员变量来模拟) String brandName = "香飘飘"; String compayName = "香飘飘"; int ordered = 1000; String description = "绕地球三圈"; int status = 1; int id = 4; //1.获取Connection //3.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); //4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5.获取数据库连接Connection Connection conn = dataSource.getConnection(); //System.out.println(connection); //2.定义SQL String sql = "update tb_brand\n" + "set brand_name = ?,\n" + "compay_name= ?,\n" + "ordered = ?,\n" + "description = ?,\n" + "status = ?\n" + "where id = ?\n"; //获取pstmt对象 PreparedStatement pstmt = conn.prepareStatement(sql); //4.设置参数(对问号设置参数) pstmt.setString(1,brandName); pstmt.setString(2,compayName); pstmt.setInt(3, ordered); pstmt.setString(4,description); pstmt.setInt(5, status); pstmt.setInt(6,id); //5.执行SQL int count = pstmt.executeUpdate(); //影响的行数 //6.处理结果,输出boolean类型的值 System.out.println(count > 0); //7.释放资源 pstmt.close(); conn.close(); } 4.5 删除数据根据id删除 1. SQL: deletefrom tb_brand where id = ? 2. 参数:需要,id 3. 结果:boolean /** * 删除(根据id删除) * 1. SQL: delete 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("src/druid.properties")); //4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5.获取数据库连接Connection Connection conn = dataSource.getConnection(); //System.out.println(connection); //2.定义SQL String sql = "delete from tb_brand where id = ?;"; //获取pstmt对象 PreparedStatement pstmt = conn.prepareStatement(sql); //4.设置参数(对问号设置参数) pstmt.setInt(1,id); //5.执行SQL int count = pstmt.executeUpdate(); //影响的行数 //6.处理结果,输出boolean类型的值 System.out.println(count > 0); //7.释放资源 pstmt.close(); conn.close(); }感谢您的阅读! dc2d0282-7c39-450e-a6b3-1022ec0f2ec0 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |