3. DBUtils 组件
3.1 简介
自定义的jdbc持久层框架,功能不是特别强大! 学习优秀的jdbc组件,Dbutils组件,此组件是对jdbc连接数据的轻量级封装!
l commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
l 项目中使用DBUtils组件,需要引入:commons-dbutils-1.2.jar
3.2 API介绍
|--DbUtils 组件提供的核心类:主要提供了关闭连接、加载驱动相关方法
|--QueryRunner 组件(最) 核心处理类封装了jdbc的基本操作:查询、更新、批处理!
//1.更新方法
//2.批处理方法
//3.查询相关方法
/****************更新方法***********************/
int update(Stringsql) 直接更新
int update(Stringsql, Object param) 带一个条件更新
int update(Stringsql, Object[] params) 带多个条件更新
int[] batch (String sql) 批处理
int update(Connectioncon, String sql)
int update(Connectioncon, Object param)
int update(Connectioncon, Object[] params)
|-- ResultSetHandler 结果集处理器
/****************查询方法***********************/
|-- ArrayHandler 查询返回结果集的第一行记录,最终返回的是一个Object[]
|-- ArrayListHandler 获取所有的结果,返回List<Object[]>
|-- BeanHandler 把查询结果的第一行,封装为指定的javabean对象
|-- BeanListHandler 把结果集的每一行封装为指定的javabean对象,再把对象添加到ArrayList集合中
|-- ColumnListHandler 把查询所有记录的指定的列,添加的集合中; 如果没有指定列,把第一列的值都添加到集合中
|-- KeyedHandler 查询返回map集合,把指定的列作为key,把每一条记录封装为map集合作为value,最终结果Map<指定的列作为key,Map<列名称,列值>>map;
|-- MapHandler, 把结果封装为map
|-- MapListHandler 把结果每一行封装为map,再把map添加到list集合
|-- ScalarHandler 返回结果集的第一行第一列, 聚合函数
3.3 DBUtilsQuery
/** * 查询 * @author Administrator * */ public class DBUtilsQuery {
// 创建数据源 static DataSource ds ; static { ds = new ComboPooledDataSource(); }
// 1. ArrayHandler: 查询返回结果集的第一行记录,最终返回的是一个Object[] @Test public void queryOne() { String sql = " SELECT * FROM admin;";
// 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try { // 执行查询 Object[] obj = (Object[]) runner.query(sql, new ArrayHandler());
System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } }
// 2. ArrayListHandler: 获取所有的结果,返回List<Object[]> @Test public void queryAll() { String sql = " SELECT * FROM admin;";
// 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try { // 执行查询 List<Object[]> obj = (List<Object[]>) runner.query(sql, new ArrayListHandler());
System.out.println(obj.get(0)[1]); } catch (SQLException e) { e.printStackTrace(); } }
// 3. BeanHandler:把查询结果的第一行,封装为指定的javabean对象 @Test public void getOneBean() { String sql = " SELECT * FROM admin;";
// 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try {
Object obj = runner.query(sql, new BeanHandler(OrderMeal.class));
System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } }
// 4. BeanListHandler: 把结果集的每一行封装为指定的javabean对象,再把对象添加到ArrayList集合中 @Test public void getAllBean() { String sql = " SELECT * FROM admin;"; // 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try { Object obj = runner.query(sql, new BeanListHandler(OrderMeal.class)); System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } }
// 5. ColumnListHandler 把查询所有记录的指定的列,添加的集合中; 如果没有指定列,把第一列的值都添加到集合中 @Test public void getColumn() { String sql = " SELECT * FROM admin;"; // 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try { Object obj = runner.query(sql, new ColumnListHandler("user")); System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } }
// 6. KeyedHandler: 查询返回map集合,把指定的列作为key,把每一条记录封装为map集合作为value,最终结果Map<指定的列作为key,Map<列名称,列值>> map; @Test public void getKeyed() { String sql = " SELECT * FROM admin;"; // 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try { Map<Integer,Map<String,String>> obj = (Map<Integer, Map<String, String>>) runner.query(sql, new KeyedHandler("user"));
System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } }
// 9. ScalarHandler: 返回查询结果的第一行的第一列 @Test public void getOneOne() { String sql = " SELECT * FROM admin;"; // 创建核心处理类 QueryRunner runner = new QueryRunner(ds); try { Object obj = runner.query(sql, new ScalarHandler("meal"));
System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } }
} |
3.4 DBUtilsUpdate
/** * 1. 更新 * 2. 批处理 * @author Administrator * */ public class DBUtilsUpdate {
// 创建数据源 static DataSource ds ; static { ds = new ComboPooledDataSource(); }
// 1. 删除: (插入、修改、删除), 指定连接对象操作 @Test public void update() { String sql = "DELETE FROM order_meal WHERE id=1"; // 创建DBUtils核心处理类对象 QueryRunner query = new QueryRunner();
try { // 使用DBUtils类加载驱动 DbUtils.loadDriver("com.mysql.jdbc.Driver"); // 获取连接 Connection con = DriverManager.getConnection("jdbc:mysql:///day17", "root", "root");
// 删除操作 query.update(con,sql);
// 关闭连接 DbUtils.close(con); } catch (SQLException e) { e.printStackTrace(); } }
// 1. 删除, 创建QueryRunner对象的时候指定数据源,进行jdbc操作的时候,可以不指定连接对象(推荐) @Test public void update2() { String sql = "DELETE FROM order_meal WHERE id=2"; // 创建DBUtils核心处理类对象 QueryRunner query = new QueryRunner(ds);
try { // 删除操作 query.update(sql); } catch (SQLException e) { e.printStackTrace(); } } @Test public void update3() { String sql = "DELETE FROM order_meal WHERE id=? or id=?"; // 创建DBUtils核心处理类对象 QueryRunner query = new QueryRunner(ds);
try { Object[] paramValue = {4,5}; // 删除操作 query.update(sql,paramValue); // 关闭 //DbUtils.closeQuietly(null, null, null); } catch (SQLException e) { e.printStackTrace(); } }
@Test //2. 批处理 - 删除 public void delBatch() { String sql = "DELETE FROM order_meal WHERE id=? ";
// 创建DBUtils核心处理类对象 QueryRunner runner = new QueryRunner(ds); // 删除id为 9876 Object[][] paramValues = {{9},{8},{7}}; try { runner.batch(sql, paramValues); } catch (SQLException e) { e.printStackTrace(); } } @Test //2. 批处理 - 增加 public void addBatch() { String sql = "INSERT INTO order_meal(meal,order_date,sendman,address) VALUES(?,?,?,?)";
// 创建DBUtils核心处理类对象 QueryRunner runner = new QueryRunner(ds); // 删除id为 9876 Object[][] paramValues = {{"土豆丝","1999-09-09","老李","天河区"},{"土豆丝2","2011-09-09","老李","天河区"}}; try { runner.batch(sql, paramValues); } catch (SQLException e) { e.printStackTrace(); } } } |
使用DBUtils组件,写一个jdbc操作的公用类,实现对jdbc的公用操作!
优化之前的项目:订餐列表显示、删除!
使用DBUtils组件优化
/** * 使用DBUtils组件优化 * jdbc公用操作,所有的dao都继承此类,调用相关方法完成对jdbc的操作! * @author Administrator * */ public class BaseDao {
//1. 创建数据源 private static DataSource ds = null; // 创建DBUtils核心处理类对象 private static QueryRunner runner; static { // 初始化连接池资源 ds = new ComboPooledDataSource(); runner = new QueryRunner(ds); }
//2. 查询 public Object query(String sql,ResultSetHandler rsh,Object[] paramValues) { // 查询 try { return runner.query(sql, rsh, paramValues); } catch (SQLException e) { throw new RuntimeException(); } } //3. 更新 public int update(String sql,Object[] paramVallues) {
try { return runner.update(sql, paramVallues); } catch (SQLException e) { throw new RuntimeException(); } } //4. 关闭 public void closeAll(Connection con,Statement stmt, ResultSet rs) { DbUtils.closeQuietly(con, stmt, rs); } } |
总结:
1. BeanUtils组件的使用;
案例:请求数据自动填充到javabean中!
2. 获取元数据,实现通过的CURD操作,即自定义一个jdbc持久层框架!
BaseDao.java
缺点:必须要遵守约定,即数据库中字段名称与javabean属性名称一样!
(<propertie name=”id” column=”sid”>_