06 操作封装
1 泛型方法封装
JDBCUtil反射+线程变量实现数据库连接和事务控制
- 单例化datasource。无需重复创建
- 使用property从配置文件中加载配置
- 创建druid线程池复用连接,提升查询效率。
- 利用线程变量获取连接信息,确保一个线程中的多个方法可以获取同一个connection
1 | package org.example.dao; |
BaseDAO反射+泛型实现查询结果解析
1 | package org.example.dao; |
2 BaseDAO泛型类
典型的BaseDAO的封装过程
- 提供类级别的泛型,在初始化的方法中可以通过this.getClass来确定泛型参数。
1 | package com.atguigu.bookstore.dao; |
使用BaseDAO实例
1 | package com.atguigu.bookstore.dao.impl; |
1 | package com.atguigu.bookstore.dao.impl; |
3 ApachDBUtils
Apache-DBUtils简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用 dbutils 能极大简化 jdbc 编码的工作量,同时也不会影响程序的性能。
API介绍:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
工具类:org.apache.commons.dbutils.DbUtils
主要 API 的使用
DbUtils
DbUtils :提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
- public static void close(…) throws java.sql.SQLException : DbUtils 类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是 NULL,如果不是的话,它们就关闭 Connection、Statement 和 ResultSet。
- public static void closeQuietly(…) : 这一类方法不仅能在Connection、Statement 和 ResultSet 为 NULL 情况下避免关闭,还能隐藏一些在程序中抛出的 SQLEeception。
- public static void commitAndClose(Connection conn)throws SQLException : 用来提交连接的事务,然后关闭连接
- public static void commitAndCloseQuietly(Connection conn) : 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
- public static void rollback(Connection conn)throws SQLException :允许 conn 为 null ,因为方法内部做了判断
- public static void rollbackAndClose(Connection conn)throws SQLException
- rollbackAndCloseQuietly(Connection)
- public static boolean loadDriver(java.lang.String driverClassName) :这一方装载并注册 JDBC 驱动程序,如果成功就返回 true。使用该方法,你不需要捕捉这个异常 ClassNotFoundException。
QueryRunner 类
该类简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner 类提供了两个构造器:
默认的构造器
需要一个 javax.sql.DataSource 来作参数的构造器
QueryRunner 类的主要方法:
更新
public int update(Connection conn, String sql, Object… params) throws SQLException : 用来执行一个更新(插入、更新或删除)操作。
…
插入
public
…
批处理
public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE 语句
public
…
查询
public Object query(Connection conn, String sql, ResultSetHandler rsh,Object… params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
使用测试
1 | // 测试添加 |
ResultSetHandler 接口及实现类
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。
接口的主要实现类:
- ArrayHandler:把结果集中的第一行数据转成对象数组。
- ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到 List 中。
- BeanHandler: 将结果集中的第一行数据封装到一个对应的 JavaBean 实例中。
- BeanListHandler: 将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到 List 里。
- ColumnListHandler:将结果集中某一列的数据存放到 List 中。
- KeyedHandler(name):将结果集中的每一行数据都封装到一个 Map 里,再把这些 Map 再存到一个 map 里,其 Key 为指定的key。
- MapHandler: 将结果集中的第一行数据封装到一个 Map 里,key 是列名,value 就是对应的值。
- MapListHandler: 将结果集中的每一行数据都封装到一个 Map 里,然后再存放到 List
- ScalarHandler: 查询单个值对象
使用测试
1 |
|




