DBUtils和连接池

Dbutils

只使用JDBC进行开发冗余代码过多,

DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

 

1.1 Dbutils三个核心功能

QueryRunner中提供对sql语句操作的API.

ResultSetHandler接口,用于定义select操作后,怎样封装结果集.

DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

1.2 QueryRunner核心类

update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作

query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

1.2.1添加、更新、删除

例:

建java项目,导入mysql的工具包和dbutils的jar包

DBUtils和连接池

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import com.shopping.tools.JDBCUtils;

public class Demo01 {
    public static void main(String[] args) throws SQLException {
        add();
    }
    
    //对sort表添加数据
    public static void add() throws SQLException{
        //获得连接对象
        Connection conn=JDBCUtils.getConn();
        //获得语句执行对象
        QueryRunner qr=new QueryRunner();
        String sql="insert into sort values(?,?,?)";
        //封装传入的实际参数
        Object[] obj={13,"水杯","喝水"};
        int row=qr.update(conn,sql,obj);
        System.out.println(row);
        //关闭资源
        DbUtils.close(conn);
    }
    
    //修改数据
    public static void update() throws SQLException{    
        Connection conn=JDBCUtils.getConn();
        QueryRunner qr=new QueryRunner();
        String sql="update sort set sname=?,sdesc=? where sid=?";
        int row=qr.update(conn, sql, "遥控器","开电视",13);
        System.out.println(row);    
        DbUtils.close(conn);        
    }
    
    //删除数据
    public static void delete() throws SQLException{
        Connection conn=JDBCUtils.getConn();
        QueryRunner qr=new QueryRunner();
        String sql="DELETE FROM sort WHERE sid=?";
        qr.update(conn,sql,13);
        DbUtils.close(conn);
    }    
}

 add()方法结果:

DBUtils和连接池

DBUtils和连接池

update()方法结果:

DBUtils和连接池

DBUtils和连接池

delete()方法结果:

DBUtils和连接池

1.查询

ResultSetHandler结果集处理类:

ArrayHandler

将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

ArrayListHandler

将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

BeanHandler

将结果集中第一条记录封装到一个指定的javaBean中。

BeanListHandler

将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

ColumnListHandler

将结果集中指定的列的字段值,封装到一个List集合中

ScalarHandler

它是用于单数据。例如select count(*) from 表操作。

MapHandler

将结果集第一行封装到Map<String,Object>集合中,Key 列名, Value 该列数据

MapListHandler

将结果集每一行封装到List<Map<String,Object>>集合中,Key 列名, Value 该列数据,Map集合存储到List集合

 

实体类:

JavaBean是一个类,在开发中常用封装数据

1)需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。

2)提供私有字段:private 类型 字段名;

3)提供getter/setter方法:

4)提供无参构造

例:

 

Sort实体类:

public class Sort {
    private int sid;
    private String sname;
    private String sdesc;
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public String getSdesc() {
        return sdesc;
    }
    public void setSdesc(String sdesc) {
        this.sdesc = sdesc;
    }
    @Override
    public String toString() {
        return "Sort [sid=" + sid + ", sname=" + sname + ", sdesc=" + sdesc + "]";
    }    
}

 

class Demo02:

 

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.dbutils.DbUtils;
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 com.shopping.tools.JDBCUtils;

public class Demo02 {
    private static Connection conn=JDBCUtils.getConn();
    private static QueryRunner qr=new QueryRunner();    
    
    public static void main(String[] args) throws SQLException {
        get1();
    }
    
    //查询数据ArrayHandler
    public static void get1() throws SQLException{        
        String sql="select * from sort where sid>?";
        Object[] obj=qr.query(conn, sql, new ArrayHandler(),2); //取结果集的第一条记录
        for(Object o:obj){
            System.out.print(o+" ");
        }
        DbUtils.close(conn);
    }
    
    //查询数据ArrayListHandler
    public static void get2() throws SQLException{        
        String sql="SELECT * FROM sort";
        List<Object[]> list=qr.query(conn, sql, new ArrayListHandler());
        for(Object[] objs:list){
            for(Object o:objs){
                System.out.print(o+" ");
            }
            System.out.println();
        }
    }
    
    //BeanHandler
    public static void get3() throws SQLException{
        String sql="SELECT * FROM sort where sid=?";
        Sort sort=qr.query(conn,sql,new BeanHandler<Sort>(Sort.class),6);
        System.out.println(sort);
    }
    
    //BeanListHandler
    public static void get4() throws SQLException{
        String sql="SELECT * FROM sort";
        List<Sort> list=qr.query(conn,sql,new BeanListHandler<Sort>(Sort.class));
        for(Sort s:list){
            System.out.println(s);
        }
    }
    
    //ColumnListHandler只查询某一列
    public static void get5() throws SQLException{
        String sql="select sname from sort";
        List<String> list=qr.query(conn,sql,new ColumnListHandler<String>());
        for(String s:list){
            System.out.println(s);
        }
    }
    
    //ScalarHandler单数据
    public static void get6() throws SQLException{
        String sql="SELECT COUNT(*) FROM sort";
        long count=qr.query(conn,sql,new ScalarHandler<Long>()); //注意是long类型
        System.out.println(count);
    }
    
    //MapHandler
    public static void get7() throws SQLException{
        String sql="SELECT * FROM sort";
        Map<String,Object> map=qr.query(conn,sql,new MapHandler());
        Set<String> set=map.keySet();
        for(String s:set){
            System.out.println(s+"..."+map.get(s));
        }
    }
    
    //MapListHandler
    public static void get8() throws SQLException{
        String sql="SELECT * FROM sort";
        List<Map<String,Object>> list=qr.query(conn,sql,new MapListHandler());
        for(Map<String,Object> map:list){
            Set<String> s=map.keySet();
            for(String str:s){
                System.out.print(str+"..."+map.get(str)+" ");
            }
            System.out.println();            
        }
    }
}

 

 get1()方法结果:

DBUtils和连接池

get2()方法结果:

DBUtils和连接池

get3()方法结果:

DBUtils和连接池

get4()方法结果:

DBUtils和连接池

get5()方法结果:

DBUtils和连接池

get6()方法结果:

DBUtils和连接池

get7()方法结果:

DBUtils和连接池

get8()方法结果:

DBUtils和连接池

2.连接池

实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,

为了解决此类性能问题,采用连接池技术,来共享连接Connection。

这样就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。

 

2.1原理

用池来管理Connection,这样可以重复使用Connection。

有了池,就不用自己来创建Connection,而是通过池来获取Connection对象。

当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

DBUtils和连接池

 

 

2.2规范

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池。

常见的连接池:DBCP、C3P0。

 

2.3 DBCP连接池 

2.3.1导入jar包

DBUtils和连接池DBUtils和连接池

DBUtils和连接池

2.3.2 编写工具类:

DBUtils:

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class DBUtils {
    public static final String DRIVER = "com.mysql.jdbc.Driver";
    public static final String URL = "jdbc:mysql://localhost:3306/market0929?useUnicode=true&characterEncoding=UTF-8";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "123456";
    /*
     * 创建连接池BasicDataSource
     */
    //创建连接池对象
    public static BasicDataSource dataSource = new BasicDataSource(); //导的引入的jar包
    //静态代码块(只运行一次)
    static {
        //对连接池对象 进行基本的配置
        dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
        dataSource.setUrl(URL); //指定要连接的数据库地址
        dataSource.setUsername(USERNAME); //指定要连接数据的用户名
        dataSource.setPassword(PASSWORD); //指定要连接数据的密码
    }
    /*
     * 返回连接池对象
     */
    public static DataSource getDataSource(){ //导sql包
        return dataSource;
    }    
}

测试类:

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.shopping.tools.DBUtils;

public class Demo03 {
    public static void main(String[] args) throws SQLException {
        get4();
    }

    private static QueryRunner qr = new QueryRunner(DBUtils.getDataSource());

    // BeanHandler
    public static void get3() throws SQLException {
        String sql = "SELECT * FROM sort where sid=?";
        Sort sort = qr.query(sql, new BeanHandler<Sort>(Sort.class), 6);
        System.out.println(sort);
    }

    // BeanListHandler
    public static void get4() throws SQLException {
        String sql = "SELECT * FROM sort";
        List<Sort> list = qr.query(sql, new BeanListHandler<Sort>(Sort.class));
        for (Sort s : list) {
            System.out.println(s);
        }
    }
}

 

上一篇:JSTL、断点、JavaEE、DBUTils连接池


下一篇:dbutils的总结