JDBC&&c3p0事务批处理多线程 于一体的经典秘方QueryRunner (common-dbutils)

Posted 阿斯兰。līōń

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC&&c3p0事务批处理多线程 于一体的经典秘方QueryRunner (common-dbutils)相关的知识,希望对你有一定的参考价值。


目录:

基础篇_功能各自回顾

         JDBC基础代码回顾(使用JdbcUtils工具简化)                                                                  

         c3p0数据库连接池的使用(使用JdbcUtils工具简化)

         大数据的插入(使用c3p0+JdbcUtils工具简化)

         批处理操作(使用c3p0+JdbcUtils工具简化)

         数据库中的事务处理(使用c3p0+JdbcUtils工具简化)

        多线程的并发控制

进阶篇_迈向标准开发
        自己编写dbutils工具( QueryRunner 、TxQueryRunner和JdbcUtils)    (本文核心)

         封装成jar包后的标准开发--common-dbutisl和itcast-tools    (本文核心)


 

数据库使用mysql数据库,使用的表结构 :

1 CREATE TABLE tab_bin(
2     id     INT     PRIMARY KEY AUTO_INCREMENT,
3     filename    VARCHAR(100),
4     data     MEDIUMBLOB
5 );
tab_bin
1 CREATE TABLE t_user (
2   username varchar(50) DEFAULT NULL,
3   password varchar(50) DEFAULT NULL,
4   age int(11) DEFAULT NULL,
5   gender varchar(20) DEFAULT NULL
6 );
t_user
1 CREATE TABLE account (
2    id int(11) NOT NULL AUTO_INCREMENT,
3    NAME varchar(30) DEFAULT NULL,
4    balance decimal(10,0) DEFAULT NULL,
5    PRIMARY KEY (id)
6 ) ;
account
1 CREATE TABLE t_customer (
2   username VARCHAR(50) DEFAULT NULL,
3   age INT(11) DEFAULT NULL,
4   balance DOUBLE(20,5) DEFAULT NULL
5 );
t_customer

 


 

JDBC基础代码回顾

JDBC四大核心对象: 全部来自   java.sql    包下

DriverManager 注册驱动,获取Connection对象
Connection   连接对象,获取preparedStatement
PreparedStatement sql语句发送器,执行更新、查询操作
ResultSet 结果集,通过next()获取结果

 

 

 

 

项目src文件下编写dbconfig.properties配置文件:

name value
driverClassName com.mysql.jdbc.Driver
url jdbc:mysql://localhost:3306/jdbc_test01
username root
password 123456

 

 

 

 

 

 @演示

 1 package cn.kmust.jdbc.demo3.utils.version1;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.sql.Connection;
 6 import java.sql.DriverManager;
 7 import java.sql.SQLException;
 8 import java.util.Properties;
 9 /**
10  * JdbcUtils工具类
11  * @功能 从dbconfig.properties配置文件中获取四大参数,加载驱动类,完成连接数据库
12  *        返回Connection对象
13  *      
14  * @author ZHAOYUQIANG
15  *
16  */
17 public class JdbcUtils {
18     private static Properties props = null ;
19     /**
20      * 这些代码都是只执行一次的,在JdbcUtils类被加载时执行
21      */
22     static{        
23         try{
24             /*
25              * 1. 加载dbconfig.properties配置文件里面的内容到props中    
26              */
27             InputStream in= JdbcUtils.class.getClassLoader()
28                     .getResourceAsStream("dbconfig.properties");
29             props = new Properties();
30             props.load(in);    
31         }catch(IOException e){
32             throw new RuntimeException(e);
33         }
34         try{
35             /*
36              * 2. 加载驱动类
37              */
38             Class.forName(props.getProperty("driverClassName"));
39         }catch(ClassNotFoundException e){
40             throw new RuntimeException(e);
41         }
42     }
43     public static Connection getConnection() throws  SQLException{                    
44         /**
45          * 这些代码可以被反复调用,因为获取数据库连接可能需要多次获取
46          */
47         /*
48          * 3. 调用DriverManager.getConnection()得到Connection
49          */
50         return DriverManager.getConnection(
51                 props.getProperty("url"),
52                 props.getProperty("username"),
53                 props.getProperty("password"));                        
54     }
55 }
JdbcUtils类_简化代码小工具
  1 package cn.kmust.jdbc.demo3.utils.version1;
  2 
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.sql.PreparedStatement;
  8 
  9 import org.junit.Test;
 10 /**
 11  * 对数据库的操作
 12  * @功能 更新操作 和 查询操作 以及 测试
 13  *
 14  * @author ZHAOYUQIANG
 15  *
 16  */
 17 public class Demo {
 18      /**
 19       * 增、删、改
 20       * @param username
 21       * @param password
 22       * @return
 23       */
 24      public void fun1(String username,String password,int age,String gender)   {
 25            Connection con = null ; 
 26            PreparedStatement pstmt = null ;
 27    
 28             try {
 29                 /*
 30                    * 1. 连接数据库,给con赋值
 31                    * 2. 准备SQL语句
 32                    * 3. 调用 Connection对象的方法来得到PrepareStatement对象
 33                    * 4. 使用PrepareStatement对象给sql参数赋值
 34                    * 5. 使用PrepareStatement对象向数据库发送sql语句,并且返回影响记录的行数
 35                    * 6. 关闭资源。 后创建的先关闭
 36                    */                   
 37                    con = JdbcUtils.getConnection();
 38                    String sql ="INSERT INTO t_user VALUES (?,?,?,?)" ;  //sql语句中不加分号
 39 //                   String sql ="UPDATE t_user SET password=? WHERE username=?";
 40 //                   String sql ="DELETE FROM stu WHERE username=?";
 41                     pstmt = con.prepareStatement(sql);
 42                     pstmt.setString(1, username);
 43                     pstmt.setString(2, password);
 44                     pstmt.setInt(3, age);
 45                     pstmt.setString(4, gender);
 46                     int r = pstmt.executeUpdate();
 47                     System.out.println(r);    //输出影响记录的行数
 48             } catch (Exception e) {
 49                 throw new RuntimeException(e);            
 50             } finally{                
 51                 if (pstmt !=null) 
 52                     try{ pstmt.close();}catch (Exception e){throw new RuntimeException(e);}
 53                 if (con != null) 
 54                     try{ con.close();}catch (Exception e){throw new RuntimeException(e);}
 55             }                           
 56      }
 57      /**
 58       * 查询数据库
 59       */
 60       @Test
 61      public void  fun2() {
 62         Connection con = null ; 
 63         PreparedStatement pstmt = null ;
 64         ResultSet rs = null ;   
 65        try {
 66            /*
 67             * 1. 连接数据库,给con赋值
 68             * 2. 准备SQL语句
 69             * 3. 调用 Connection对象的方法来得到PrepareStatement对象
 70             * 4. 使用PrepareStatement对象给sql参数赋值
 71             * 5. 使用PrepareStatement对象向数据库发送sql语句,并且返回ResultSet对象的结果集(就是一个表)
 72             * 6. 调用ResultSet的boolean next()方法 遍历结果集的每行记录,方法返回的true和false代表光标指针所指的这一行有没有记录
 73             * 7. 调用ResultSet的getXXX(第几列)/getXXX("列名字")方法  返回当前行记录的列数据。其中,getObject和getString 能够获得所有的类型       
 74             * 8. 关闭资源。 后创建的先关闭
 75             */
 76             con = JdbcUtils.getConnection(); 
 77             String sql = "select * from t_user where username=? and password=? " ;
 78             pstmt = con.prepareStatement(sql);
 79             pstmt.setString(1, "zhaoLiu");
 80             pstmt.setString(2, "123456");                      
 81             rs=pstmt.executeQuery();
 82             while(rs.next()){        
 83                 String name = rs.getString(2);//可以用列名字 : String name = rs.getString("sname");
 84                 String password = rs.getString("password");    
 85                 int age = rs.getInt("age");
 86                 String gender = rs.getString("gender");
 87                 System.out.println("名字"+name+",密码"+password+",年龄"+age+",性别"+gender);
 88            }
 89         } catch (Exception e) {
 90             throw new RuntimeException(e);
 91         } finally{
 92             if (rs != null)
 93                 try{ rs.close();}catch (Exception e){throw new RuntimeException(e);}
 94             if (pstmt !=null) 
 95                 try{ pstmt.close();}catch (Exception e){throw new RuntimeException(e);}
 96             if (con != null) 
 97                 try{ con.close();}catch (Exception e){throw new RuntimeException(e);}
 98        }        
 99       }
100 
101       /**
102        *  测试增删改 
103        */
104       @Test
105       public void fun1Test(){
106           String username="zhaoLiu" ;
107           String password ="123456";
108           int age = 12 ;
109           String gender = "男";
110           fun1(username,password,age,gender);
111       }    
112 }
Dao类_操作/测试数据库

c3p0数据库连接池的使用

c3p0数据库连接池 :   数据库的很多连接对象都放在池中被管理着,谁用谁去租,用完归还就行了。 c3p0就是一个比较不错的池子 。

DataSource对象也在 java.sql  包下

项目src文件下编写c3p0-config.xml配置文件(文件中也给出了oracle的配置模版):(@注意:配置文件的名称c3p0-config.xml是一个官方给定的标准,不是随意起的名字)

@演示

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <c3p0-config>
 3     <default-config><!-- 这是默认的配置信息 -->
 4         <!-- 连接四大参数配置 -->
 5         <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_test01</property>
 6         <property name="driverClass">com.mysql.jdbc.Driver</property>
 7         <property name="user">root</property>
 8         <property name="password">123456</property>
 9         <!-- 池本身的参数配置 -->
10         <property name="acquireIncrement">3</property>
11         <property name="initialPoolSize">10</property>
12         <property name="minPoolSize">2</property>
13         <property name="maxPoolSize">10</property>
14     </default-config>
15     
16     <!-- 专门为oracle准备的配置信息 -->
17     <!-- 这也是命名配置信息,在JDBC中创建连接池对象的时候要加 oracle-config这个参数-->
18     <named-config name="oracle-config">
19         <property name="jdbcUrl">  oracle的url   </property>
20         <property name="driverClass">  oracle的驱动   </property>
21         <property name="user">    oracle的用户 </property>
22         <property name="password">    密码</property>
23         <property name="acquireIncrement">3</property>
24         <property name="initialPoolSize">10</property>
25         <property name="minPoolSize">2</property>
26         <property name="maxPoolSize">10</property>
27     </named-config>
28     
29 </c3p0-config>
c3p0-config.xml
 1 package cn.kmust.jdbc.demo9.c3p0Pool.utils.version2;
 2 
 3 import java.sql.Connection;
 4 import java.sql.SQLException;
 5 
 6 import javax.sql.DataSource;
 7 
 8 import com.mchange.v2.c3p0.ComboPooledDataSource;
 9 /**
10  * JdbcUtils工具类     [c3p0数据库连接池专用工具类]
11  *   需要编写c3p0-config.xml配置文件
12  * @功能 利用c3p0-config.xml配置文件获取连接对象并且返回 。 连接池对象也返回
13  * @c3p0说明   借用池中的Connection对象,用完归还
14  *           需要编写c3p0-config.xml文件,里面有四大连接参数和池子本身的参数配置
15  *           文件不需要说明在什么位置,因为在创建连接池对象时,这个对象会自动加载配置文件
16  * @author ZHAOYUQIANG
17  *
18  */
19 public class JdbcUtils {
20     /*
21      * 1. 创建连接池对象
22      *      创建时自动加载c3p0-config.xml配置文件
23      *      如果是配置文件中是命名配置,如oracle,那么构造器的参数指定命名配置为元素的名称,也就是说代码要变成如下形式:
24      *            ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle-config");
25      */
26     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
27     /**
28      * 使用连接池返回一个连接对象
29      * @return
30      * @throws SQLException
31      */
32     public static Connection getConnection() throws SQLException{
33         return dataSource.getConnection();
34     }
35     /**
36      * 返回池对象
37      * @return
38      */
39     public static DataSource getDataSource(){
40         return dataSource;
41     }
42 }
JdbcUtis工具类_c3p0版本
 1 package cn.kmust.jdbc.demo9.c3p0Pool.utils.version2;
 2 
 3 import java.beans.PropertyVetoException;
 4 import java.sql.Connection;
 5 import java.sql.SQLException;
 6 
 7 import org.junit.Test;
 8 
 9 import com.mchange.v2.c3p0.ComboPooledDataSource;
10 
11 /**
12  * Test
13  * @功能  通过JdbcUtils工具获取池子中的一个连接对象,并且输出这个连接,查看是否获取到了
14  *
15  * @author ZHAOYUQIANG
16  *
17  */
18 public class Demo01 {
19     @Test
20     public void fun() throws SQLException {
21         /*
22          * 1. 通过c3p0专属的JdbcUtils工具[版本2]直接获取连接
23          * 2. 把连接归还给池子
24          */
25         Connection con = JdbcUtils.getConnection();
26         /**
27          * 此处代码进行sql的操作,本次省略。
28          */
29         System.out.println(con);
30         con.close();
31     }
32 }
Test类_查看获取的连接

大数据的插入(使用c3p0+JdbcUtls简化代码)

 @解决的问题  如何向mysql中插入一部10M左右的.mp3文件 ???

MySQL中提供存储大数据的类型如下:(@注意 标准SQL中提供的类型并非如下类型,请自行百度)

以上是关于JDBC&&c3p0事务批处理多线程 于一体的经典秘方QueryRunner (common-dbutils)的主要内容,如果未能解决你的问题,请参考以下文章

JDBC学习笔记——数据库连接池(dbcp&C3P0)

JDBC事务处理&批量处理

JDBC学习笔记——事务的隔离级别&批量处理

在 Hibernate/C3P0 中处理连接池耗尽并避免死锁

Spring源码窥探之:声明式事务

数据库连接池&Spring JDBC(JdbcTemplate)

(c)2006-2024 SYSTEM All Rights Reserved IT常识

类型  长度
tinytext 28-1 B(256B)
text 216-1B(64K)
mediumtext 224-1B(16M)
longtext