前两章我们写了一个 DBTools 工具类,可以进行简单的数据库操作,但是有很大的局限性,今天就来改善一下这个类,学习一个新的对象 PreparedStatement
INSERT INTO store.user (account,password,role) VALUES ('admin','123',1)
我直接把字段的值直接写在了sql语句里,不过通常情况下,(‘admin’,’123’,1) 这里面都是一些变量,为了方便,我们会建立一个实体类,来对应相应的数据库表,现在新建一个 user 实体类
package com.jiaoshou.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!!
下一章我们会对我们的查询方法进行升级