天天看点

JDBC的梳理

JDBC的概述

  1. JDBC是一种用于执行SQL语句的Java API。
  2. JDBC可以为多种关系数据库提供统一访问入口。
  3. JDBC由一组Java工具类和接口组成。

原生JDBC

JDBC开发步骤

  1. 注册驱动.
  2. 获得连接.
  3. 获得语句执行者
  4. 执行sql语句
  5. 处理结果
  6. 释放资源.

代码实现

  • 预处理对象
    • conn.prepareStatement(sql)
  • 执行SQL语句
    • int executeUpdate(); —–>执行insert update delete语句.
    • ResultSet executeQuery(); ——>执行select语句.
    • boolean execute(); ——>执行select返回true 执行其他的语句返回false.

         

    • 设置实际参数
    • setXxxx(int , T) ——–>通过setter方法将?占位符替换成实际参数

      例如:setString() 实际参数类型为hi字符串。

代码实现

//注册驱动

Class.forName("com.mysql.jdbc.Driver");
        //获得Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "root");
        //获得可以执行sql的对象 Statement/PreparedStatement
        String sql = "select * from user where username=? and password=?";
        //预编译sql
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //为预编译的sql填充数据
        pstmt.setString(, "tom");
        pstmt.setString(, "123");
        //执行sql
        ResultSet rs = pstmt.executeQuery();
        //遍历ResultSet
        if(rs.next()){
            System.out.println(rs.getInt("id"));
            System.out.println(rs.getString("username"));
            System.out.println(rs.getString("password"));
            System.out.println(rs.getString("email"));
        }

        //关闭资源
        rs.close();
        pstmt.close();
        conn.close();

    }
           

引入连接池

DBCP连接池

  • 引入相应jar包
  • 编写配置文件
  • 配置文件 xx.properties中有命名格式要求
    • 配置文件一般放置在src文件夹中,这样可以自动备份到bin目录
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///web09
username=root
password=root
           
  • 编写工具类
    • 静态代码块获得数据源:BasicDataSourceFactory.createDataSource(prop);
    • 提供获得数据源的方法:getDateSource
    • 提供获得连接的方法:getConnection

C3P0连接池

  • 引入响应jar包
  • 编写配置文件
  • 编写工具类
    • 获取数据源:ComboPooledDataSource
    • 提供获得数据源的方法:getDataSource
    • 提供获得连接的方法:getConnection

DBUtils工具类

  • JavaBean组件
    • JavaBean就是一个类,在开发中常用语封装数据。具有如下特性
    • 1.需要实现接口:java.io.Serializable ,通常偷懒省略了。
    • 2.提供私有字段:private 类型 字段名;
    • 3.提供getter/setter方法:
    • 4.提供无参构造

Dbutils三个核心功能介绍

  • QueryRunner中提供对sql语句操作的API.
  • ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
  • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner核心类

  • QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection
  • update(String sql, Object… params) ,执行更新数据
  • query(String sql, ResultSetHandler rsh, Object… params) ,执行查询

ResultSetHandler结果集处理类

- ArrayHandler  将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
- ArrayListHandler  将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
- BeanHandler   将结果集中第一条记录封装到一个指定的javaBean中。
- BeanListHandler   将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
- ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
- MapHandler    将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
- MapListHandler    将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
- ScalarHandler 它是用于单数据。例如select count(*) from 表操作。
           

事务

事务的概述

  • 什么是事务(理解)
    • 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
  • 事务的作用(理解)
    • 保证在一个事务中多次操作要么全都成功,要么全都失败.

JDBC中对事务的操作

  • Connection 连接的api
    • setAutoCommit(false):开始一个手动事务
    • commit():事务提
    • rollback():事务回滚

DBUtils中对事务的操作

  • 三个核心对象:
    • QueryRunner:操作sql语句
      • new QueryRunner();//手动事务
      • new QueryRunner();//手动事务, 调用方法的时候,需要手动的传入一个Connection对象,conn需要我们自己手动的释放,手动的管理事务
    • 对应的方法:
      • update(Connection conn,String sql …..);
      • query(Connection conn,String sql ….);
    • DbUtils:控制事务,释放资源
    • ResultSetHandler:封装结果集

ThreadLocal

  • java.lang.ThreadLocal该类提供了线程局部变量,用于在当前线程中共享数据.ThreadLocal工具类底层就是一个Map,key存放的是当前线程,value存放的是共享数据

事物的特性

  • 事务的特性(面试)
    • 原子性(了解)
      • 原子性:事务里面的操作不可切割,要么全部成功,要么全部失败.
    • 一致性(了解)
      • 一致性:事务提交或者回滚之后的状态要和其他的业务状态保持一致.
    • 隔离性(了解)
      • 隔离性:一个事务的操作,尽量不要受其他事务的干扰.
    • 持久性(了解)
      • 持久性:一旦事务提交了或者回滚了,终要把数据持久化到数据库中.

安全性/隔离级别

  • 安全性排序
    • serializable>repeatable read>read committed>read uncommitted
    • 完美>幻读(mysql)>不可重复读>脏读
  • 脏读
    • 一个事务中读取到了另一个事务没有提交的数据
  • 不可重复读
    • 在一个事务中,两次查询结果不一致(针对update操作)
  • 幻读
    • 在一个事务中,两次查询结果不一致(针对的是insert操作)