// 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);
}
}

参考资料:

dbUtils 原理的更多相关文章

  1. DbUtils要点小结

    一. DbUtils核心API 1. QueryRunner update方法 query方法 2. 各种Handler都实现ResultSetHandler接口 beanhandler beanli ...

  2. python数据库连接池设计

    一.背景: 传统访问资源,一般分为一下几个步骤: 1.实例数据驱动对象与链接资源.2.实例操作资源游标.3.获取资源.4.关闭链接资源. 根据以上步骤,我们可以很简单使用这个原始方法来访问资源为我们业 ...

  3. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  4. 模拟实现 DBUtils 工具 , 技术原理浅析

    申明:本文采用自己 C3P0 连接池工具进行测试 自定义的 JDBCUtils 可以获取 Connection: package com.test.utils; import java.sql.Con ...

  5. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  6. Atitit.木马病毒websql的原理跟个设计

    Atitit.木马病毒websql的原理跟个设计 1. Keyword Wsql { var sql="select "+p.txt+" as t,"+p.v+ ...

  7. 内存缓存LruCache实现原理

    自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils.DbUtils.ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的.最近决定研究一下xUtils的 ...

  8. 分享动态拼接Expression表达式组件及原理

    前言 LINQ大家都知道,用起来也还不错,但有一个问题,当你用Linq进行搜索的时候,你是这样写的 var query = from user in db.Set<User>()      ...

  9. java web简易网上书店项目系列,使用MVC模式(servlet+jstl+dbutils),开篇

    一. 针对很多java web初学者入门困难的问题,笔者利用一个小型web项目,一步一步的展示java web开发方法,每一个章节引入一些java web开发的重点知识,让同学们可以将java web ...

随机推荐

  1. 页面找不到js方法的原因,关于EasyUI

    有时EasyUI中datagride写法不正确,会导致无法加载页面上其他的js方法.datagride中的逗号是一个也不能多.一定要注意: 例如以下代码中标红的逗号就会导致后边的js不能正常加载. c ...

  2. Windows外壳名字空间的浏览

    Windows95/98对Dos/Win3.x作了许多重大改进,在文件系统方面,它除了采用长文件名替代Dos中的8.3文件名以外,引入外壳名字空间(Shell Name Space)来代Dos文件系统 ...

  3. HDU - 1816 Get Luffy Out *(二分 + 2-SAT)

    题目大意:有N串钥匙,M对锁.每串钥匙仅仅能选择当中一把.怎样选择,才干使开的锁达到最大(锁仅仅能按顺序一对一对开.仅仅要开了当中一个锁就可以) 解题思路:这题跟HDU - 3715 Go Deepe ...

  4. hdu 4597 Play Game(记忆化搜索)

    题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp ...

  5. 142. O(1) Check Power of 2【easy】

    142. O(1) Check Power of 2[easy] Using O(1) time to check whether an integer n is a power of 2. Have ...

  6. shell脚本之练习题

    设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30. i=1 groupadd class1 while [ $i -l ...

  7. UseParNewGC和UseParallelGC的区别

    1.UseParNewGC:并发串行收集器,它是工作在新生代的垃圾收集器,它只是将串行收集器多线程化,除了这个并没有太多创新之处,而且它们共用了相当多的代码.它与串行收集器一样,也是独占式收集器,在收 ...

  8. samba实现文件共享

    很多时候,做嵌入式开发,都是在windows上安装虚拟,在虚拟机中安装Linux操作系统.这个时候,我们经常需要Linux操作系统下有一个目录能在windows下自由访问.要想实现这个功能我们只需要在 ...

  9. golang解析xml

    解析xml标签或者html标签,都是xml文档格式.要是返回的html标签,可以用第三方依赖库goquery来解析. 下面说下,解析xml标签的格式.直接上代码,代码如下: package main ...

  10. Div+CSS布局入门教程

    http://www.blueidea.com/tech/site/2006/3574.asp ———————————————————————————————————————————————————— ...