• JDBC工具包commons-dbutils的基本介绍


    感谢原文作者:simonXi-tech
    原文链接:https://blog.csdn.net/simonforfuture/article/details/90480147
    更多请查阅在线API文档:https://tool.oschina.net/apidocs/apidoc?api=commons-dbutils

    前言

    DBUtils

    Java开发基础(二)——JDBC的使用中写到,Java与数据库的连接包括:导包、注册驱动、获取与数据库的连接对象、获取SQL语句的执行者对象、获取结果集对象、关闭连接等。其中连接池包含了注册驱动和获取与数据库连接两个步骤,而dbutils简化了其他步骤

    JavaBean组件

    **JavaBean是一个用于封装数据的类,在与数据库连接之中,JavaBean其的作用是将获取的数据库的记录封装到JavaBean中。**特性如下:

    1. 需要实现接口:java.io.Serializable ,可以省略不写。
    2. 提供私有字段:private 类型 字段名;
    3. 提供getter/setter方法:
    4. 提供无参构造

    DBUtils使用

    DBUtils封装了JDBC的操作,核心功能如下:

    1. QueryRunner中提供对sql语句操作的API.
    2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
    3. DbUtils类是一个工具类,定义了关闭资源与事务处理的方法

    QueryRunner核心类:

    核心方法:

    1. QueryRunner(DataSource ds) ;传入参数为连接池
    2. update(String sql, Object… params) ,执行insert update delete操作
    3. query(String sql, ResultSetHandler rsh, Object… params) ,执行 select操作

    ResultSetHandler结果集处理类

    在这里插入图片描述

    示例

    JavaBean: Category.java

    // JavaBean
    public class Category {
    	private String cid;
    	private String cname;
    	
    	public String getCid() {
    		return cid;
    	}
    	public void setCid(String cid) {
    		this.cid = cid;
    	}
    	
    	public String getCname() {
    		return cname;
    	}
    	public void setCname(String cname) {
    		this.cname = cname;
    	}
    	@Override
    	public String toString() {
    		return "Category [cid=" + cid + ", cname=" + cname + "]";
    	}
    	public Category() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public Category(String cid, String cname) {
    		super();
    		this.cid = cid;
    		this.cname = cname;
    	}
    }
    
    

    C3P0Utils.java

    /**
     * 在C3P0连接池中 遵循了javax.sql.DataSource接口的实现类:
     * 		ComboPooledDataSource
     */
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class C3P0Utils {
    
    	private static ComboPooledDataSource ds = new ComboPooledDataSource();	
    	// 自动加载C3P0-config.xml文件
    
    	public static DataSource getDataSource(){
    		return ds;
    	}
    	
    	public static Connection getConnection() throws SQLException{
    		// 获取连接,从C3P0连接池获取
    		return ds.getConnection();
    	}
    	
    	// 关闭所有资源的统一代码
    	public static void closeAll(Connection conn, Statement st, ResultSet rs){
    		//负责关闭
    		if(conn != null){
    			try {
    				conn.close();		// 使用代理,放回到连接池中
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		if(st != null){
    			try {
    				st.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		if(rs != null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}	
    }
    
    

    DBUtilsDemo.java

    package cn.simon.jdbc.demo03_DBUtils的使用;
    
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ArrayHandler;
    import org.apache.commons.dbutils.handlers.ArrayListHandler;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ColumnListHandler;
    import org.apache.commons.dbutils.handlers.MapHandler;
    import org.apache.commons.dbutils.handlers.MapListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import cn.simon.jdbc.domain.Category;
    
    /**
     *  DBUtils执行数据库查询操作
     *  	1.QueryRunner(DataSource)
     *  	2.query(String sql, ResultSetHandler<T> rsh, Object... params); // 主要执行查询
     */
    
    public class DBUtilsDemo {
    	public static void main(String[] args) throws SQLException {
    		// TODO Auto-generated method stub
    
    //		queryDemo01();
    //		queryDemo02();
    //		queryDemo03();
    //		queryDemo04();
    //		queryDemo05();
    		queryDemo06();
    //		queryDemo07();
    //		queryDemo08();
    	}
    	
    	// ArrayHandler处理类的使用
    	public static void queryDemo01() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		Object[] objs = qr.query("select * from category where cid = ?", new ArrayHandler(), 1);
    		for(Object o: objs){		// object[]中保存了object对象
    			System.out.println(o);
    		}
    	}
    	
    	// ArrayListHandler
    	public static void queryDemo02() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		List<Object[]> objs = qr.query("select * from category ", new ArrayListHandler());
    		for (Object[] objects : objs) {
    			System.out.println(objects[0]+"	"+objects[1]);
    		}
    	}
    	
    	// BeanHandler处理类的使用
    	public static void queryDemo03() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		String sql = "select * from category";
    		Category c = qr.query(sql, new BeanHandler<Category>(Category.class));
    		System.out.println(c);
    	}
    	
    	// BeanListHandler
    	public static void queryDemo04() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		String sql = "select * from category";
    		List<Category> c = qr.query(sql, new BeanListHandler<Category>(Category.class));
    		for (Category category : c) {
    			System.out.println(category);
    		}
    	}
    	
    	// ColumnListHandler处理类的使用
    	public static void queryDemo05() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		String sql = "select * from category";
    		List<Object> c = qr.query(sql, new ColumnListHandler<Object>("cname"));
    		System.out.println(c);
    	}
    	
    	// MapHandler处理类的使用
    	public static void queryDemo06() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		String sql = "select * from category";
    		Map<String, Object> map = qr.query(sql, new MapHandler());
    		// 3.
    		System.out.println(map);
    	}
    	
    	// MapListHandler处理类的使用
    	public static void queryDemo07() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		String sql = "select * from category";
    		List<Map<String, Object>> maps = qr.query(sql, new MapListHandler());
    		// 3.List
    		System.out.println(maps);
    	}
    	
    	// MapListHandler处理类的使用
    	public static void queryDemo08() throws SQLException{
    		// 1.创建QueryRunner对象
    		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    		// 2.执行查询
    		String sql = "select count(*) from category";
    		Long count = qr.query(sql, new ScalarHandler<Long>());
    		// 3.List
    		System.out.println(count);
    	}
    }
    
    

    总结

    DBUtils主要就是简化JDBC操作,封装虽好,但还是要知道其中的原理才好。

    Maven

    <!--DBUtils-->
            <dependency>
                <groupId>commons-dbutils</groupId>
                <artifactId>commons-dbutils</artifactId>
                <version>1.7</version>
            </dependency>
    

    我的项目具体使用

    仓库地址:https://github.com/b84955189/TF-MIS
    源路径:src/main/java/dao/impl/BaseDaoImpl.java

    package dao.impl;
    
    import dao.inter.BaseDaoInter;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    import utils.JDBCUtils;
    
    import java.sql.SQLException;
    import java.util.List;
    
    /**
     * 基础Dao实现类
     * @author Jason
     * @version 1.0
     * @date 6/11/2020 9:59 PM
     */
    public class BaseDaoImpl implements BaseDaoInter {
        /**
         * 获取任意对象
         * 结果Bean需要强转
         * @param beanType  Java Bean 类型
         * @param sqlSyntax SQL语句
         * @param params    查询参数
         * @return
         * @author Jason
         * @date 9:57 PM 6/11/2020
         */
        @Override
        public Object getObject(Class beanType, String sqlSyntax, Object[] params) throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            return queryRunner.query(sqlSyntax,new BeanHandler(beanType),params);
        }
    
        /**
         * 获取任意对象集合
         * 注意:JSONObject是采用反射的机制获取get方法,然后再获取参数值的。所以在使用JSONObject处理结果集合时可以
         * 不必下转型。可以查看JSONObject的实现源代码。上转型类.getClass()==实例类型
         * @param  beanType Java Bean 类型
         * @param  sqlSyntax SQL语句
         * @param  params 查询参数
         * @return
         * @author Jason
         * @date 8:57 PM 6/13/2020
         */
        @Override
        public List<Object> getObjectList(Class beanType, String sqlSyntax, Object[] params) throws SQLException {
            System.out.println(sqlSyntax);
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            return queryRunner.query(sqlSyntax,new BeanListHandler<Object>(beanType),params);
        }
    
    
        /**
         * 数据库更新操作
         * QueryRunner的update方法参数底层依旧是使用JDBC的setObject方法设置参数.setObject方法内部会通过instance of判断这个参数到底是哪个类型的具体对象,从而调用相应类型的set方法。
         * @param sqlSyntax SQL语句
         * @param params    参数
         * @return
         * @author Jason
         * @date 9:29 AM 6/14/2020
         */
        @Override
        public boolean update(String sqlSyntax, Object[] params) throws SQLException {
            boolean sign=false;
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            if(queryRunner.update(sqlSyntax,params)>0){
                sign=true;
            }
            return sign;
        }
    
        /**
         * 获取查询数目
         *
         * @param sqlSyntax SQL 语句
         * @param params 查询限制参数
         * @return
         * @author Jason
         * @date 7:26 PM 6/15/2020
         */
        @Override
        public long getCount(String sqlSyntax, Object[] params) throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            return queryRunner.query(sqlSyntax,new ScalarHandler<Long>(),params);
        }
    }
    
  • 相关阅读:
    ACM学习
    吴翼大神
    心急的C小加(两种解法)
    万圣节派对(水题)
    poj 1163 The Triangle
    POJ 1088滑雪
    1690 开关灯
    908. 校园网
    STL之stack栈
    1163 访问艺术馆
  • 原文地址:https://www.cnblogs.com/tfxz/p/13251761.html
Copyright © 2020-2023  润新知