JDBC
1. 概述
- 概念
- JDBC(Java DataBase Connectivity java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的
- 本质
- 其实就是java官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接
- 驱动
- 就是各个数据库厂商针对JDBC提供的实现类
- 使用
- 使用肯定是使用的实现类,也就是驱动,但学习的是接口
2. 入门案例
- 导入jar包
mysql-connector-java-5.1.37-bin.jar
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
- 获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称","root","root");
- 获取执行者对象
Statement stat = conn.createStatement();
- 执行sql语句并返回结果
ResultSet rs = stat.executeQuery(sql语句);
ResultSet rs = stat.executeUpdate(sql语句);
- 处理结果
while(rs.next){rs.getInt|getString("字段名")}
- 释放资源
conn.close(); stat.close(); rs.close();
3. 相关API详解
3.1 DriverManager
- DriverManager驱动管理对象
- 注册驱动
- 注册给定的驱动程序:
static void registerDriver(Driver driver);
- 写代码使用:
Class.forName("com.mysql.jdbc.Driver");
- 在com.mysql.jdbc.Driver类中存在静态代码块
static{ try{ java.sql.DriverManager.registerDriver(new Driver()); }catch (SQLException E){ throw new RuntimeException("Can't register driver!"); } }
注意
- 我们不需要通过DriverManager调用静态方法registerDriver(),因为只要Driver类被使用,则会执行其静态代码块完成注册驱动
- mysql5之后可以省略注册驱动的步骤,在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
- 注册给定的驱动程序:
- 获取数据库连接
- 获取数据库连接对象:
static Connection getConnection(String url,String user,String password);
- 返回值:Connection数据库连接对象
- 参数:url:
协议://IP地址:端口号/数据库名称
;user:账号
;passsword:密码
;
- 获取数据库连接对象:
- 注册驱动
3.2 Connection
- Connection数据库连接对象
- 获取执行者对象
- 获取普通执行者对象:
Statement createStatement();
- 获取预编译执行者对象:
PreparedStatement prepareStatement(String sql);
- 获取普通执行者对象:
- 管理事务
- 开启事务:
setAutoCommit(boolean autoCommit);
参数为false,则开启事务 - 提交事务:
commit();
- 回滚事务:
rollback();
- 开启事务:
- 释放资源
- 立即将数据库连接对象释放:
void close();
- 立即将数据库连接对象释放:
- 获取执行者对象
3.3 Statement
- Statement执行sql语句的对象
- 执行DML语句:
int executeUpdate(String sql);
- 返回值int:返回影响的行数
- 参数sql:可以执行insert、update、delete语句。
- 执行DQL语句:
ResultSet executeQuery(String sql);
- 返回值ResultSet:封装查询的结果
- 参数sql:可以执行select语句
- 释放资源
- 立即将数据库连接对象释放:
void close();
- 立即将数据库连接对象释放:
- 执行DML语句:
3.4 ResultSet
- ResultSet结果集对象
- 判断结果集中是否还有数据:
boolean next();
- 有数据返回值true,并将索引向下移动一行
- 没有数据返回false
- 获取结果集中的数据:
XXX getXxx("列名");
- XXX代表数据类型(要获取某列数据,这一列的数据类型)
- 释放资源
- 立即将数据库连接对象释放:
void close();
- 立即将数据库连接对象释放:
- 判断结果集中是否还有数据:
4. 增删改查练习
4.1 项目结构
4.2 查询所有
@Test
public void testFindAll() throws Exception {
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db5", "root", "root");
//3,获取sql语句执行对象
Statement stat = conn.createStatement();
//4,定义sql语句
String sql = "select * from stu";
//5,执行sql语句
ResultSet rs = stat.executeQuery(sql);
//6,处理结果集
while(rs.next()) {
System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getString("address"));
}
//7,释放资源
rs.close();
stat.close();
conn.close();
}
4.3 根据id查询
@Test
public void testFindById() throws Exception {
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db5", "root", "root");
//3,获取sql语句执行对象
Statement stat = conn.createStatement();
//4,定义sql语句
String sql = "select id,name,age,address addr from stu where id = 1";
//5,执行sql语句
ResultSet rs = stat.executeQuery(sql);
while(rs.next()) {
//6,处理结果
System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getString("addr"));
}
//7,释放资源
rs.close();
stat.close();
conn.close();
}
4.4 添加数据
@Test
public void testInsert() throws Exception {
//1,注册驱动
Class.forName(