JDBC的概述
- JDBC是一种用于执行SQL语句的Java API。
- JDBC可以为多种关系数据库提供统一访问入口。
- JDBC由一组Java工具类和接口组成。
原生JDBC
JDBC开发步骤
- 注册驱动.
- 获得连接.
- 获得语句执行者
- 执行sql语句
- 处理结果
- 释放资源.
代码实现
- 预处理对象
- 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:封装结果集
- QueryRunner:操作sql语句
ThreadLocal
- java.lang.ThreadLocal该类提供了线程局部变量,用于在当前线程中共享数据.ThreadLocal工具类底层就是一个Map,key存放的是当前线程,value存放的是共享数据
事物的特性
- 事务的特性(面试)
- 原子性(了解)
- 原子性:事务里面的操作不可切割,要么全部成功,要么全部失败.
- 一致性(了解)
- 一致性:事务提交或者回滚之后的状态要和其他的业务状态保持一致.
- 隔离性(了解)
- 隔离性:一个事务的操作,尽量不要受其他事务的干扰.
- 持久性(了解)
- 持久性:一旦事务提交了或者回滚了,终要把数据持久化到数据库中.
- 原子性(了解)
安全性/隔离级别
- 安全性排序
- serializable>repeatable read>read committed>read uncommitted
- 完美>幻读(mysql)>不可重复读>脏读
- 脏读
- 一个事务中读取到了另一个事务没有提交的数据
- 不可重复读
- 在一个事务中,两次查询结果不一致(针对update操作)
- 幻读
- 在一个事务中,两次查询结果不一致(针对的是insert操作)