Apache—DBUtils框架开发

java编程学习有一段时间了,今天突然发现以前比较基础的东西掌握的不牢固了,所以特意回顾下DBUtils架构的数据开发

QueryRunner类

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
•默认的构造方法
•需要一个 javax.sql.DataSource 来作参数的构造方法。
 
QueryRunner类的主要方法
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
 
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
 
public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
 
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
 
ResultSetHandler接口
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。
 
ResultSetHandler 接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
 
ResultSetHandler 接口的实现类
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
 
java实现数据操作底层代码
 

private static ComboPooledDataSource ds;
//线程数据连接管理器
private static ThreadLocal<Connection> map = new ThreadLocal<Connection>();

static{
try{
//使用3cp0数据连接池获取数据资源
ds = new ComboPooledDataSource();
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}

public static Connection getConnection() throws SQLException{
Connection conn = map.get(); //获取到当前线程上绑定的链接
if(conn==null){
conn = ds.getConnection();
map.set(conn); //把链接绑定到当前线程上
}
return conn;
}
//开启事务
public static void startTransaction(){
try{
Connection conn = map.get(); //获取到当前线程上绑定的链接
if(conn==null){
conn = ds.getConnection();
map.set(conn);
}
conn.setAutoCommit(false);
}catch (Exception e) {
throw new RuntimeException(e);
}
}
//提交事务
public static void commitTransaction(){
try{
Connection conn = map.get(); //获取到当前线程上绑定的链接
if(conn!=null){
conn.commit();
}
}catch (Exception e) {
throw new RuntimeException(e);
}
}
//回滚事务
public static void rollbackTransaction(){
try{
Connection conn = map.get(); //获取到当前线程上绑定的链接
if(conn!=null){
conn.rollback();
conn.commit();
}
}catch (Exception e) {
throw new RuntimeException(e);
}
}
//关闭连接
public static void closeConnection(){
try{
Connection conn = map.get(); //获取到当前线程上绑定的链接
if(conn!=null){
try{
conn.close(); //求求大家,千万注意
}finally{
map.remove();//解除当前线程绑定的资源
}
}
}catch (Exception e) {
throw new RuntimeException(e);
}
}

public static DataSource getDataSource(){
return ds;
}

c3p0配置文件

<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
<property name="user">root</property>
<property name="password">root</property>

<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">30</property>
</named-config>

原文地址:https://www.cnblogs.com/huy360/p/4513346.html