对数据库的更新操作 数据库的更新包括:INSERT UPDATE DELETE 执行数据库更新操作需要用到 Statement类,该类通过Connection的createStatement()方法来获得,写好sql语句然后调用Statement对象的executeUpdate(sql) 方法来实现更新操作,很简单。 比如说我想在user表里加入一条记录,可以分为一下几个步骤 获取数据库连接…
JAVA:JDBC入门教程(三) PreparedStatement的使用
前两章我们写了一个 DBTools 工具类,可以进行简单的数据库操作,但是有很大的局限性,今天就来改善一下这个类,学习一个新的对象 PreparedStatement
- 为什么要使用PreparedStatement
前面我们建立了一个store数据库,并且建立了一个user数据表,表里包含字段 id ,account ,password ,role。而且还向里面加入了一条数据 sql 语句是这样写的INSERT INTO store.user (account,password,role) VALUES ('admin','123',1)
我直接把字段的值直接写在了sql语句里,不过通常情况下,(‘admin’,’123’,1) 这里面都是一些变量,为了方便,我们会建立一个实体类,来对应相应的数据库表,现在新建一个 user 实体类
package com.ikeepstudying.domain; public class User { //用户的ID private int id; //用户名 private String account; //密码 private String password; //用户角色 private int role; //无参构造 public User() { super(); } //有参构造 public User(int id, String account, String password, int role) { super(); this.id = id; this.account = account; this.password = password; this.role = role; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } }
假设现在又一个 user 实体,里面封装了我们需要的数据,我们要把这个 user 插入数据库中,sql 语句就变成了
"INSERT INTO store.user (account,password,role) VALUES (" + user.getAccount() + ",'" + user.getPassword() + "'," + user.getRole() + ")";
由于我们要在 sql 语句中加入变量,所以我们不得不拼接字符串,这种方式麻烦,效率低,容易出错,安全性不高,PreparedStatement 对象就可以解决以上的问题。
2. 如何使用 PreparedStatement
使用 PreparedStatement 对象操作数据库可以分为一下几步
- 获取数据库连接
- 写sql语句,设置占位符,用 ?代替变量
- 创建PreparedStatement对象
- 为占位符进行赋值
- 执行操作
- 释放资源
下面我们就把上面提到的那个 user 使用PreparedStatement对象插入数据库
@Test public void insertUsers() throws SQLException { User user = new User(2,"master","123",2); //获取数据库连接 Connection conn = DBTools.getConnection(); //写sql语句,设置占位符,用 ?代替变量 String sql = "INSERT INTO store.user (account,password,role) VALUES (?,?,?)"; //创建 PreparedStatement 对象 PreparedStatement preparedStatement = conn.prepareStatement(sql); //为占位符进行赋值 preparedStatement.setString(1,user.getAccount());//第一个参数是第几个占位符,第二个参数是为这个占位符进行赋值 preparedStatement.setString(2,user.getPassword()); preparedStatement.setInt(3,user.getRole()); //执行操作 preparedStatement.executeUpdate(); //释放资源 DBTools.release(null, null, conn); }
测试一下这个类。其他的delete update 方法也一样,我们先前写了一个通用的更新方法 update(String sql),很明显我们不能只把这里带有占位符的 sql 语句传过去,还需要占位符对应的值,所以要对前面的那个方法进行改进。这样的话 update 方法就需要两个形式参数,一个是带有占位符的 sql 语句,另一个是占位符 对应的值。不过不同的 sql 语句占位符的个数也是不同的,所以我们要用到可变参数 Object…args
方法改进如下:
//通用的更新方法 public static void update(String sql,Object...args){ Connection conn = null; PreparedStatement preparedStatement = null; try { //获取数据库连接 conn = DBTools.getConnection(); //创建PreparedStatement对象 preparedStatement = conn.prepareStatement(sql); //通过循环来给sql的占位符赋值 for(int i=0;i<=args.length-1;i++){ preparedStatement.setObject(i+1, args[i]); } //执行更新操作 preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally{ release(null,null,conn); } }
测试一下这个通用方法,改一下 用户名为 master 的密码
@Test public void updatePasswd() { User user = new User(); user.setAccount("master"); user.setPassword("jiaoshou"); user.setRole(1); String sql = "UPDATE store.user SET password=?, role=? WHERE account=?"; DBTools.update(sql, user.getPassword(),user.getRole(),user.getAccount()); }
测试一下,OK!!
JAVA: JDBC入门教程(二) 通过JDBC进行简单的增删改查
JAVA:JDBC入门教程(三) PreparedStatement的使用
本文:JAVA:JDBC入门教程(三) PreparedStatement的使用