JDBC

JDBC

1、JDBC(重点)

1.1、数据库驱动

驱动:声卡,显卡,数据库

我们的程序会通过 数据库 驱动,来和数据库打交道!

1.2、JDBC

SUN 公司为了简化 开发人员的(对数据库的统一)操作,提供了一个(Java操作数据库的)规范,俗称 JDBC

这些规范的实现由具体的厂商实现~

对于开发人员来说,我们只需要掌握 JDBC 接口的操作即可!

java.sql

javax.sql

还需要导入一个数据库驱动包 mysql-connector-java-8.0.27.jar !

 

1.3、第一个JDBC程序

创建测试数据库

 CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci;
 ​
 USE jdbcStudy;
 ​
 CREATE TABLE `users`(
 id INT PRIMARY KEY,
 NAME VARCHAR(40),
 PASSWORD VARCHAR(40),
 email VARCHAR(60),
 birthday DATE
 );
 ​
 INSERT INTO `users`(id,NAME,PASSWORD,email,birthday)
 VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'),
 (2,'lisi','123456','lisi@sina.com','1981-12-04'),
 (3,'wangwu','123456','wangwu@sina.com','1979-12-04')
 ​

 

1、创建一个普通项目

2、导入数据库驱动

 

3、编写测试代码

 package com.kuang.lesson01;
 ​
 import java.sql.*;
 ​
 //我的第一个jdbc程序
 public class JdbcFirstDemo {
     public static void main(String[] args) throws ClassNotFoundException, SQLException {
         //1.加载驱动
         Class.forName("com.mysql.cj.jdbc.Driver");//固定写法,加载驱动
 ​
         //2.用户信息和url
         // useUnicode=true&characterEncoding=utf8&useSSL=true
         String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
         String username = "root";
         String password = "mysqlstart"; //使用自己的密码
         //3.连接成功,数据库对象 Connection  代表数据库
         Connection connection = DriverManager.getConnection(url, username, password);
 ​
         //4. 执行SQL的对象   Statement   执行sql的对象
         Statement statement = connection.createStatement();
 ​
         //5.执行SQL的对象 去 执行SQL,可能存在结果,查看返回结果
         String sql = "SELECT * FROM `user`";
 ​
         ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部的查询出来的结果
 ​
         while (resultSet.next()){
             System.out.println("id="+resultSet.getObject("id"));
             System.out.println("name="+resultSet.getObject("NAME"));
             System.out.println("password="+resultSet.getObject("PASSWORD"));
             System.out.println("email="+resultSet.getObject("email"));
             System.out.println("birth="+resultSet.getObject("birthday"));
             System.out.println("==================");
         }
 ​
         //6.释放连接
 ​
         resultSet.close();
         statement.close();
         connection.close();
 ​
     }
 }

步骤总结:

  1. 加载驱动

  2. 连接数据库 DriverManager

  3. 获得执行sql的对象 Statement

  4. 获得返回的结果集

  5. 释放连接

 

DriverManager

 //DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());   //DriverManager.registerDriver(new Driver());
 Class.forName("com.mysql.cj.jdbc.Driver");//固定写法,加载驱动
 Connection connection = DriverManager.getConnection(url, username, password);
 ​
 //Connection  代表数据库
 // 数据库设置自动提交
 // 事务回滚
 // 事务提交
 ​
 connection.commit();
 connection.setAutoCommit();
 connection.rollback();

 

URL

 String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
 ​
 //mysql --  3306
 //协议://主机地址:端口号/数据库名?参数1&参数2&参数3
 ​
 //oracle  -- 1521
 //jdbc:oracle:thin:@localhost:1521:sid

 

Statement 执行SQL的对象 prepareStatement 执行SQL 的对象

 String sql = "SELECT * FROM `user`";//编写SQL
 ​
 statement.executeQuery();//查询操作返回 ResultSet
 statement.execute();//执行任意SQL
 statement.executeUpdate();//更新、插入、删除。都是用这个,返回一个受影响的行数
 statement.executeBatch();//执行多行SQL  了解

 

ResultSet 查询的结果集:封装了所有的查询对象

获得指定的数据类型

 resultSet.getObject();//在不知道列类型的情况下使用
 //  如果知道列的类型就使用指定的类型
 resultSet.getString();
 resultSet.getInt();
 resultSet.getFloat();
 resultSet.getDate();
 resultSet.getDouble();
 .....

遍历,指针

 resultSet.beforeFirst();  //移动到最前面
 resultSet.afterLast();  //移动到最后面
 resultSet.next();   //移动到下一个数据
 resultSet.previous();   //移动到前一行
 resultSet.absolute(row);    //移动到指定行

 

释放资源

 //6.释放连接
 resultSet.close();
 statement.close();
 connection.close(); //耗资源,用完关掉!

 

1.4、statement对象

jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。

Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果ResultSet对象。

 

CRUD操作-creat

使用executeUpdate(String sql)方法完成数据添加操作,示例操作:

 Statement st = conn.createStatement();
 String sql = "insert into user(...) values(...)";
 int num = st.executeUpdate(sql);
 if(num>0){
   System.out.println("插入成功!!!");
 }

 

 

CRUD操作-delete

使用executeUpdate(String sql)方法完成数据删除操作,示例操作:

 Statement st = conn.createStatement();
 String sql = "delete from user where id=1";
 int num = st.executeUpdate(sql);
 if(num>0){
   System.out.println("删除成功!!!");
 }

 

CRUD操作-update

使用executeUpdate(String sql)方法完成数据删除操作,示例操作:

 Statement st = conn.createStatement();
 String sql = "update user set name='' where name=''";
 int num = st.executeUpdate(sql);
 if(num>0){
   System.out.println("修改成功!!!");
 }

 

 

CRUD操作-query

使用executeUpdate(String sql)方法完成数据查询操作,示例操作:

 Statement st = conn.createStatement();
 String sql = "select * from user where id=1";
 ResultSet rs = st.executeQuery(sql);
 while(rs.next()){
   //根据获得列的数据类型,分别调用rs的相应方法映射到java对象中
 }

 

db.properties

 driver=com.mysql.cj.jdbc.Driver
 url=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true
 username=root
 password=mysqlstart

 

代码实现

1、提取工具类

 package com.kuang.lesson02.utils;
 ​
 import java.io.IOException;
 import java.io.InputStream;
 import java.sql.*;
 import java.util.Properties;
 ​
 public class JdbcUtils {
 ​
     private static String driver = null;
     private static String url = null;
     private static String username = null;
     private static String password = null;
 ​
     static {
 ​
         try {
             InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
             Properties properties = new Properties();
             properties.load(in);
 ​
 ​
             driver = properties.getProperty("driver");
             url = properties.getProperty("url");
             username = properties.getProperty("username");
             password = properties.getProperty("password");
 ​
 ​
             //1.驱动只用加载一次
             Class.forName(driver);
 ​
             } catch (IOException e) {
                 e.printStackTrace();
             } catch (ClassNotFoundException e) {
                 e.printStackTrace();
             }
 ​
         }
 ​
     //获得连接
     public static Connection getConnection() throws SQLException {
         return DriverManager.getConnection(url, username, password);
     }
 ​
 ​
     //释放连接资源
     public static void release(Connection conn, Statement st, ResultSet rs){
         if (rs!=null){
             try {
                 rs.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if (st!=null){
             try {
                 st.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if (conn!=null){
             try {
                 conn.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
     }
 ​
 }

2、编写增删改的方法,executeUpdate

 package com.kuang.lesson02;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 ​
 public class TestInsert {
 ​
     public static void main(String[] args) {
 ​
         Connection conn = null;
         Statement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();//获得数据库连接
             st = conn.createStatement();//获得SQL的执行对象
             String sql = "INSERT INTO `user`(id,`NAME`,`PASSWORD`,`email`,`birthday`)" +
                     "VALUES(4,'kuangshen','123456','2724964601@qq.com','2022-02-12')";
 ​
             int i = st.executeUpdate(sql);
             if (i>0){
                 System.out.println("插入成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
     }
 ​
 }

 

 package com.kuang.lesson02;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 ​
 public class TestDelete {
 ​
     public static void main(String[] args) {
 ​
         Connection conn = null;
         Statement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();//获得数据库连接
             st = conn.createStatement();//获得SQL的执行对象
             String sql = "DELETE FROM `user` WHERE id = 4";
 ​
             int i = st.executeUpdate(sql);
             if (i>0){
                 System.out.println("删除成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
 ​
     }
 }

 

 package com.kuang.lesson02;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 public class TestUpdate {
 ​
     public static void main(String[] args) {
 ​
         Connection conn = null;
         Statement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();//获得数据库连接
             st = conn.createStatement();//获得SQL的执行对象
             String sql = "UPDATE `user` SET `NAME`='kuangshen',`email`='2724964601@qq.com' WHERE id=1";
 ​
             int i = st.executeUpdate(sql);
             if (i>0){
                 System.out.println("更新成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
     }
 }

3、编写查询的方法,executeQuery

 package com.kuang.lesson02;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 ​
 public class TestSelect {
     public static void main(String[] args) {
 ​
         Connection conn = null;
         Statement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
             st = conn.createStatement();
 ​
             //SQL
             String sql = "select * from user where id = 1";
 ​
             rs = st.executeQuery(sql);//查询完毕会返回一个结果集
 ​
             while (rs.next()){
                 System.out.println(rs.getString("NAME"));
             }
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
 ​
     }
 }

 

SQL注入问题

sql 存在漏洞,会被攻击导致数据泄露,SQL会被拼接 or

 package com.kuang.lesson02;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 ​
 public class SQL注入 {
     public static void main(String[] args) {
 ​
         //login("kuangshen","123456");正常登录
         login("' or '1=1","' or '1=1");
     }
 ​
     public static void login(String username,String password){
         Connection conn = null;
         Statement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
             st = conn.createStatement();
             //SELECT * FROM `user` WHERE `NAME`='kuangshen' AND `PASSWORD` = '123456';
 ​
             //SELECT * FROM `user` WHERE `NAME`='' or '1=1' AND `PASSWORD` = '' or '1=1';
             String sql = "SELECT * FROM `user` WHERE `NAME`='"+username+"' AND `PASSWORD`='"+password+"'";
 ​
             rs = st.executeQuery(sql);//查询完毕会返回一个结果集
 ​
             while (rs.next()){
                 System.out.println(rs.getString("NAME"));
                 System.out.println(rs.getString("PASSWORD"));
             }
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
     }
 }

 

1.5、PreparedStatement对象

PreparedStatement可以防止SQL注入,效率更好!

1、增加

 package com.kuang.lesson03;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 ​
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Date;
 ​
 public class TestInsert {
 ​
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement st = null;
 ​
         try {
              conn = JdbcUtils.getConnection();
              //区别
              //使用 ? 占位符代替参数
             String sql = "insert into user(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)values (?,?,?,?,?)";
 ​
             st = conn.prepareStatement(sql);//预编译SQL,先写SQL然后不执行
 ​
             //手动给参数赋值
             st.setInt(1,4);
             st.setString(2,"qinjiang");
             st.setString(3,"231321");
             st.setString(4,"2724964601@qq.com");
             //注意点: sql.Date     数据库   java.sql.Date()
             //        util.Date    JAVA     new Date().getTime() 获得时间戳
             st.setDate(5,new java.sql.Date(new Date().getTime()));
 ​
             //执行
             int i = st.executeUpdate();
             if (i>0){
                 System.out.println("插入成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,null);
         }
     }
 }

 

2、删除

 package com.kuang.lesson03;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Date;
 ​
 public class TestDelete {
 ​
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement st = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
             //区别
             //使用 ? 占位符代替参数
             String sql = "delete from user where id=?";
 ​
             st = conn.prepareStatement(sql);//预编译SQL,先写SQL然后不执行
 ​
             //手动给参数赋值
             st.setInt(1,4);
 ​
             int i = st.executeUpdate();
             if (i>0){
                 System.out.println("删除成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,null);
         }
     }
 }

 

3、修改

 package com.kuang.lesson03;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 ​
 public class TestUpdate {
 ​
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement st = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
             //区别
             //使用 ? 占位符代替参数
             String sql = "update user set `NAME` = ? where id=?;";
 ​
             st = conn.prepareStatement(sql);//预编译SQL,先写SQL然后不执行
 ​
             //手动给参数赋值
             st.setString(1,"狂神");
             st.setInt(2,1);
 ​
             int i = st.executeUpdate();
             if (i>0){
                 System.out.println("更新成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,null);
         }
     }
 }

 

4、查询

 package com.kuang.lesson03;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 ​
 public class TestSelect {
 ​
     public static void main(String[] args) {
 ​
         Connection conn = null;
         PreparedStatement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
 ​
             String sql = "select * from user where id= ? ";
 ​
             st = conn.prepareStatement(sql);//预编译
 ​
             st.setInt(1,1);//传递参数
 ​
             rs = st.executeQuery();//执行
 ​
             if (rs.next()){
                 System.out.println(rs.getString("NAME"));
             }
 ​
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
     }
 }

 

5、SQL注入

 package com.kuang.lesson03;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.*;
 ​
 public class SQL注入 {
     public static void main(String[] args) {
 ​
         login("lisi","123456");//正常登录
         //login("' or '1=1","' or '1=1");
     }
 ​
     //登录业务
     public static void login(String username,String password){
         Connection conn = null;
         PreparedStatement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
             //  PreparedStatement 防止SQL注入的本质,把传递进来的参数当做字符
             //  假设其中存在转义字符,比如说 ` 会被直接转义
             String sql = "select * from user where `NAME`=? and `PASSWORD`=?";//Mybatis
 ​
             st =  conn.prepareStatement(sql);
 ​
             st.setString(1,username);
             st.setString(2,password);
 ​
             rs = st.executeQuery();//查询完会返回一个结果集
             while (rs.next()){
                 System.out.println(rs.getString("NAME"));
                 System.out.println(rs.getString("PASSWORD"));
             }
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
     }
 }

 

1.6、使用IDEA连接数据库

如果侧边栏没有找到,在IDEA左下角

连接成功后,可以选择数据库

双击数据库

1.7、事务

ACID原则

原子性:要么都完成,要么都失败!

一致性:总数不变

隔离性:多个进程互不干扰

持久性:一旦提交不可逆,持久化到数据库了

 

隔离性的问题:

脏读:一个事务读取了另一个没有提交的事务

不可重复度:在同一个事务内,重复读取表中的数据,表数据发生了改变

虚度(幻读):在一个事务内,读取到了别人插入的数据,导致前后读出来的结果不一样

 

代码实现

1、开启事务

2、一组业务执行完毕,提交事务

3、可以catch 语句中显示的定义 回滚语句,但默认是失败就会回滚

 package com.kuang.lesson04;
 ​
 import com.kuang.lesson02.utils.JdbcUtils;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 ​
 public class TestTransaction2 {
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement st = null;
         ResultSet rs = null;
 ​
         try {
             conn = JdbcUtils.getConnection();
             //关闭数据库的自动提交,自动会开启事务
             conn.setAutoCommit(false);//开启事务
 ​
             String sql1 = "update account set money = money-100 where name ='A'";
             st = conn.prepareStatement(sql1);
             st.executeUpdate();
 ​
             int x = 1/0;//报错
 ​
             String sql2 = "update account set money = money+100 where name ='B'";
             st = conn.prepareStatement(sql2);
             st.executeUpdate();
 ​
             //业务完毕,提交事务
             conn.commit();
             System.out.println("成功!");
 ​
         } catch (SQLException e) {
             //如果失败,则默认回滚!
 //            try {
 //                conn.rollback();//如果失败就回滚事务
 //            } catch (SQLException ex) {
 //                ex.printStackTrace();
 //            }
         }finally {
             JdbcUtils.release(conn,st,rs);
         }
     }
 }
 ​

 

1.8、数据库连接池

 

数据库连接- - -执行完毕- -释放

连接- - 释放 十分浪费资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

 

最小连接数:10

最大连接数:15

等待超时:100ms

 

编写连接池,实现一个接口 DataSource

 

开源数据源实现

DBCP

C3P0

Druid:阿里巴巴

 

使用了这些数据库连接池之后,我们在项目中就不需要编写连接数据库的代码了!

 

DBCP

需要用到的 jar 包

commons-pool-1.6.jar、commons-dbcp-1.4.jar

 

测试代码

dbcpconfig-properties

 #连接配置  这里面的名字,是DBCP数据源中定义好的
 driverClassName=com.mysql.jdbc.Driver
 url=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true
 username=root
 password=mysqlstart
 ​
 #<!-- 初始化连接 -->
 initialSize=10
 ​
 #最大连接数量
 maxActive=50
 ​
 #<!-- 最大空闲连接 -->
 maxIdle=20
 ​
 #<!-- 最小空闲连接 -->
 minIdle=5
 ​
 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
 maxWait=60000
 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
 #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
 connectionProperties=useUnicode=true;characterEncoding=UTF8
 ​
 #指定由连接池所创建的连接的自动提交(auto-commit)状态。
 defaultAutoCommit=true
 ​
 #driver default 指定由连接池所创建的连接的只读(read-only)状态。
 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
 defaultReadOnly=
 ​
 #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
 defaultTransactionIsolation=READ_UNCOMMITTED

提取工具类 utils

 package com.kuang.lesson05.utils;
 ​
 import org.apache.commons.dbcp.BasicDataSource;
 import org.apache.commons.dbcp.BasicDataSourceFactory;
 ​
 import javax.sql.DataSource;
 import java.io.IOException;
 import java.io.InputStream;
 import java.sql.*;
 import java.util.Properties;
 ​
 public class JdbcUtils_DBCP {
 ​
     private static DataSource dataSource = null;
 ​
     static {
 ​
         try {
             InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig-properties");
             Properties properties = new Properties();
 ​
                 properties.load(in);
 ​
 ​
                 //创建数据源  工厂模式-->创建
 ​
                 dataSource = BasicDataSourceFactory.createDataSource(properties);
 ​
 ​
             } catch (Exception e) {
                 e.printStackTrace();
 ​
         }
     }
 ​
 ​
     //获得连接
     public static Connection getConnection() throws SQLException {
         return dataSource.getConnection();//从数据源中获得连接
     }
 ​
 ​
     //释放连接资源
     public static void release(Connection conn, Statement st, ResultSet rs){
         if (rs!=null){
             try {
                 rs.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if (st!=null){
             try {
                 st.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if (conn!=null){
             try {
                 conn.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
     }
 ​
 }

 

代码测试

 package com.kuang.lesson05;
 ​
 import com.kuang.lesson05.utils.JdbcUtils_DBCP;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Date;
 ​
 public class TestInsert {
 ​
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement st = null;
 ​
         try {
              conn = JdbcUtils_DBCP.getConnection();
              //区别
              //使用 ? 占位符代替参数
             String sql = "insert into user(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)values (?,?,?,?,?)";
 ​
             st = conn.prepareStatement(sql);//预编译SQL,先写SQL然后不执行
 ​
             //手动给参数赋值
             st.setInt(1,4);
             st.setString(2,"qinjiang");
             st.setString(3,"231321");
             st.setString(4,"2724964601@qq.com");
             //注意点: sql.Date     数据库   java.sql.Date()
             //        util.Date    JAVA     new Date().getTime() 获得时间戳
             st.setDate(5,new java.sql.Date(new Date().getTime()));
 ​
             //执行
             int i = st.executeUpdate();
             if (i>0){
                 System.out.println("插入成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils_DBCP.release(conn,st,null);
         }
     }
 }

 

 

C3P0

需要用到的 jar 包

mchange-commons-java-0.2.20.jar、c3p0-0.9.5.5.jar

配置c3p0

c3p0-config.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <c3p0-config>
     <!--
 c3p0的缺省(默认)配置
 如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)-->
     <default-config>
         <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
         <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=true&amp;serverTimezone=UTC</property>
         <property name="user">root</property>
         <property name="password">mysqlstart</property>
 ​
         <property name="acquiredIncrement">5</property>
         <property name="initialPoolSize">10</property>
         <property name="minPoolSize">5</property>
         <property name="maxPoolSize">20</property>
     </default-config>
 ​
     <named-config name="MYSQL">
 ​
             <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
             <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=true&amp;serverTimezone=UTC</property>
             <property name="user">root</property>
             <property name="password">mysqlstart</property>
 ​
             <property name="acquiredIncrement">5</property>
             <property name="initialPoolSize">10</property>
             <property name="minPoolSize">5</property>
             <property name="maxPoolSize">20</property>
 ​
     </named-config>
 ​
 ​
 </c3p0-config>
 package com.kuang.lesson05.utils;
 ​
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import org.apache.commons.dbcp.BasicDataSourceFactory;
 ​
 import javax.sql.DataSource;
 import java.io.InputStream;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Properties;
 ​
 public class JdbcUtils_C3P0 {
 ​
     private static ComboPooledDataSource dataSource = null;
 ​
     static {
 ​
         try {
             //代码版配置
 //            dataSource = new ComboPooledDataSource();
 //            dataSource.setDriverClass();
 //            dataSource.setUser();
 //            dataSource.setPassword();
 //            dataSource.setJdbcUrl();
 //
 //            dataSource.setMaxPoolSize();
 //            dataSource.setMinPoolSize();
 ​
                 //创建数据源  工厂模式-->创建
 ​
                 dataSource =  new ComboPooledDataSource("MYSQL");//配置文件写法 ,如果不写就是默认的
 ​
 ​
             } catch (Exception e) {
                 e.printStackTrace();
 ​
         }
     }
 ​
 ​
     //获得连接
     public static Connection getConnection() throws SQLException {
         return dataSource.getConnection();//从数据源中获得连接
     }
 ​
 ​
     //释放连接资源
     public static void release(Connection conn, Statement st, ResultSet rs){
         if (rs!=null){
             try {
                 rs.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if (st!=null){
             try {
                 st.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if (conn!=null){
             try {
                 conn.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
     }
 ​
 }

代码测试

 package com.kuang.lesson05;
 ​
 import com.kuang.lesson05.utils.JdbcUtils_C3P0;
 import com.kuang.lesson05.utils.JdbcUtils_DBCP;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Date;
 ​
 public class TestC3P0 {
 ​
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement st = null;
 ​
         try {
              conn = JdbcUtils_C3P0.getConnection();//原来是自己实现的,现在用别人实现的
              //区别
              //使用 ? 占位符代替参数
             String sql = "insert into user(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)values (?,?,?,?,?)";
 ​
             st = conn.prepareStatement(sql);//预编译SQL,先写SQL然后不执行
 ​
             //手动给参数赋值
             st.setInt(1,5);
             st.setString(2,"qinjiang");
             st.setString(3,"231321");
             st.setString(4,"2724964601@qq.com");
             //注意点: sql.Date     数据库   java.sql.Date()
             //        util.Date    JAVA     new Date().getTime() 获得时间戳
             st.setDate(5,new java.sql.Date(new Date().getTime()));
 ​
             //执行
             int i = st.executeUpdate();
             if (i>0){
                 System.out.println("插入成功!");
             }
 ​
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JdbcUtils_C3P0.release(conn,st,null);
         }
     }
 }

 

 

结论

无论使用什么数据源,本质还是一样的,DateSource接口不会变,方法就不会变!

 

Druid

Apache

 

posted @ 2022-02-12 18:51  nakano_may  阅读(66)  评论(0编辑  收藏  举报