第一个JDBC程序

创建测试数据库

  1. CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci;
  2. USE jdbcStudy;
  3. CREATE TABLE users(
  4. id INT PRIMARY KEY,
  5. NAME VARCHAR(40),
  6. PASSWORD VARCHAR(40),
  7. email VARCHAR(60),
  8. birthday DATE
  9. )
  10. INSERT INTO users(id,NAME,PASSWORD,email,birthday)
  11. VALUES(1,'zhangsan','123456','zs@sina.com','1980-12-04'),
  12. (2,'lisi','123456','lisi@sina.com','1981-12-04'),
  13. (3,'wangwu','123456','wangwu@sina.com','1979-12-04');
  1. 创建一个普通项目
  2. 导入数据库驱动
  3. 编写测试代码
  1. import java.sql.*;
  2. //我的第一个JDBC程序
  3. public class JdbcFirstDemo {
  4. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  5. //1. 加载驱动
  6. Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动
  7. //2. 用户信息和url
  8. String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
  9. String username = "root";
  10. String password = "123456";
  11. //3. 连接成功,返回数据库对象
  12. Connection connection = DriverManager.getConnection(url, username, password);
  13. //4. 执行SQL的对象
  14. Statement statement = connection.createStatement();
  15. //5. 执行SQL的对象 去 执行SQL,可能存在结果,查看返回结果
  16. String sql = "SELECT * FROM users";
  17. ResultSet resultSet = statement.executeQuery(sql); //返回的结果集,结果集中封装了我们全部的查询出来的结果
  18. while (resultSet.next()){
  19. System.out.println("id="+resultSet.getObject("id"));
  20. System.out.println("name="+resultSet.getObject("NAME"));
  21. System.out.println("pwd="+resultSet.getObject("PASSWORD"));
  22. System.out.println("email="+resultSet.getObject("email"));
  23. System.out.println("birth="+resultSet.getObject("birthday"));
  24. System.out.println("=================================");
  25. }
  26. //6. 释放连接
  27. resultSet.close();
  28. statement.close();
  29. connection.close();
  30. }
  31. }

步骤总结:

  1. 加载驱动
  2. 连接数据库DriverManager.getConnection
  3. 获得执行sql的对象 Statement
  4. 获得返回的结果集
  5. 释放连接

DriverManager

  1. //1. 加载驱动
  2. //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  3. Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动
  4. Connection connection = DriverManager.getConnection(url, username, password);
  5. // connection 代表数据库
  6. // 数据库设置自动提交
  7. // 事务提交
  8. // 事务回滚
  9. connection.rollback();
  10. connection.commit();
  11. connection.setAutoCommit();

URL

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

Statement 执行SQL的对象 PrepareStatement 执行SQL的对象

  1. String sql = "SELECT * FROM users"; //编写SQL
  2. statement.executeQuery(); //查询操作返回 ResultSet
  3. statement.execute(); // 执行任何SQL
  4. statement.executeUpdate(); // 更新、插入、删除。都是用这个,返回一个受影响的行数

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

获得指定的数据类型

  1. resultSet.getObject(); // 在不知道列类型的情况下使用
  2. // 如果知道列的类型就使用指定的类型
  3. resultSet.getString();
  4. resultSet.getInt();
  5. resultSet.getFloat();
  6. resultSet.getDouble();
  7. resultSet.getDate();
  8. ....

遍历,指针

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

释放资源

  1. //6. 释放资源
  2. resultSet.close();
  3. statement.close();
  4. connection.close(); // 耗资源,用完关掉!

statement对象

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

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

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

CRUD操作-create

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

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

CRUD操作-delete

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

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

CRUD操作-update

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

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

CRUD操作-read

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

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

代码实现

1、提取工具类

  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
  3. username=root
  4. password=123456
  5. ==========================================================================
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.sql.*;
  9. import java.util.Properties;
  10. public class JdbcUtils {
  11. private static String driver = null;
  12. private static String url = null;
  13. private static String username = null;
  14. private static String password = null;
  15. static{
  16. try{
  17. InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
  18. Properties properties = new Properties();
  19. properties.load(in);
  20. driver = properties.getProperty("driver");
  21. url = properties.getProperty("url");
  22. username = properties.getProperty("username");
  23. password = properties.getProperty("password");
  24. //1.驱动只用加载一次
  25. Class.forName(driver);
  26. }catch(IOException | ClassNotFoundException e){
  27. e.printStackTrace();
  28. }
  29. }
  30. //获取连接
  31. public static Connection getConnection() throws SQLException {
  32. return DriverManager.getConnection(url,username,password);
  33. }
  34. //释放连接资源
  35. public static void release(Connection conn, Statement st, ResultSet rs){
  36. if (rs!=null){
  37. try {
  38. rs.close();
  39. } catch (SQLException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. if (st!=null){
  44. try {
  45. st.close();
  46. } catch (SQLException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. if (conn!=null){
  51. try {
  52. conn.close();
  53. } catch (SQLException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. }

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

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class TestInsert {
  7. public static void main(String[] args) {
  8. Connection conn = null;
  9. Statement st = null;
  10. ResultSet rs = null;
  11. try {
  12. conn = JdbcUtils.getConnection();//获取数据库连接
  13. st = conn.createStatement();//获得SQL的执行对象
  14. String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,email,birthday)" +
  15. "VALUES(4,'kuangshen','123456','24736743@qq.com','2020-01-01')";
  16. int i = st.executeUpdate(sql);
  17. if (i>0){
  18. System.out.println("插入成功!");
  19. }
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. } finally {
  23. JdbcUtils.release(conn,st,rs);
  24. }
  25. }
  26. }
  27. ==================================================================
  28. import com.kuang.lesson02.utils.JdbcUtils;
  29. import java.sql.Connection;
  30. import java.sql.ResultSet;
  31. import java.sql.SQLException;
  32. import java.sql.Statement;
  33. public class TestDelete {
  34. public static void main(String[] args) {
  35. Connection conn = null;
  36. Statement st = null;
  37. ResultSet rs = null;
  38. try {
  39. conn = JdbcUtils.getConnection();//获取数据库连接
  40. st = conn.createStatement();//获得SQL的执行对象
  41. String sql = "DELETE FROM users WHERE id=4;";
  42. int i = st.executeUpdate(sql);
  43. if (i>0){
  44. System.out.println("删除成功!");
  45. }
  46. } catch (SQLException e) {
  47. e.printStackTrace();
  48. } finally {
  49. JdbcUtils.release(conn,st,rs);
  50. }
  51. }
  52. }
  53. ================================================================
  54. import com.kuang.lesson02.utils.JdbcUtils;
  55. import java.sql.Connection;
  56. import java.sql.ResultSet;
  57. import java.sql.SQLException;
  58. import java.sql.Statement;
  59. public class TestUpdate {
  60. public static void main(String[] args) {
  61. Connection conn = null;
  62. Statement st = null;
  63. ResultSet rs = null;
  64. try {
  65. conn = JdbcUtils.getConnection();//获取数据库连接
  66. st = conn.createStatement();//获得SQL的执行对象
  67. String sql = "UPDATE users SET `NAME` = 'kuangshen' WHERE id=1;";
  68. int i = st.executeUpdate(sql);
  69. if (i>0){
  70. System.out.println("更新成功!");
  71. }
  72. } catch (SQLException e) {
  73. e.printStackTrace();
  74. } finally {
  75. JdbcUtils.release(conn,st,rs);
  76. }
  77. }
  78. }

3、查询,executeQuery

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class TestSelect {
  7. public static void main(String[] args) {
  8. Connection conn = null;
  9. Statement st = null;
  10. ResultSet rs = null;
  11. try {
  12. conn = JdbcUtils.getConnection();
  13. st = conn.createStatement();
  14. String sql = "SELECT * FROM users WHERE `id` = 1;";
  15. rs = st.executeQuery(sql);
  16. while (rs.next()){
  17. System.out.println(rs.getString("NAME"));
  18. }
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }finally {
  22. JdbcUtils.release(conn,st,rs);
  23. }
  24. }
  25. }

SQL注入的问题

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

  1. import java.sql.Connection;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;
  5. public class SQL注入 {
  6. public static void main(String[] args) {
  7. // login("kuangshen","123456");
  8. login(" 'or '1=1"," 'or '1=1"); //技巧
  9. }
  10. // 登陆业务
  11. public static void login(String username,String password){
  12. Connection conn = null;
  13. Statement st = null;
  14. ResultSet rs = null;
  15. try {
  16. conn = JdbcUtils.getConnection();
  17. st = conn.createStatement();
  18. //SELECT * FROM users WHERE `NAME`='kuangshen' AND `PASSWORD`='123456'
  19. //SELECT * FROM users WHERE `NAME`=' 'or '1=1' AND `PASSWORD`=' 'or '1=1'
  20. String sql = "SELECT * FROM users WHERE `NAME` = '"+username+"' AND `password` ='"+password+"'";
  21. rs = st.executeQuery(sql);
  22. while (rs.next()){
  23. System.out.println(rs.getString("NAME"));
  24. System.out.println(rs.getString("password"));
  25. }
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }finally {
  29. JdbcUtils.release(conn,st,rs);
  30. }
  31. }
  32. }

PreparedStatement对象

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

1、新增

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.*;
  3. import java.util.Date;
  4. public class TestInsert {
  5. public static void main(String[] args) {
  6. Connection conn = null;
  7. PreparedStatement st = null;
  8. try {
  9. conn = JdbcUtils.getConnection();
  10. //区别
  11. //使用?占位符代替参数
  12. String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";
  13. st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行
  14. //手动给参数赋值
  15. st.setInt(1,4);
  16. st.setString(2,"qinjiang");
  17. st.setString(3,"123456");
  18. st.setString(4,"24736743@qq.com");
  19. //注意点:sql.Date 数据库 java.sql.Date()
  20. // util.Date Java new Date().getTime() 获得时间戳
  21. st.setDate(5,new java.sql.Date(new Date().getTime()));
  22. //执行
  23. int i = st.executeUpdate();
  24. if (i>0){
  25. System.out.println("插入成功!");
  26. }
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }finally {
  30. JdbcUtils.release(conn,st,null);
  31. }
  32. }
  33. }

2、删除

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.SQLException;
  5. import java.util.Date;
  6. public class TestDelete {
  7. public static void main(String[] args) {
  8. Connection conn = null;
  9. PreparedStatement st = null;
  10. try {
  11. conn = JdbcUtils.getConnection();
  12. //区别
  13. //使用?占位符代替参数
  14. String sql = "delete from users where id=?";
  15. st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行
  16. //手动给参数赋值
  17. st.setInt(1,4);
  18. //执行
  19. int i = st.executeUpdate();
  20. if (i>0){
  21. System.out.println("删除成功!");
  22. }
  23. } catch (SQLException e) {
  24. e.printStackTrace();
  25. }finally {
  26. JdbcUtils.release(conn,st,null);
  27. }
  28. }
  29. }

3、更新

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.SQLException;
  5. public class TestUpdate {
  6. public static void main(String[] args) {
  7. Connection conn = null;
  8. PreparedStatement st = null;
  9. try {
  10. conn = JdbcUtils.getConnection();
  11. //区别
  12. //使用?占位符代替参数
  13. String sql = "update users set `NAME` = ? where id=?;";
  14. st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行
  15. //手动给参数赋值
  16. st.setString(1,"狂神");
  17. st.setInt(2,1);
  18. //执行
  19. int i = st.executeUpdate();
  20. if (i>0){
  21. System.out.println("更新成功!");
  22. }
  23. } catch (SQLException e) {
  24. e.printStackTrace();
  25. }finally {
  26. JdbcUtils.release(conn,st,null);
  27. }
  28. }
  29. }

4、查询

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. public class TestSelect {
  7. public static void main(String[] args) {
  8. Connection conn = null;
  9. PreparedStatement st = null;
  10. ResultSet rs = null;
  11. try {
  12. conn = JdbcUtils.getConnection();
  13. String sql = "select * from users where id=?";//编写SQL
  14. st = conn.prepareStatement(sql);//预编译
  15. st.setInt(1,1);//传递参数
  16. rs = st.executeQuery();//执行
  17. if (rs.next()){
  18. System.out.println("查询成功!");
  19. System.out.println(rs.getString("NAME"));
  20. }
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

5、防止SQL注入

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. public class SQL注入 {
  6. public static void main(String[] args) {
  7. login("lisi","123456");
  8. //login("'' or 1=1","123456"); //技巧
  9. }
  10. // 登陆业务
  11. public static void login(String username,String password){
  12. Connection conn = null;
  13. PreparedStatement st = null;
  14. ResultSet rs = null;
  15. try {
  16. conn = JdbcUtils.getConnection();
  17. //PreparedStatement 防止SQL诸如的本质,把传递进来的参数当作字符
  18. //假设其中存在转义字符,比如说 ' 会被直接转义
  19. String sql = "select * from users where `NAME` = ? and `PASSWORD` = ?;";
  20. st = conn.prepareStatement(sql);
  21. st.setString(1,username);
  22. st.setString(2,password);
  23. rs = st.executeQuery(sql);//查询完毕会返回一个结果集
  24. while (rs.next()){
  25. System.out.println(rs.getString("NAME"));
  26. System.out.println(rs.getString("password"));
  27. }
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }finally {
  31. JdbcUtils.release(conn,st,rs);
  32. }
  33. }
  34. }

使用IDEA连接数据库

1、

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

更新数据

切换数据库

IDEA实现事务

要么都成功,要么都失败

ACID原则

原子性:要么全部完成,要么都不完成

一致性:总数不变

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

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

隔离性的问题:

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

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

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

代码实现

1、开启事务 conn.setAutoCommit(false);

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

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

  1. import com.kuang.lesson02.utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. public class TestTransaction1 {
  7. public static void main(String[] args) {
  8. Connection conn = null;
  9. PreparedStatement st = null;
  10. ResultSet rs = null;
  11. try {
  12. conn = JdbcUtils.getConnection();
  13. //关闭数据库的自动提交,自动会开启事务
  14. conn.setAutoCommit(false);
  15. String sql1 = "update account set money = money-100 where name = 'A'";
  16. st = conn.prepareStatement(sql1);
  17. st.executeUpdate();
  18. int x = 1/0; //报错
  19. String sql2 = "update account set money = money+100 where name = 'B'";
  20. st = conn.prepareStatement(sql2);
  21. st.executeUpdate();
  22. //业务完毕,提交事务
  23. conn.commit();
  24. System.out.println("成功!");
  25. } catch (SQLException e) {
  26. //如果失败,则默认回滚
  27. /*try {
  28. conn.rollback();//如果失败则回滚事务
  29. } catch (SQLException ex) {
  30. ex.printStackTrace();
  31. }*/
  32. e.printStackTrace();
  33. }finally {
  34. JdbcUtils.release(conn,st,null);
  35. }
  36. }
  37. }

数据库连接池

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

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

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

------ 开门 --- 业务员:等待 --- 服务 --- 关门

常用连接数 10个

最小连接数:10

最大连接数:15 业务最高承载上限

排队等待,

等待超时:100ms

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

开源数据源实现(拿来即用)

DBCP

C3P0

Druid:阿里巴巴

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

DBCP

需要用到的 jar 包

commons-dbcp-1.4、commons-pool-1.6

  1. //Java的src文件夹下设置properties配置文件
  2. #连接设置
  3. driverClassName=com.mysql.jdbc.Driver
  4. url=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true
  5. username=root
  6. password=123456
  7. #<!-- 初始化连接 -->
  8. initialSize=10
  9. #最大连接数量
  10. maxActive=50
  11. #<!-- 最大空闲连接 -->
  12. maxIdle=20
  13. #<!-- 最小空闲连接 -->
  14. minIdle=5
  15. #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
  16. maxWait=60000
  17. #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
  18. #注意:"user" 与 "password" 两个属性会被明确的传递,因此这里不需要包含他们。
  19. connectionProperties=useUnicode=true;characterEncoding=UTF8
  20. #指定由连接池所创建的连接的自动提交(auto-commit)状态。
  21. defaultAutoCommit=true
  22. #driver default 指定由连接池所创建的连接的只读(read-only)状态。
  23. #如果没有设置该值,则"setReadOnly"方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
  24. defaultReadOnly=
  25. #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
  26. #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE
  27. defaultTransactionIsolation=READ_UNCOMMITTED
  28. ===================================
  29. import com.kuang.lesson02.utils.JdbcUtils;
  30. import org.apache.commons.dbcp.BasicDataSourceFactory;
  31. import javax.sql.DataSource;
  32. import java.io.InputStream;
  33. import java.sql.*;
  34. import java.util.Properties;
  35. public class JdbcUtils_DBCP {
  36. private static DataSource dataSource;
  37. static{
  38. try{
  39. InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
  40. Properties properties = new Properties();
  41. properties.load(in);
  42. //创建数据源 工厂模式--> 创建
  43. dataSource = BasicDataSourceFactory.createDataSource(properties);
  44. }catch(Exception e){
  45. e.printStackTrace();
  46. }
  47. }
  48. //获取连接
  49. public static Connection getConnection() throws SQLException {
  50. return dataSource.getConnection();//从数据源中获取连接
  51. }
  52. //释放连接资源
  53. public static void release(Connection conn, Statement st, ResultSet rs){
  54. if (rs!=null){
  55. try {
  56. rs.close();
  57. } catch (SQLException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. if (st!=null){
  62. try {
  63. st.close();
  64. } catch (SQLException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. if (conn!=null){
  69. try {
  70. conn.close();
  71. } catch (SQLException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. }
  76. }
  77. ===================================
  78. import com.kuang.lesson05.utils.JdbcUtils_DBCP;
  79. import java.sql.Connection;
  80. import java.sql.PreparedStatement;
  81. import java.sql.SQLException;
  82. import java.util.Date;
  83. public class TestDBCP {
  84. public static void main(String[] args) {
  85. Connection conn = null;
  86. PreparedStatement st = null;
  87. try {
  88. conn = JdbcUtils_DBCP.getConnection();
  89. //区别
  90. //使用?占位符代替参数
  91. String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";
  92. st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行
  93. //手动给参数赋值
  94. st.setInt(1,4);
  95. st.setString(2,"qinjiang");
  96. st.setString(3,"123456");
  97. st.setString(4,"24736743@qq.com");
  98. //注意点:sql.Date 数据库 java.sql.Date()
  99. // util.Date Java new Date().getTime() 获得时间戳
  100. st.setDate(5,new java.sql.Date(new Date().getTime()));
  101. //执行
  102. int i = st.executeUpdate();
  103. if (i>0){
  104. System.out.println("插入成功!");
  105. }
  106. } catch (SQLException e) {
  107. e.printStackTrace();
  108. }finally {
  109. JdbcUtils_DBCP.release(conn,st,null);
  110. }
  111. }
  112. }

C3P0

需要用到的 jar 包

commons-dbcp-1.4、 commons-pool-1.6

  1. //Java的src文件夹下设置XML配置文件
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <c3p0-config>
  4. <!--
  5. C3P0的缺省(默认)配置,
  6. 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)
  7. -->
  8. <default-config>
  9. <property name="driverClass">com.mysql.jdbc.Driver</property>
  10. <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true</property>
  11. <property name="user">root</property>
  12. <property name="password">123456</property>
  13. <property name="acquireIncrement">5</property>
  14. <property name="initialPoolSize">10</property>
  15. <property name="minPoolSize">5</property>
  16. <property name="maxPoolSize">20</property>
  17. </default-config>
  18. <!--
  19. C3P0的命名配置,
  20. 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是nameMySQL
  21. -->
  22. <named-config name="MySQL">
  23. <property name="driverClass">com.mysql.jdbc.Driver</property>
  24. <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true</property>
  25. <property name="user">root</property>
  26. <property name="password">123456</property>
  27. <property name="acquireIncrement">5</property>
  28. <property name="initialPoolSize">10</property>
  29. <property name="minPoolSize">5</property>
  30. <property name="maxPoolSize">20</property>
  31. </named-config>
  32. </c3p0-config>
  33. ==================================
  34. import com.mchange.v2.c3p0.ComboPooledDataSource;
  35. import javax.sql.DataSource;
  36. import java.sql.Connection;
  37. import java.sql.ResultSet;
  38. import java.sql.SQLException;
  39. import java.sql.Statement;
  40. public class JdbcUtils_C3P0 {
  41. private static DataSource dataSource;
  42. static{
  43. try{
  44. //代码版配置
  45. /*dataSource = new ComboPooledDataSource();
  46. dataSource.setDriverClass();
  47. dataSource.setUser();
  48. dataSource.setPassword();
  49. dataSource.setJdbcUrl();
  50. dataSource.setMaxPoolSize();
  51. dataSource.setMinPoolSize();*/
  52. //创建数据源 工厂模式--> 创建
  53. dataSource = new ComboPooledDataSource("MySQL");//配置文件写法
  54. }catch(Exception e){
  55. e.printStackTrace();
  56. }
  57. }
  58. //获取连接
  59. public static Connection getConnection() throws SQLException {
  60. return dataSource.getConnection();//从数据源中获取连接
  61. }
  62. //释放连接资源
  63. public static void release(Connection conn, Statement st, ResultSet rs){
  64. if (rs!=null){
  65. try {
  66. rs.close();
  67. } catch (SQLException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. if (st!=null){
  72. try {
  73. st.close();
  74. } catch (SQLException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. if (conn!=null){
  79. try {
  80. conn.close();
  81. } catch (SQLException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. }
  87. ===================================
  88. import com.kuang.lesson05.utils.JdbcUtils_C3P0;
  89. import java.sql.Connection;
  90. import java.sql.PreparedStatement;
  91. import java.sql.SQLException;
  92. import java.util.Date;
  93. public class TestC3P0 {
  94. public static void main(String[] args) {
  95. Connection conn = null;
  96. PreparedStatement st = null;
  97. try {
  98. conn = JdbcUtils_C3P0.getConnection();//原来是自己实现的,现在用别人实现的
  99. //区别
  100. //使用?占位符代替参数
  101. String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";
  102. st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行
  103. //手动给参数赋值
  104. st.setInt(1,5);
  105. st.setString(2,"qinjiang");
  106. st.setString(3,"123456");
  107. st.setString(4,"24736743@qq.com");
  108. //注意点:sql.Date 数据库 java.sql.Date()
  109. // util.Date Java new Date().getTime() 获得时间戳
  110. st.setDate(5,new java.sql.Date(new Date().getTime()));
  111. //执行
  112. int i = st.executeUpdate();
  113. if (i>0){
  114. System.out.println("插入成功!");
  115. }
  116. } catch (SQLException e) {
  117. e.printStackTrace();
  118. }finally {
  119. JdbcUtils_C3P0.release(conn,st,null);
  120. }
  121. }
  122. }

结论

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

Java的JDBC的更多相关文章

  1. Java的JDBC操作

    Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...

  2. JAVA使用JDBC技术操作SqlServer数据库执行存储过程

    Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带 ...

  3. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  4. Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

    Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子   时间:2012-11-20 17:54:02   Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...

  5. JAVA使用jdbc连接MYSQL简单示例

    以下展示的为JAVA使用jdbc连接MYSQL简单示例: import java.sql.DriverManager; import java.sql.ResultSet; import java.s ...

  6. 基于CDH5.x 下面使用eclipse 操作hive 。使用java通过jdbc连接HIVESERVICE 创建表

    基于CDH5.x 下面使用eclipse 操作hive .使用java通过jdbc连接HIVESERVICE 创建表 import java.sql.Connection; import java.s ...

  7. java之JDBC

    java之JDBC 一.什么是JDBC Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提 ...

  8. java 调用jdbc 实现excel和csv的导入和导出

    jdbc 的连接 实体类 package com.gpdi.mdata.web.manage.database.data;public class DBQueryData {private Strin ...

  9. Java的JDBC事务详解

    Java的JDBC事务详解         分类:             Hibernate              2010-06-02 10:04     12298人阅读     评论(9) ...

  10. Java数据库连接--JDBC调用存储过程,事务管理和高级应用

    相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...

随机推荐

  1. c++和c中const的区别

    const在c与c++的区别与使用 大学期间对c和c++的了解太少了,现在工作了导致自己来恶补,简单的const关键字里面的学问还是挺大的,越是基础的知识越是容易忘却,所以今天开始记录着自己每一天的学 ...

  2. RabbitMQ,RocketMQ,Kafka 消息模型对比分析

    消息模型 消息队列的演进 消息队列模型 发布订阅模型 RabbitMQ的消息模型 交换器的类型 direct topic fanout headers Kafka的消息模型 RocketMQ的消息模型 ...

  3. CF31B Sysadmin Bob 题解

    Content 给定一个字符串 \(s\),请将其分解为诸如 \(\texttt{xx@xx}\) 的子串,并将分解后的所有子串输出,或者说不存在这样的方案. 数据范围:\(1\leqslant|s| ...

  4. CF1492A Three swimmers 题解

    Update \(\texttt{2021.3.9}\) 修改了题解中的错别字. \(\texttt{2021.12.16}\) 修改了一个没括回的区间. Content 有 \(3\) 个游泳者,同 ...

  5. 缓存系统redis操作、mongdb、memeche

    mongdb :默认数据持久化,存在内存的同时也向硬盘写数据. redis:可配置数据持久化,默认数据在内存中 memeche:only support 内存模式 redis操作 https://ww ...

  6. Jenkins安装部署使用图文详解(非常详细)

    前言 最近公司需要弄一套自动化运维部署,于是抽空学习了一下,用了两天左右完成Jenkins的安装部署和各种项目的配置化,于是整理一下进行分享. 介绍 Jenkins是一个独立的开源软件项目,是基于Ja ...

  7. Caused by: redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write against a read only slave.

    Caused by: redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write against a rea ...

  8. CMake之常用内置变量和message用法

    关于 cmake 定义了相当丰富的变量,然而,我常用的也就那几个 脑子笨,记不住变量的值时,我会使用cmake的message函数输出变量值 为什么要写这个? 最近尝试使用Modern CMake, ...

  9. 【LeetCode】716. Max Stack 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双栈 日期 题目地址:https://leetcode ...

  10. 【LeetCode】910. Smallest Range II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...