第一章.JDBC介绍

1.什么是JDBC

  1. (1)Java DataBase Connectivity(Java数据库连接)
  2. (2)JDBC 可让Java通过程序操作关系型数据库(MySQL)
  3. (3)JDBC基于驱动程序实现与数据库的连接和操作

2.JDBC的优点

  1. (1)统一的API,提供一致的开发过程
  2. (2)易于学习,容易上手,代码结构稳定
  3. (3)功能强大,执行效率高,可处理海量数据

第二章.JDBC开发流程

1.快速上手JDBC

  1. public class StandardJDBCSample {
  2. public static void main(String[] args) {
  3. Connection coon = null;
  4. try {
  5. //1.加载并注册JDBC驱动
  6. Class.forName("com.mysql.cj.jdbc.Driver");
  7. //2.创建数据库连接
  8. coon = DriverManager.getConnection("jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
  9. "root", "321074");
  10. //3.创建Statemen对象
  11. Statement stmt = coon.createStatement();
  12. ResultSet rs = stmt.executeQuery("Select * from employee");
  13. //4.遍历查询结果
  14. while (rs.next()) {
  15. Integer eno = rs.getInt(1);
  16. String ename = rs.getString("ename");
  17. float salary = rs.getFloat("salary");
  18. String dname = rs.getString("dname");
  19. System.out.println(dname + "-" + eno + "-" + ename + "-" + salary);
  20. }
  21. }catch(Exception e){
  22. e.printStackTrace();
  23. }finally{
  24. //5.关闭连接,释放资源
  25. try {
  26. if (coon != null && coon.isClosed() == false) {
  27. coon.close();
  28. }
  29. }catch(Exception e){
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }

2.SQL注入攻击

  • SQL注入攻击是指利用SQL漏洞越权获取数据的黑客行为
  • SQL注入攻击的根源是未对原始SQL中的敏感字符做特殊处理
  • 解决方法:放弃Statement改用PreparedStatement处理SQL
  1. select * from employee where dname =' ' or 1=1 or 1 = ''

3. PreparedStatement介绍

  1. (1)PreparedStatement(预编译Statement)是Statement的子接口
  2. (2)PreparedStatement对SQL进行参数化,预防SQL注入攻击
  3. (3)PreparedStatement比Statement的执行效率更高
  1. public class StandardJDBCSample {
  2. public static void main(String[] args) {
  3. Connection coon = null;
  4. try {
  5. //1.加载并注册JDBC驱动
  6. Class.forName("com.mysql.cj.jdbc.Driver");
  7. //2.创建数据库连接
  8. coon = DriverManager.getConnection("jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
  9. "root", "321074");
  10. String sql = "Select * from employee where id = ?";
  11. //3.创建PreparedStatemen对象
  12. PreparedStatement pstmt = coon.PreparedStatement(sql);
  13. pstmt.setInt(1,1);
  14. ResultSet rs = pstmt.executeQuery();
  15. //4.遍历查询结果
  16. while (rs.next()) {
  17. Integer eno = rs.getInt(1);
  18. String ename = rs.getString("ename");
  19. float salary = rs.getFloat("salary");
  20. String dname = rs.getString("dname");
  21. System.out.println(dname + "-" + eno + "-" + ename + "-" + salary);
  22. }
  23. }catch(Exception e){
  24. e.printStackTrace();
  25. }finally{
  26. //5.关闭连接,释放资源
  27. try {
  28. if (coon != null && coon.isClosed() == false) {
  29. coon.close();
  30. }
  31. }catch(Exception e){
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. }

注意:

  1. 执行查询操作时调用的是executeQuery()方法,返回的是ResultSet对象
  2. 执行增删改操作时调用的是executeUpdate()方法,返回的是有几条数据受到影响(Int类型)

第三章.通过Druid创建数据库连接池

1.Druid介绍

  1. Druid是阿里巴巴开源连接池组件,是最好的连接池之一
  2. Druid对数据库连接进行有效管理和重用,最大化程序执行效率
  3. 连接池负责创建和管理连接,程序只负责取用和归还

2.方式一.通过代码进行设置

  1. @Test
  2. public void test() throws SQLException {
  3. //第一步:建立一个数据库连接池
  4. DruidDataSource dataSource = new DruidDataSource();
  5. //第二步:设置连接池的参数
  6. dataSource.setUrl("jdbc:mysql://localhost:3306/myemployees");
  7. dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  8. dataSource.setUsername("root");
  9. dataSource.setPassword("123321");
  10. // 第三步:获取连接
  11. Connection connection = dataSource.getConnection();
  12. System.out.println(connection);
  13. }

3.方式二.通过配置文件方式创建数据库连接池对象

配置文件 druid-config.properties

  1. driverClassName=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8
  3. username=root
  4. password=321074
  5. initialSize=10
  6. maxActive=20

代码:

  1. @Test
  2. public void test2() throws Exception {
  3. Properties p = new Properties();
  4. FileInputStream fis = new FileInputStream("druid.properties");
  5. p.load(fis);
  6. //通过druid的工厂类创建DataSource对象
  7. DataSource dataSource = DruidDataSourceFactory.createDataSource(p);
  8. //获取数据库连接对象
  9. Connection connection = dataSource.getConnection();
  10. System.out.println(connection);
  11. }

第四章.DBUtils工具类

1.介绍

  1. DBUtils是Apache提供的开源JDBC 工具类
  2. 它是对JDBC的简单封装,学习成本极低
  3. 使用DBUtils可以极大简化JDBC编码工作量

2.Druid + DBUtils联合使用

  1. public class DbUtilsSample {
  2. public static void query(){
  3. Properties properties = new Properties();
  4. String propertyFile = DbUtilsSample.class.getResource("/druid-config.properties").getPath();
  5. try {
  6. propertyFile = new URLDecoder().decode(propertyFile, "UTF-8");
  7. properties.load(new FileInputStream(propertyFile)) ;
  8. DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  9. //利用Apache Dbutils大幅简化了数据的提取过程
  10. QueryRunner qr = new QueryRunner(dataSource);
  11. /*
  12. query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
  13. conn : 数据库连接对象
  14. sql : sql语句
  15. ResultSetHandler :此接口用于处理数据库查询操作得到的结果集。不同的结果集的情形,由其不同的子类来实现
  16. BeanHandler : 返回一条数据
  17. BeanListHandler : 返回多条数据
  18. params :给占位符赋值的内容
  19. */
  20. List<Employee> list = qr.query("select * from employee limit ?,10",new BeanListHandler<>(Employee.class),new Object[]{10});
  21. for(Employee emp : list){
  22. System.out.println(emp.getEname());
  23. }
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. public static void main(String[] args) {
  29. query();
  30. }
  31. }

第五章.事务

1.什么是事务

  1. 事务是一种可靠的,一致的方式,访问和操作数据库的程序单元
  2. 通俗来讲,要么把事情做完,要么什么都不做,不要做一半
  3. 事务依赖于数据库实现MySQL通过事务区作为数据缓冲地带
  1. 事务的ACID(acid)属性
  2. 1. 原子性(Atomicity)
  3. 2. 一致性(Consistency)
  4. 3. 隔离性(Isolation)
  5. 4. 持久性(Durability)

2.JDBC两种事务模式

2.1.自动提交事务模式

  1. 自动提交模式是指每执行一次写操作SQL,自动提交事务
  2. 自动提交开启方法:conn.setAutoCommit(true)
  3. 自动提交事务是JDBC默认行为,此模式无法保证多数据一致性

2.2.手动提交事务模式

  1. 手动提交模式是指显式调用commit()和rollback()方法管理事务
  2. 手动提交开启方法:conn.setAutoCommit(false)
  3. 手动提交事务可保证多数据一致性,但必须手动调用提交/回滚方法

3.案例

  1. /*
  2. 数据库事务 --- 通过事务去操作账户
  3. 案例 :
  4. AA给BB转账
  5. AA 2000
  6. BB 2000
  7. try{
  8. 开启事务-禁止自动提交
  9. 1.AA减掉1000元---修改mysql表中的数据
  10. System.out.println(1/0);
  11. 2.BB加上1000元---修改mysql表中的数据
  12. 事务提交
  13. }catch(Exception e){
  14. 事务回滚
  15. }finaly{
  16. 开启自动提交
  17. }
  18. */
  1. public class AccountDemo {
  2. public static void main(String[] args) {
  3. //1.获取数据库连接对象
  4. Connection connection = null;
  5. PreparedStatement ps = null;
  6. try {
  7. //1.获取数据库连接对象
  8. connection = JDBCUtils.getConnection();
  9. //2.预编译
  10. ps = connection.prepareStatement("update account set balance=? where name=?");
  11. //开启事务-禁止自动提交
  12. connection.setAutoCommit(false);
  13. //3.给占位符赋值 -- 把aa的账户减掉1000
  14. ps.setInt(1, 1000);
  15. ps.setString(2, "aa");
  16. //4.执行sql语句
  17. ps.executeUpdate();
  18. //System.out.println(1 / 0);
  19. //3.给占位符赋值 -- 把cc的账户加上1000
  20. ps.setInt(1, 3000);
  21. ps.setString(2, "bb");
  22. //4.执行sql语句
  23. ps.executeUpdate();
  24. //5.事务提交
  25. connection.commit();
  26. }catch (Exception e){
  27. e.printStackTrace();
  28. //事务回滚
  29. try {
  30. connection.rollback();
  31. } catch (SQLException ex) {
  32. ex.printStackTrace();
  33. }
  34. }finally {
  35. //1.允许自动提交
  36. try {
  37. connection.setAutoCommit(true);
  38. } catch (SQLException e) {
  39. e.printStackTrace();
  40. }
  41. //2.关闭资源
  42. JDBCUtils.close(ps,connection);
  43. }
  44. }
  45. }