dbUtils 原理
// Jdbc 的增,删, 改流程类似,只是参数不同, 因此可以向上抽取
public class Demo{
// Jdbc 的增加
public void addStu(Stu stu){
Connection con = null;
PreparedStatement pstmt = null;
try{
con = JdbcUtils.getConnection();
String sql = "INSERT INTO t_stu VALUES(?,?,?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1,stu.getSid());
pstmt.setString(2,stu.getSname());
pstmt.setInt(3,stu.getAge());
pstmt.setString(4,stu.getGender());
pstmt.executeUpdate();
} catch(Exception e){
// 处理异常
} finally{
// 关闭资源
}
}
// jdbc 修改方法
public void UpdateStu(Stu stu){
Connection con = null;
PreparedStatement pstmt = null;
try{
con = JdbcUtils.getConnection();
// 只需要 sql 语句修改
String sql = "UPDATE t_stu SET sname=?,age=?,gender=? WHERE sid=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(4,stu.getSid());
pstmt.setString(1,stu.getSname());
pstmt.setInt(2,stu.getAge());
pstmt.setString(3,stu.getGender());
pstmt.executeUpdate();
} catch(Exception e){
// 处理异常
} finally{
// 关闭资源
}
}
// jdbc 删除方法
public void UpdateStu(int sid){
Connection con = null;
PreparedStatement pstmt = null;
try{
con = JdbcUtils.getConnection();
// 只需要 sql 语句修改
String sql = "DELETE FROM t_stu WHERE sid=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1,stu.getSid());
pstmt.executeUpdate();
} catch(Exception e){
// 处理异常
} finally{
// 关闭资源
}
}
// jdbc 的查询方法 (查询一个)
public Stu load(int sid){
Connection con = null;
PreparedStatement pstmt = null;
ResultSetHandler rs = null;
try{
con = JdbcUtils.getConnection();
// 只需要 sql 语句修改
String sql = "SELECT * FROM t_stu WHERE sid=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1,stu.getSid());
// 发送 sql 语句需要变化
rs = pstmt.executeQuery();
if(!rs.next()) return null;
// 需要把 rs 转换成 Stu 对象
Stu stu = new Stu();
stu.setSid(rs.getInt("sid"));
stu.setSname(rs.getString("sname"));
stu.setAge(rs.getInt("age"));
stu.setGender(rs.getString("gender"));
return stu;
} catch(Exception e){
// 处理异常
} finally{
// 关闭资源
}
}
}
// 升级
public class QR<T>{
private DataSource dataSource;
// 构造函数
public QR(DataSource dataSource){
super();
this.dataSource = dataSource;
}
// 无参构造函数
public QR(){
super();
}
// 可以实现数据库的 insert,update, delete
public int update(String sql, Object... params){
Connection con = null;
PreparedStatement pstmt = null;
try{
con = dataSource.getConnection();
pstmt = con.prepareStatement(sql);
initParams(pstmt, params); // 设置参数
// 返回影响的行数
return pstmt.executeUpdate();
} catch(Exception e){
throw new RuntimeException(e);
} finally{
// 关闭资源
try{
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch(SQLException e){
throw new RuntimeException(e);
}
}
}
// 私有方法, 专门给 sql 语句的参数赋值
private void initParams(PreparedStatement pstmt, Object... params)
throws SQLException{
// 循环遍历赋值
for(int i=0; i<params.length; i++){
pstmt.setObject(i+1, params[i]);
}
}
// 查询方法
public T query(String sql, RsHandler rh, Object... params){
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
con = dataSource.getConnection();
pstmt = con.prepareStatement(sql);
initParams(pstmt,params);
rs = pstmt.executeQuery();
return (T)rh.handle(rs);
}catch(Exception e){
throw new RuntimeException(e);
} finally{
try{
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch(SQLException e){
throw new RuntimeException(e);
}
}
}
}
// 接口, 将 ResultSet 转换成 JavaBean 实体
interface RsHandler<T>{
public T handle(ResultSet rs) throws SQLException;
}
// 使用上述 QR 类操作数据库
public class Demo2{
public void fun(){
Stu stu = new Stu(1001,"lisi",22,"male");
addStu(stu);
}
// 添加操作
public void addStu(Stu stu){
// 创建对象时, 给出连接池
QR qr = new QR(JdbcUtils.getDataSource());
// 给出 sql 模板
String sql = "INSERT INTO t_stu VALUES(?,?,?,?)";
// 给出参数
Object[] params = {stu.getSid(),stu.getSname(),stu.getAge(),stu.getGender()};
// 调用 QR 类的 update 方法
qr.update(sql,params);
}
// 查询操作
public Stu load(int sid){
QR qr = new QR(JdbcUtils.getDataSource());
String sql = "SELECT * FROM WHERE sid=?";
Object[] params = {sid};
// 实现 RsHandler 接口,
// 可以将 ResultSet 结果集转换为 Stu 对象
RsHandler<Stu> rh = new RsHandler<Stu>(){
// 实现方法
public Stu handle(ResultSet rs) throws SQLException {
if(!rs.next()) return null;
Stu stu = new Stu();
stu.setSid(rs.getInt("sid"));
stu.setSname(rs.getString("sname"));
stu.setAge(rs.getInt("age"));
stu.getGender(rs.getString("gender"));
return stu;
}
};
qr.query(sql,rh,params);
}
}
DBUtils 工具类的使用
public class Demo(){
// 数据库添加数据
public void fun1() throws SQLException{
// 给出连接池参数
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
// 给出 sql 模板
String sql = "INSERT INTO t_stu VALUES(?,?,?,?)";
// 给出参数的值
Object[] params = {1003,"zhaoliu",24,"male"};
qr.update(sql,params);
}
// 数据库查询
public void fun2() throws SQLException{
// 给出连接参数
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
// 给出 sql 模板
String sql ="SELECT * FROM t_stu WHERE sid=?";
// 传入参数
Object[] params = {1003};
// 执行query() 方法, 需要给出结果集处理器, 即 ResultSetHandler 的实现类.
// ResultHandler 实现类也就是将 ResultSet 结果集转换为 Stu 对象
Stu stu = qr.query(sql,new BeanHandler<Stu>(Stu.class),params);
System.out.println(stu);
}
}
参考资料: