文档章节

JDBC连接池&DBUtils

勤劳的开发者px
 勤劳的开发者px
发布于 2017/09/04 16:11
字数 2027
阅读 8
收藏 0

一,使用连接池重写工具类 


 1.为什么使用连接池重写工具类

- Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了.每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.

2.连接池原理 

![img](img/tu_1.png)

- 目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。

3.编写连接池 

3.1步骤

- 创建一个类,定义LInkedList集合作为连接池,在静态代码块中,向集合里面添加5个连接对象
- 添加addBack()方法,用作归还连接
 


public class MyDataSource {
    //连接池
    static LinkedList<Connection> pool = new LinkedList<>();
    //初始化连接
    static{
        try {
            for(int i = 0;i < 5;i++){
                pool.add(JdbcUtils.getConnection());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }
    
    //提供连接
    public Connection getConnection(){
        
        Connection connection = pool.removeFirst();
        return connection;
        
    }
    
    //归还连接的方法
    public  void addBack(Connection connection){
        //添加到最后
        pool.addLast(connection);
        
    }
    
    //返回pool里面连接的个数
    public int getCount(){
        return pool.size();
    }
    

}

3.2datasource接口概述

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

3.3编写连接池遇到的问题

- 实现dataSource接口后,addBack()不能调用了.
- 能不能不引入新的api,直接调用之前的API.close(),但是这个close不是关闭,是归还

3.4解决办法

- 继承
      条件:可以控制父类的构造


- 装饰者模式

  目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装模式)    

      条件:1.增强类和被增强类实现的是同一个接口
              2.增强类里面要拿到被增强类的引用


  步骤:

1. 编写一个类实现一个接口,为被增强类
2. 编写一个类,实现与被增强类相同的接口。(具备相同的行为)
3. 定义一个被增强类类型的变量。
4. 定义构造方法,把被增强类类的对象注入,给被增强类变量赋值。
5. 对于不需要改写的方法,调用被增强类类原有的方法。
6. 对于需要改写的方法,写自己的代码。

- 动态代理


3.5采用装饰者模式进行改造


4.常用连接池 

4.1 dbcp

4.1.1 dbcp概念

![img](img/tu_2.jpg)

+ DBCP:Apache推出的Database Connection Pool

核心API:

- basicDatasource
- basicDatasourceFactory

4.1.2使用步骤

- 添加jar包  commons-dbcp-1.4.jar  commons-pool-1.5.6.jar
- 添加配置文件到src目录
- 编写数据源工具类


1. 通过配置文件来编写

 

public class DBCPUtils {
    static DataSource ds;
    static {
        //只需要初始化一次
        try {
            Properties p = new Properties();
            InputStream is =JdbcUtils.class.getClassLoader()
.getResourceAsStream("dbcpconfig .properties");
            // InputStream is = new
            // FileInputStream("src/dbcpconfig.properties");
            p.load(is);
            ds = BasicDataSourceFactory.createDataSource(p);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    // 创建连接
        public static Connection getConnection() throws SQLException {
            // DriverManager.getConnection(url, user, password);  Connection
            Connection connection = ds.getConnection();
            return connection;
        }
        // 释放资源
        public static void release(ResultSet resultSet, Statement statement, Connection connection) {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();//不要关注方法名,关注连接来源
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
}

2. 通过硬编码来表写(不需要配置文件)

   ```
   DataSource basicDataSource = new BasicDataSource();
   basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
   basicDataSource.setUrl("jdbc:mysql://localhost:3306/day01_1");
   basicDataSource.setUsername("root");
   basicDataSource.setPassword("123456");
   ```

   ​

4.2 c3p0

4.2.1 c3p0概念

![img](img/tu_3.jpg)

+ C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml

4.2.2使用步骤

- 添加jar包 
- 编写配置文件c3p0-config.xml,放在src中(注:文件名一定不要写错)
1. 通过配置文件来编写

public class C3P0Utils {
    //创建一个连接池对象
    static DataSource ds = new ComboPooledDataSource();
    //从池中获得一个连接
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }
    //释放资源
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            rs = null;
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            stmt = null;
        }
        if(conn!=null){
            try {
                conn.close();//放心的关。是否关闭取决连接是怎么来的
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            conn = null;
        }
    }
}

2. 通过硬编码来编写(不需要配置文件)

```
    DataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass("com.mysql.jdbc.Driver"); // loads the jdbc driver
    cpds.setJdbcUrl("jdbc:mysql://localhost:3306/day01_1");
    cpds.setUser("root");
    cpds.setPassword("ai1996");
```

二,使用DBUtils 增删改查的操作


- DBUtils就是JDBC的简化开发工具包。需要使用技术:连接池(获得连接)、SQL语句都没有少

DBUtils完成CRUD 

2.1概述

1. DBUtils是java编程中的数据库操作实用工具,小巧简单实用。 第一个操作数据库框架(jar),
2. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
3. Dbutils三个核心功能介绍

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

2.2QueryRunner核心类

- QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection 
- update(String sql, Object... params) ,执行更新数据 insert update delete  参数就是一个数组,参数个       数取决于语句中?的个数
- query(String sql, ResultSetHandler<T> rsh, Object... params) ,执行查询 select

2.3ResultSetHandler结果集处理类

Handler类型     说明      
ArrayHandler

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

ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中
BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
ColumnListHandler  将结果集中指定的列的字段值,封装到一个List集合中
KeyedHandler 将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
MapHandler 将结果集中第一条记录封装到Map<String,Object>集合中,key就是字段名称,value就是字段值
MapListHandler 将结果集中每一条记录封装到Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
ScalarHandler 它是用于单个数据。例如select  count(*) from 表操作。


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.4练习

开发步骤:


1. 创建项目,并导入jar包
2. 创建连接池
3. 编写测试类
增加

//向user表添加一条数据
    
    @Test
    public void  insert() throws SQLException{
        //创建queryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        //String sql = "insert into user values(null,'aaa','111','露西')";
        String sql = "insert into user values(?,?,?,?)";
        
        Object[] params ={null,"aaa","111","露西"};
        queryRunner.update(sql, params);
        
    }

更新

  //把用户名是aaa的user密码改成222
    
    @Test
    public  void update() throws SQLException{
        //创建queryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql = "update user set password = ? where username = ?";
        Object[] params={"222","aaa"};
        queryRunner.update(sql, params);
        
    }

删除

    //把用户名是aaa的user给删除
    
    @Test
    public  void delete() throws SQLException{
        //创建queryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql = "delete from user where username = ?";
        Object[] params={"aaa"};
        queryRunner.update(sql, params);
        
    }

通过id查询
 

 //查询id为1的用户信息
    
    @Test
    public  void selectById() throws SQLException{
        //创建queryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select *from user where id = ?";
        Object[] params = {1};
        
        User user = queryRunner.query(sql, new BeanHandler<>(User.class), params);
        
        System.out.println(user.toString());
        
    }

查询所有列
 

    //查询所有的用户信息
    @Test
    public  void selectAll() throws SQLException{
        //创建queryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql = "select *from user";
        Object[] params = {};
        
        List<User> list = queryRunner.query(sql, new BeanListHandler<>(User.class), params);
        
        System.out.println(list.toString());
        
    }

 总记录数


    //统计用户的个数
    
    @Test
    public  void getCount() throws SQLException{
        //创建queryRunner对象
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        
        String sql = "select count(*) from user";
        
        Long n = (Long) queryRunner.query(sql, new ScalarHandler());
        
        System.out.println(n.intValue());
    }


 

© 著作权归作者所有

共有 人打赏支持
上一篇: Hibernate_01
下一篇: JDBC基础
勤劳的开发者px
粉丝 3
博文 54
码字总数 108225
作品 0
荆州
程序员
私信 提问
day14_DBUtils学习笔记

一、DBUtils介绍 Apache公司开发的框架。   DBUtils是java编程中的数据库操作实用工具,小巧简单实用。   DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。 commons-dbutils 是...

黑泽明军
2018/05/20
0
0
运用dbutils获取tomcat数据库连接池

1、首先要将mysql的驱动包放在tomcat/lib目录下 2、在myeclipse工程目录下的webroot/META-INF下新建一个context.xml文件,内容如下: <Context> <!--这里是mysql的连接池设置--> <Resource n......

又右耳刀
2013/11/07
0
0
Apache Commons DbUtils 1.5 发布

DbUtils 可是难得更新一次啊,刚发布的 1.5 版本改进记录包括: Bug [DBUTILS-73] - .BasicRowProcessor.CaseInsensitiveHashMap uses default Locale for toLowerCase [DBUTILS-77] - "dro......

oschina
2012/07/22
4.3K
15
红薯大哥,技术指导下我。

红薯大哥,看到你的网站架构很是羡慕,最近在自己写一个适合自己项目的jdbc封装,现在已经完成了对指定注解实体类的反射解析,能够做到数据库与类的映射,底层用dbutils做,有一个问题就是我...

周扒皮
2011/06/07
662
8
jdbc连接池通过spring注入,得到的连接为null

jdbc连接池通过spring注入,得到的连接为null,哪位朋友帮解决一下,我是用jdbc连接池,dbutils,spring,struts2做的

赵国鑫
2010/09/20
637
2

没有更多内容

加载失败,请刷新页面

加载更多

XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
18分钟前
0
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
18分钟前
1
0
day23:curl判断网站状态码|打包压缩家目录小于5k文件|

1、写一个shell 脚本,通过curl -l 返回的状态码来判断访问的网站是否正确(状态码为 200 则正常); 首先如何过滤出来 状态码了; curl -I http://www.yuanhh.com/index.php 2>/dev/null|head...

芬野de博客
40分钟前
1
0
从 for of 聊到 Generator

你能学到什么 对 for of 更深入的理解 iterator 到底是何方神圣? 数组也是对象,为什么不能用 for of 来遍历对象呢? 如何实现对象的 for of? Generator 又是何方神圣? Generator 有什么用呢...

Jack088
52分钟前
3
0
怎么判断go-sql-driver 安装成功

.下载安装   执行下面两个命令:     下载:go get github.com/Go-SQL-Driver/MySQL     安装:go install github.com/Go-SQL-Driver/MySQL   怎么判断go-sql-driver 安装成功 ...

dragon_tech
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部