DBUtils工具类
今天给大家整理的内容是:使用dbutils工具类和连接池技术(c3p0,druid),降低数据库访问过程中性能消耗问题;
首先我们说下什么是DBUtils工具类,DBUtils工具类是apache公司专门为java访问数据操作时提供的工具模块;
使用他,我们可以很快速的完成数据库的访问过程;
第一点:他的核心类是QueryRunner 这个类有两个构造方法,注意;
一个是有参数,主要是用在一般情况下,没有事物提交的情况;
二是没有参数的,他主要是用在有事物提交的情况;
其次我们谈谈连接池:市面上有很多连接池,原理都大同小异,我们知道,当一个项目有上百万的用户进来的时候,如果我们采用不断创建和销毁的方式进行数据库的断开与连接操作,将会
极大浪费数据库资源,并且很有可能回因此造成内存溢出而导致程序无法运行的情况;那么我们的数据库连接池是在程序启动时,就已经初始化了细一些连接,当我们用户需要访问数据库时
就会从连接池中拿一个连接,当不需要时,在还给数据库连接池即可,通过这种方式,可以节约很多数据库访问资源;
好了,说了那么多,估计大家都没耐心了,
下面,我们开始介绍阿里的Druid(德鲁伊)连接池,
1)导入资源包,百度上有,
2)创建数据库配置文件;
如下:
需要说明的是,Druid连接池,他的配置文件名称没有要求,但是配置文件的格式需要规范;即key的值必须是按规定书写的,不能自定义;
说完了Druid的配置了,那我们老看下他的主要类是什么,如何加载资源文件;
ok,大家对Druid有一个了解之后,我们现在看下C3P0连接池,C3P0连接池,使用的非常广泛,也很好用;
首先的配置文件:
1)需要说明的是,他的配置文件的名字是固定的,必须是此c3p0-config.xml;
2)配置文件必须放在src路径下,不是放在根目录中;
3)配置信息如下:
<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>
<named-config name="dbInfo">
<!-- 配置用户密码,连接,驱动等 -->
<property name="user">root</property>
<property name="password"></property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/table</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 数据库连接池,一次向数据库服务器要多少个连接 -->
<property name="acquireIncrement">10</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">5</property>
<!-- 最小连接数 -->
<property name="minPoolSize">5</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">20</property>
<!-- 数据库连接池能维护的最多statement的数量 -->
<property name="maxStatements">20</property>
<!-- 每个数据库连接可以创建多少个statement -->
<property name="maxStatementPerConnection">20</property>
</named-config>
</c3p0-config>
需要解释一点:在c3p0连接池中可以放很多个数据库;他们都是根据name-config这个标签进行区分的;
<named-config name="dbInfo">后面我们在讲到核心类时再说;
工具类的书写:
public class DBUtil { //私有化 private DBUtil() {} //保证只有一个连接池 private static final DataSource ds=new ComboPooledDataSource(); //创建一个连接; public static Connection getConection(){ Connection conn=null; try { conn=ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //对外提供一个连接池的方法; public static DataSource getDataSource() { return ds; } }
注意的是private static final DataSource ds=new ComboPooledDataSource();这里的CombopooledDataSource是核心类,没有添加参数,表示寻找默认的连接,或者连接池中第一连接;
接下来呢,我们,来使用DBUtils的工具类,真正实现数据库操作的便捷性;
具体代码如下:
public class PersonDaoImpl implements PersonDao{ private QueryRunner runner=null; public PersonDaoImpl() { runner=new QueryRunner(DBUtils.getDataSource()); } @Override public void add(Person p) throws SQLException { String sql="insert into Person (name,age,description)values(?,?,?)"; runner.update(DBUtils.getConnection(), sql, p.getName(),p.getAge(),p.getDescription()); } @Override public void update(Person p) throws SQLException { String sql="update Person set name=?,age=?,description=? where id=?"; runner.update(DBUtils.getConnection(), sql, p.getName(),p.getAge(),p.getDescription(),p.getId()); } @Override public void delete(int id) throws SQLException { String sql="delete from Person where id=?"; runner.update(DBUtils.getConnection(), sql,id); } @Override public Person findById(int id) throws SQLException { String sql="select name,age,description from Person where id=?"; Person p=runner.query(DBUtils.getConnection(), sql, new BeanHandler<Person>(Person.class),id); return p; } @Override public List<Person> findAll() throws SQLException { String sql="select name,age,description from Person"; List<Person>persons=runner.query(DBUtils.getConnection(), sql, new BeanListHandler<Person>(Person.class)); return persons; } @Override public long personCount() throws SQLException{ String sql="select count(id) from Person"; return runner.query(DBUtils.getConnection(), sql, new ScalarHandler<Long>()); } }
有了工具类之后,我们的数据库操作的代码,及其简介,两句话搞定;
好了,先到这了,还有一点就是DBUtils工具类在做查询工作时,给我们封装了9大实现类,下一个专题再讲;
如有错误,还望指正,

浙公网安备 33010602011771号