C3P0连接池及QueryRunner的使用

Posted 智趣森林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C3P0连接池及QueryRunner的使用相关的知识,希望对你有一定的参考价值。


小编最近做毕业设计了突然想起java连接数据库我早已忘记了,因此在此回顾一下JDBC相关内容的知识。


使用连接池去控制数据库的连接比较安全!


因此我再次记录一下被大众看好的C3p0连接池的使用方法


详情,请继续往下看哦!……


相信大家也跟小编一样现阶段只需要想办法去解决我们当前遇到的技术问题又或者是恢复一下那个感觉而已,所以今天就直接上实打实的使用方法,就不在去赘述其中的太多原理性的东西了。


C3P0连接池及QueryRunner的使用

“C3P0的使用方法”

-

01

-


使用C3p0的步骤主要分为两步:第一步、导入jar包 c3p0-0.9.2-pre1.jar 和 mchange-commons-0.2.jar (我是连接mysql数据库只需要导入这两个jar包即可,如果是需要连接oracle数据库还需要导入 c3p0-oracle-thin-extras-0.9.2-pre1.jar) 导入jar包后,可不要忘记了 给jar包进行build path操作哦;第二步、就是编写程序使用C3P0连接池进行数据库连接了。该步骤中我们可以分为两种方式,第一种是使用配置文件进行配置的方式,第二种是使用手工配置的方式。

    首先来撸一下手工配置的方式代码:

        public void fun1()throw PropertyVetoException,SQLException{

        ComboPooledDataSource  dataSource = new ComboPooledDataSource();//创建dataSource对象

        //手工配置数据库连接的基本配置

        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/project1");

        dataSource.setUser("root");

        dataSource.setPassword("root");

        dataSource.setDriverClass("com.mysql.jdbc.Driver");

        //手工配置C3P0的数据库连接池的配置

        dataSource.setAcquireIncrement(5);

        dataSource.setInitialPoolSize(20);

        dataSource.setMinPoolSize(6);

        dataSource.setMaxPoolSize(100);

        Connection conn = dataSource.getConnetion();

        //这里执行你想要执行的数据操作代码

        ............................

        //最后别忘记关闭连接了

        conn.close();//这里的关闭并不是真的关闭连接,而是放回到连接池中

    }

接着我们再写一下使用c3p0-config.xml配置文件的方式:

    这里要注意的是我们使用配置文件进行设置参数的时候文件名必须为c3p0-config.xml这个文件名,其次我们需要把该配置文件放置在src根目录下,这样C3P0才能自动识别这里的文件并且获取配置的参数。

    c3p0-config.xml配置文件中配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

<default-config>

<property name="jdbcUrl">jdbc:mysql://localhost:3308/codeshare</property>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="user">root</property>

<property name="password">root</property>

<property name="acquireIncrement">3</property>

<property name="initialPoolSize">5</property>

<property name="minPoolSize">2</property>

<property name="maxPoolSize">10</property>

</default-config>

</c3p0-config>

以上的是配置文件中的默认配置,还有一个命名配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>

<named-config name="oracle-config">

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="user">root</property>

       <property name="password">123</property>

       <property name="acquireIncrement">3</property>

       <property name="initialPoolSize">10</property>

       <property name="minPoolSize">2</property>

       <property name="maxPoolSize">10</property>

    </named-config>

这两种配置是基本差不多,唯一不同的就是在使用的时候,有一点不同,待会儿再说咯!

接着给出使用配置文件的C3P0连接池的java代码连接数据库

public void fun2()throws PropertyVetoException, SQLException{

    ComboPooledDataSource dataSource = new ComboPooledDataSource();//这里使用的是xml中的默认配置信息

ComboPooledDataSource  dataSource = new ComboPooledDataSource("oracle-config");//这里使用的是命名配置信息

//以上就是默认xml配置信息和命名xml配置信息的使用的不同

//接下来什么参数都不需要设置,程序会自动读取到c3p0-config.xml配置文件中的所有的参数设置。

//获取连接

 Connection conn = dataSource.getConnection();

//接着执行 您想要的数据操作代码然后 

...............

//最后记得关闭连接

conn.close();

}

    最后给出一下各大主流数据库的DriverClass和url样例

#mssql

#driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver

#url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=mydb


#mssql jtds

#driverClassName=net.sourceforge.jtds.jdbc.Driver

#url=jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=mydb


#orcale

#driverClassName=oracle.jdbc.driver.OracleDriver

#url=jdbc:oracle:thin:@localhost:1521:mydb


#access

#driverClassName=sun.jdbc.odbc.JdbcOdbcDriver

#url=jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=mdb\mydb.mdb


    既然给出了连接池的代码,总觉得还是缺点什么东西,那小编就再给需要的小伙伴们给出一个使用jdbc连接MYSQL进行数据库操作的样例代码吧!

        public void Operation(User user)  {  //这里是对User对象进行操作

        Connection conn = null;

        PreparedStatement pstmt = null;

        ResultSet rs = null;

        User U = null;

        try{

            conn = JdbcUtils.getConnetion();//该方法在下方给出,获取连接

            String sql = "select * from user where uid=?";

            //对sql语句进行预处理

            pstmt = conn.prepareStatement(sql);

            pstmt.setString(1,user.getUid());//给第一个问号赋值

            //执行sql语句,并且返回查询结果集rs

            rs = pstmt.executeQuery(sql);

   //如果是执行insert/delete/update等操作的时候就改为调用

   //pstmt.executeUpdate(sql);方法即可

            user = new User();

if(rs.next()) { //判断查询结果是否存在,如果存在就返回

user.setUid(rs.getInt("uid"));

user.setUsername(rs.getString("username"));

user.setTelphone(rs.getString("telphone"));

user.setLogin_pwd(rs.getString("login_pwd"));

return user;

     }

            return null;

   }catch(Exception e){

       throw new RuntimeException("数据库连接失败!"); 

   }finally{

       try{

            if(pstmt != null) pstmt.close();//关闭pstmt

            if(conn != null)  conn.close();//关闭连接

    } catch(Exception e){

        throw new RuntimeException("数据库关闭异常!");

     }

   }

 }

//获取连接的JdbcUtils中的getConnetion方法

public class JdbcUtils{

    private DataSource dataSource = new ComboPooledDataSource();

    public static DataSource getDataSource(){

       return dataSource;

    }

    public static Connection getConnection(){

      try{

        return dataSource.getConnection();

    }  catch(Exception e){

        throw new RuntimeException("获取连接出现异常!");

    }

  }

}

 

    以上就是一个小编整理的关于C3P0使用方法的小笔记,希望对各位大佬们有所帮助!



-

02

-

“QueryRunner的使用”

C3P0连接池及QueryRunner的使用


 在开发工作中,我们希望的是我们编写越少的代码实现越多的功能,我们在使用java连接数据库的时候C3P0已经帮我们解决了数据库连接问题了,接下来我们发现在对数据库(MYSQL)进行操作 insert/delete/updata/query这些操作的时候除了 sql语句 和 参数设置不同以外 insert/delete/update这三个操作其他的语句都是一摸一样的,所以可以考虑对这三个操作进行合并,query操作的时候也可以有优化的操作,那就让我们一起了解一下吧!

    

    当我们发现insert/delete/update这三个操作的不同之处之后,我们就可以考虑写一个query方法传递 sql 语句、数据库连接对象、需要设置的参数、就可以完成增删改这三个操作。这就遇到了一个问题,就是参数的设置如何实现参数的自动找到对应的类型和字段名进行设置呢?这可能需要使用反射来实现。这种种问题都早已经被解决了有请我们的QueryRunner登场吧,要说明的是该QueryRunner类是在DBUtils.jar这个包中,使用前需要导入DBUtils.jar这个jar包并且build path才可以使用。那就来看看这个这个类如何使用吧!

    

首先创建对象   QueryRunner qr = new QueryRunner(JdbcUtils.getCon

nection);得到qr对象。接着提供sql语句 String sql = "insert into user values(?,?,?,?,?)";然后提供Object [] params = {1001, "zhangsan", "15778564201", "2650230559@qq.com", "male"};最后调用update()方法,进行数据库的数据操作--> qr.update(sql,params);当然如果需要使用事务操作的时候还有一个重载的方法那就是qr.update(Connection conn,String sql, Object ... params);来手动传入连接对象conn来控制事务。

    查询方法需要了解五个结果集处理器ResultSetHandler,分别是BeanHandler、BeanListHandler、MapHandler、MapListHandler、ScalarHandler 这些结果集处理器。接下来介绍着五个结果集处理器的使用,给出代码样例如下:

    ---------------BeanHandler结果集处理器的使用!---------------

多用于查询单行数据

publicvoid fun1() throws SQLException {

       DataSource ds = JdbcUtils.getDataSource();

       QueryRunner qr = new QueryRunner(ds);

       String sql = "select * from tab_student where number=?";

Student stu = qr.query(sql, new BeanHandler<Student>(Student.class), "S_2000");

}

---------------BeanListHandler结果集处理器的使用!---------------

多用于查询多行数据

publicvoid fun2() throws SQLException {

       DataSource ds = JdbcUtils.getDataSource();

       QueryRunner qr = new QueryRunner(ds);

       String sql = "select * from tab_student";

       List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class)) ;

    }

---------------MapHandler结果集处理器的使用!---------------

用于查询单行数据并且转化为Map对象

publicvoid fun3() throws SQLException {

       DataSource ds = JdbcUtils.getDataSource();

       QueryRunner qr = new QueryRunner(ds);

       String sql = "select * from tab_student where number=?";

       Map<String,Object> map = qr.query(sql, new MapHandler() , "S_2000");

    }

    ---------------MapListHandler结果集处理器的使用!---------------

用于查询多行数据并且转化为List<Map<String,Object>>对象

    publicvoid fun4() throws SQLException {

       DataSource ds = JdbcUtils.getDataSource();

       QueryRunner qr = new QueryRunner(ds);

       String sql = "select * from tab_student";

       List<Map<String,Object>> list = qr.query(sql, new MapListHandler());

    }

   ---------------ScalarHandler结果集处理器的使用!---------------

用于查询单行单列的数据,并且返回一个数值

    publicvoid fun5() throws SQLException {

       DataSource ds = JdbcUtils.getDataSource();

       QueryRunner qr = new QueryRunner(ds);

       String sql = "select count(*) from tab_student";

       Number number = (Number)qr.query(sql, new ScalarHandler() );

       int cnt = number.intValue();

    }

 
    关于QueryRunner的批处理!代码样例如下:

    public void fun10() throws SQLException {

    DataSource ds = JdbcUtils.getDataSource();

    QueryRunner qr = new QueryRunner(ds);

    String sql = "insert into tab_student values(?,?,?,?)";

    Object[][]params = new Object[10][]; //表示要插入10行记录

    for(int i = 0; i < params.length; i++) {

       params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};

    }

    qr.batch(sql, params);  //执行批处理

}    


    以上便是小编记录的一些方法的使用代码例子,忘记怎么使用这些结果集处理器的伙伴们可以尝试采纳!

-

End

-


从事IT职业的从业人员,一定要时刻保持着对技术的熟练度和对学习的热情度,这样才能够升职加薪不被淘汰赢得一个美好的未来!




以上是关于C3P0连接池及QueryRunner的使用的主要内容,如果未能解决你的问题,请参考以下文章

c3p0和QueryRunner的结合使用,让开发更加简便

DbUtil组件及C3P0数据库连接池组件的使用

转账示例:Dao层面实现(本例采用QueryRunner来执行sql语句,数据源为C3P0)

转账示例:service层面实现(本例采用QueryRunner来执行sql语句,数据源为C3P0)

转账示例:service层面实现(线程管理Connection)(本例采用QueryRunner来执行sql语句,数据源为C3P0)

转账示例:service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)