JDBC&&c3p0事务批处理多线程 于一体的经典秘方QueryRunner (common-dbutils)
Posted 阿斯兰。līōń
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC&&c3p0事务批处理多线程 于一体的经典秘方QueryRunner (common-dbutils)相关的知识,希望对你有一定的参考价值。
目录:
基础篇_功能各自回顾
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 );
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 );
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 ) ;
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 );
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 }
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 }
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>
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 }
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 }
大数据的插入(使用c3p0+JdbcUtls简化代码)
@解决的问题 如何向mysql中插入一部10M左右的.mp3文件 ???
MySQL中提供存储大数据的类型如下:(@注意 标准SQL中提供的类型并非如下类型,请自行百度)
类型 | 长度 |
tinytext | 28-1 B(256B) |
text | 216-1B(64K) |
mediumtext | 224-1B(16M) |
longtext | 以上是关于JDBC&&c3p0事务批处理多线程 于一体的经典秘方QueryRunner (common-dbutils)的主要内容,如果未能解决你的问题,请参考以下文章 |