时间:2021-07-01 10:21:17 帮助过:10人阅读
基础篇_功能各自回顾
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四大核心对象: 全部来自 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就是一个比较不错的池子 。
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类_查看获取的连接
@解决的问题 如何向mysql中插入一部10M左右的.mp3文件 ???
MySQL中提供存储大数据的类型如下:(@注意 标准SQL中提供的类型并非如下类型,请自行百度)
类型 | 长度 |
tinytext | 28-1 B(256B) |
text | 216-1B(64K) |
mediumtext | 224-1B(16M) |
longtext | 232-1B(4G) |
待插入文件地址 : D:\十年.mp3
待下载文件地址: E:\十年.mp3
@使用 c3p0数据库连接池的使用 中的c3p0-config.xml 和JdbcUtils工具
@演示
1 package cn.kmust.jdbc.demo4.bigData; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.sql.Blob; 8 import java.sql.Connection; 9 import java.sql.PreparedStatement; 10 import java.sql.ResultSet; 11 12 import javax.sql.rowset.serial.SerialBlob; 13 14 import org.apache.commons.io.IOUtils; 15 import org.junit.Test; 16 17 import cn.kmust.jdbc.demo3.utils.version1.JdbcUtils; 18 19 /** 20 * 大数据,把mp3保存到mysql数据库的表中 21 * 22 * @author ZHAOYUQIANG 23 * 24 */ 25 public class BigData{ 26 /** 27 * 把tmp3保存到数据库中 28 */ 29 @Test 30 public void fun1(){ 31 Connection con = null ; 32 PreparedStatement pstmt = null ; 33 try{ 34 con = JdbcUtils.getConnection(); 35 String sql = "insert into tab_bin values(?,?,?)"; 36 pstmt =con.prepareStatement(sql); 37 pstmt.setInt(1, 1); 38 pstmt.setString(2,"十年.mp3"); 39 /** 40 * 向数据库中存入mp3音乐 41 * 数据库中存储音乐的类型是要用大小是0~16MB的Blob类型 42 * 要做的事情是把硬盘中.mp3文件变成Blob类型,然后存入到数据库中 43 */ 44 /* 45 * 1. 将流文件变成字节数组 46 * 导入小工具包: Commons-io.jar 47 * 2. 使用字节数组创建Blob对象 48 */ 49 byte[] bytes = IOUtils.toByteArray(new FileInputStream("D:/十年.mp3")); 50 Blob blob = new SerialBlob(bytes) ; 51 pstmt.setBlob(3, blob); 52 pstmt.executeUpdate(); 53 }catch(Exception e){ 54 throw new RuntimeException(e); 55 }finally{ 56 if (pstmt !=null) 57 try{ pstmt.close();}catch (Exception e){throw new RuntimeException(e);} 58 if (con != null) 59 try{ con.close();}catch (Exception e){throw new RuntimeException(e);} 60 } 61 62 } 63 /** 64 * 从数据库读取mp3 65 * 抛异常的语句简写 66 */ 67 @Test 68 public void fun2()throws Exception{ 69 Connection con = null ; 70 PreparedStatement pstmt = null ; 71 ResultSet rs =null ; 72 con = JdbcUtils.getConnection(); 73 String sql = "select * from tab_bin"; 74 pstmt = con.prepareStatement(sql); 75 rs = pstmt.executeQuery();