dbUtils工具

来源:互联网 发布:apache编译安装参数 编辑:程序博客网 时间:2024/06/16 07:50

dbUtils工具

问题:dbutils是什么,有什么作用?

它就是一个简单的jdbc封装工具.使用dbutils可以简化操作.要使用dbutils需要导入jar包. 

dbutils核心

1.QueryRunner类    它是用于执行sql语句的类。    1.query 用于执行select     2.update 用于执行update delete insert    3.batch 批处理2.ResultSetHandler接口    用于定义结果集的封装                  它提供九个实现类,可以进行不同的封装。3.DbUtils类    它提供关于关闭资源以及事务rollback,commit操作。-----------------------------------------------------

Dbutlis详解

1.QueryRunner    怎样获取?    1.new QueryRunner()        如果是使用这种构造创建的QueryRunner,它的事务是手动控制.    2.new QueryRunner(DataSource ds);        如果是使用这种构造,它的事务是自动事务,简单说,一条sql一个事务。2.QueryRunner中的三个核心方法        query        update        batch        对于上述三个方法,它们提供很多重载。        如果QueryRunner在创建时,没有传递DataSource参数,那么在使用    query,update,batch方法时,要传递Connection参数        如果QueryRunner在创建时,传递了Dataource参数,好么在使用    query,update,batch方法时,不需要传递Connection参数。    总结:        怎样配套使用:    QueryRunner runner=new QueryRunner();            runner.query(Connection,sql,ResultSetHandler,Object... param);            runner.update(Connection,sql,Object...param);            runner.batch(Connection con,sql,Object[][] objs);    QueryRunner runner=new QueryRunner(DataSource ds);            runner.query(sql,ResultSetHandler,Object... param);            runner.update(sql,Object...param);            runner.batch(sql,Object[][] objs);

自定义dbUtils

核心类如下

MyQueryRunner.javaMyBeanHander.javaMyResultSetHandler.java

重点函数解析

@Overridepublic Object handler(ResultSet rs) {    Object obj = null;    try {        BeanInfo bif = Introspector.getBeanInfo(clazz);        PropertyDescriptor[] pds = bif.getPropertyDescriptors();        while (rs.next()) {            obj = clazz.newInstance();            for (PropertyDescriptor pd : pds) {                String name = pd.getName(); // 获取属性名                Method m = pd.getWriteMethod();                if (m != null) {                    m.invoke(obj, rs.getObject(name));                }            }            System.out.println(obj.toString());        }    } catch (Exception e) {        e.printStackTrace();    }    return obj;}1. BeanInfo bif = Introspector.getBeanInfo(clazz)     获取指定字节码中Bean 信息2. PropertyDescriptor[] pds = bif.getPropertyDescriptors();    获取自定字节码文件中的PropertyDescriptor数据(属性描述器)    PropertyDescriptor 中的常用方法介绍:         Method getReadMethod()   获得应该用于读取属性值的方法。                  Method getWriteMethod()  获得应该用于写入属性值的方法。 、    Method 中常用方法介绍:          TypeVariable<Method>[] getTypeParameters()                 返回 TypeVariable 对象的数组,这些对象描述了由 GenericDeclaration                 对象表示的一般声明按声明顺序来声明的类型变量。          Object invoke(Object obj, Object... args)                 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。  

源码如下:

  1. MyQueryRunner

    package com.uu.dbUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import com.mchange.v2.c3p0.ComboPooledDataSource;/** * 模仿DbUtils中的 QueryRunner *  * 实现对JdbcUtils 的封装 *  *  * @author penghao *  */public class MyQueryRunner {    private ComboPooledDataSource cpds;    public MyQueryRunner() {    }    public MyQueryRunner(ComboPooledDataSource cpds) {        this.cpds = cpds;    }    /**     *      * 更新数据 ,即 插入数据     *      * @param conn     * @param sql     * @param param     * @return     * @throws SQLException     */    public boolean update(Connection conn, String sql, Object... param)            throws SQLException {        PreparedStatement ps = conn.prepareStatement(sql);        for (int i = 0; i < param.length; i++) {            ps.setObject(i + 1, param[i]);        }        return ps.execute();    }    public <T> T query(Connection conn, String sql, MyResultSetHandler<T> msh)            throws SQLException {        Statement st = conn.createStatement();        ResultSet rs = st.executeQuery(sql);        return msh.handler(rs);    }    public boolean update(String sql, Object... param) throws SQLException {        if (cpds == null) {            throw new RuntimeException("csp0为空,请在构造方法中传入参数");        }        Connection conn = cpds.getConnection();        PreparedStatement ps = conn.prepareStatement(sql);        for (int i = 0; i < param.length; i++) {            ps.setObject(i + 1, param[i]);        }        return ps.execute();    }}
  2. MyResultSetHandler.java

    package com.uu.dbUtils;import java.sql.ResultSet;public interface MyResultSetHandler<T> {    /**     * 反射 回应值, ResultSet 中取得列的 类型 赋值返回     *      * @param rs     * @return     * @return     */    public T handler(ResultSet rs);}
  3. MyBeanHander.java

    package com.uu.dbUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import com.mchange.v2.c3p0.ComboPooledDataSource;/** * 模仿DbUtils中的 QueryRunner *  * 实现对JdbcUtils 的封装 *  *  * @author penghao *  */public class MyQueryRunner {    private ComboPooledDataSource cpds;    public MyQueryRunner() {    }    public MyQueryRunner(ComboPooledDataSource cpds) {        this.cpds = cpds;    }    /**     *      * 更新数据 ,即 插入数据     *      * @param conn     * @param sql     * @param param     * @return     * @throws SQLException     */    public boolean update(Connection conn, String sql, Object... param)            throws SQLException {        PreparedStatement ps = conn.prepareStatement(sql);        for (int i = 0; i < param.length; i++) {            ps.setObject(i + 1, param[i]);        }        return ps.execute();    }    public <T> T query(Connection conn, String sql, MyResultSetHandler<T> msh)            throws SQLException {        Statement st = conn.createStatement();        ResultSet rs = st.executeQuery(sql);        return msh.handler(rs);    }    public boolean update(String sql, Object... param) throws SQLException {        if (cpds == null) {            throw new RuntimeException("csp0为空,请在构造方法中传入参数");        }        Connection conn = cpds.getConnection();        PreparedStatement ps = conn.prepareStatement(sql);        for (int i = 0; i < param.length; i++) {            ps.setObject(i + 1, param[i]);        }        return ps.execute();    }}
0 0
原创粉丝点击