JDBC (Java DataBase Connectivity)
1. 概念
JDBC 是Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己的数据库驱动。所以我们只需要调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。
2. 相关的包
* java.sql
* javax.sql
* 数据库厂商提供的jar包
3. 核心的API
* DriverManager 类
1)管理和注册数据库驱动
2)得到数据库连接对象
* Connection 接口
一个连接对象,可以用于创建Statement 和PreparedStatement
* Statement 接口
一个SQL语句对象,用于将SQL语句发送给数据库服务器
* PreparedStatement 接口
一个SQL语句对象,是Statement的子接口
* ResultSet 接口
用于封装数据库查询的结果集,返回给客户端Java程序
4. 配置环境导入Jar包
* MySQL需要导入的驱动Jar包:
mysql-connector-java-5.1.37-bin.jar
*注册驱动
Class.forName("com.mysql.jdbc.Driver");
核心接口和类
1. DriverManager
*注册驱动
Class.forName("com.mysql.jdbc.Driver");
* 获取数据库连接方法
1)Connection getConnection (String url, String user, String password)
1. url
连接数据库字符串
格式:协议名:子协议://服务器或者IP:端口号/数据库名?参数=参数值
MySQL写法:jdbc:mysql://localhost:3306/test?characterEncoding=utf8
2. user
用户名
3. password
密码
2)Connection getConnection (String url, Properties info)
1. url
连接数据库字符串
2. info
Properties 属性对象
2. Connection 接口
由具体的厂商提供,代表一个连接对象,
* 获取执行SQL的对象
//创建一个 Statement对象,用于将SQL语句发送到数据库。
Statement createStatement()
//创建一个 PreparedStatement对象,用于将参数化SQL语句发送到数据库。
PreparedStatement prepareStatement(String sql)
*事务管理
1)开启事务 :
//将此连接的自动提交模式设置为给定状态。
//autoCommit=true 自动提交 autoCommit=false 关闭自动提交相当于开启事务
setAutoCommit(boolean autoCommit)
2) 回滚事务:
rollback()
3)提交事务:
commit()
3. Statement 接口
代表一条SQL语句对象,发送SQL给服务器,并返回结果对象
* 发送 DDL DML 语句
int executeUpdate(String sql)
* 发送 DQL 语句
ResultSet executeQuery(String sql)
4. ResultSet 接口
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。
* boolean next()
//游标向下移动 1 行
//如果还有下一条记录返回 true,否则返回 false
* getter 方法
//通过字段名 或者列号获取不同类型的列值
参见PDF 2.8 节
* 使用步骤
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
* 注意资源释放
使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
5. 使用示例
1. DDL 操作
使用 JDBC 在 MySQL 的数据库中创建一张学生表
字段 id 类型int 非空 主键 自增
字段 name 类型varchar 长度20 非空
字段 gender 类型 tinyint 长度1 默认值 1
字段 birthday 类型 date
2. DML 操作
向学生表添加4条记录,主键是自增的。
name gender birthday
孙悟空 1 1993-03-24
白骨精 0 1995-03-24
猪八戒 1 1903-03-24
嫦娥 0 1993-03-11
3. DQL 操作
查询学生表记录,并打印出学生信息
4. 抽取工具类
抽出的公共代码分析:
1) 用户名,密码, URL,驱动类配置
使用配置文件
2) 数据库连接 getConnection
3) 关闭所有打开的资源
5. 登录验证
编写程序得到从控制台输入的用户名和密码来查询数据库, 验证输入的用户名和密码是否正确
6. PreparedStatement 接口 改造验证登录
使用步骤:
1)编写 SQL 语句,未知内容使用? 占位
如: SELECT * FROM user WHERE name=? AND password=?
2)获得 PreparedStatement 对象
3)设置实际参数: setXXX(占位符的位置,真实的值)
4)执行参数化 SQL 语句
5)关闭资源
优点:
1)有预编译的功能,提高 SQL 的执行效率
2)可以有效的防止 SQL 注入的问题,安全性更高。
7. 事务管理示例
使用事务完成张三向李四转账操作
JDBC连接池
1. 存放数据库连接的容器
1) 节约资源
2) 用户访问高效
2. DataSource 接口
DataSource 接口,在 javax.sql 包下, 用于连接物理数据源的工厂, 作为 DriverManager 工具的替代方案, DataSource 对象是获取连接的首选方法。 DataSource 接口由驱动程序供应商实现。
1)方法
* 获取连接
getConnection()
* 释放连接
Connection.close()
2)常用连接池技术
* C3P0 : 开源JDBC连接池
* Druid : 阿里巴巴提供
3. C3P0 使用
* 步骤
1)导入依赖jar包:
c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
2)定义配置文件:
* 名称: c3p0.properties 或者 c3p0-config.xml
* 路径:直接将文件放在src目录下即可。
3) 创建核心对象 数据库连接池对象 ComboPooledDataSource
4) 获取连接: getConnection
4. druid 使用
* 步骤:
1) 导入jar包 druid-1.0.9.jar
2) 定义配置文件:
* 是properties形式的
* 可以叫任意名称,可以放在任意目录下
3) 加载配置文件。Properties
4) 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
5) 获取连接:getConnection
5. 编写连接池工具类DataSourceUtil
* 提供静态代码块加载配置文件,初始化连接池对象
* 提供方法
1) 获取连接方法:通过数据库连接池获取连接
2) 释放资源
3) 获取连接池的方法
JdbcTemplate
Spring对JDBC的封装,目的是使JDBC更加易于使用,简化JDBC的开发
(Spring 是最受欢迎的企业级 Java 应用程序开发框架)
1. 使用步骤
1) 导入jar包
2) 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);
3) 调用JdbcTemplate的方法来完成CRUD的操作
1. update()
执行DML语句。增、删、改语句
2. queryForMap()
查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
* 注意:这个方法查询的结果集长度只能是1
3. queryForList()
查询结果将结果集封装为list集合
* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
4. query()
查询结果,将结果封装为JavaBean对象
* query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
5. queryForObject
查询结果,将结果封装为对象
* 一般用于聚合函数的查询
2. 练习:
* 需求 (使用员工表emp ):
1) 修改1号数据的 salary 为 10000
2) 添加一条记录
3) 删除刚才添加的记录
4) 查询id为1的记录,将其封装为Map集合
5) 查询所有记录,将其封装为List
6) 查询所有记录,将其封装为Emp对象的List集合
7) 查询总记录数