文章目录
- JDBC & 连接池
-
- 目标
- 01_ JDBC 概述-[★★]
- 02_ JDBC 核心 API 概述-[★★]
- 03_ JDBC 之注册驱动-[★★★]
- 04_ JDBC 之获取连接对象-[★★★]
- 05_ JDBC 之 Statement 对象概述-[★★★]
- 06_ JDBC 之执行 DDL 语句_创建表-[★★★]
- 07_JDBC 之执行 DML 语句_增删改-[★★★]
- 08_ JDBC 之 ResultSet 对象概述-[★★★]
- 09_ JDBC 之执行 DQL 语句_查询数据-[★★★]
- 10_ JDBC 事务-转账案例-[★★★★]
- 11_创建 JDBC 工具类-[★★★★]
- 12_ JDBC 实现登录案例-[★★★★]
- 13_ SQL 注入概述和演示-[★★]
- 14_PreparedStatement 接口概述-[★★★]
- 15_PreparedStatement 解决 SQL 注入-[理解]
- 16_ PreparedStatement 和 Statement 区别-[面试题]
- 17_ PreparedStatement 实现增删改操作-[★★★★★]
- 18_ PreparedStatment 实现查询操作-[★★★★★]
- 19_连接池概述-[★★]
- 20_ C3P0 连接池基本使用-[★★★★]
- 21_ DRUID 连接池基本使用-[★★★★]
- 22_连接池工具类-[★★★★]
JDBC & 连接池
目标
- 能够理解JDBC的概念
- 能够使用Connection接口
- 能够使用Statement接口
- 能够使用ResultSet接口
- 能够使用JDBC实现对单表数据增、删、改、查
- 能够使用JDBC操作事务
- 能够完成JDBC实现登录案例
- 能够使用C3P0连接池
- 能够使用DRUID连接池
- 能够编写连接池工具类
01_ JDBC 概述-[★★]
-
JDBC 是什么:
英文:Java DataBase Connectivity
中午:Java 数据库连接技术 -
JDBC 的作用:
与数据库建立连接并对数据库执行操作:增删改查操作 -
JDBC 的组成:
由一组官方定义的接口(规范)组成:接口实现类由数据库厂商提供:数据库驱动(实现操作数据库接口的类) -
JDBC 的好处:
代码不依赖于任何的数据库
只需要修改少量配置就可以方便切换到其他厂商数据库
02_ JDBC 核心 API 概述-[★★]
JDBC 核心类和接口 | 说明 |
---|---|
DriveManager 工具类 | 1. 用于注册数据库驱动 2.用于获取连接对象 |
Connection 接口 | 连接对象 与数据库建立连接并形成数据传输通道 |
Statement 接口 | SQL 语句发送对象 作用:将 SQL 语句发送给数据库执行并获得执行结果 |
ResultSet 接口 | 结果集对象 作用:用来封装满足查询条件的记录信息 |
Drive 接口 | 数据库驱动对象 |
03_ JDBC 之注册驱动-[★★★]
- 注册驱动的作用:告诉JVM接下来要操作哪个厂商的数据库了
注册驱动方法 | 说明 |
---|---|
static registerDriver(Driver driver) | 驱动会注册两次 |
Class.forName(“com.mysql.jdbc.Driver”); | 只会注册一次 |
- 示例代码
/**
目标:
1. 理解注册驱动的作用:告诉JVM接下来要操作哪个厂商的数据库了
2. 掌握注册驱动的方式
DriverManger工具类与注册驱动相关的方法
* static registerDriver(Driver driver)
* 注册数据库驱动
* 存在问题:驱动会被注册两次
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
// 方式1:存在问题:驱动会被注册两次
// 创建驱动对象(Driver是mysql厂商提供Driver接口的实现类)
/*Driver driver = new Driver();
// 注册驱动
DriverManager.registerDriver(driver);*/
// 方式二:利用反射触发Driver实现类的加载实现驱动注册
Class.forName("com.mysql.jdbc.Driver");
}
}
04_ JDBC 之获取连接对象-[★★★]
- DriverManager类与数据库建立连接的方法
DriverManager类与数据库建立连接的方法 | 说明 |
---|---|
static Connection getConnetion( String url, String username, String password) |
获得连接对象 url:连接字符串 username:用户名 password:密码 |
static Connection getConnection( String url, Properties info) |
获得连接对象 |
DriverManager工具类与获得连接对象相关的方法
static Connection getConnection(String url, String user, String password)
与数据库建立连接并返回连接对象
url: 数据库连接字符串
user: 用户名 root
password: 密码 root
static Connection getConnection(String url, Properties info)
与数据库建立连接并返回连接对象
url: 数据库连接字符串
info: 属性集合(双列集合,用法和map一样):用来存储用户名和密码
可以将用户名和密码配置在文件中
数据库连接字符串格式:
- 完整格式:JDBC协议:子协议://数据库服务器地址:端口号/数据库名
* JDBC协议:固定值是:jdbc
* 子协议:一般是数据库厂商的名字,比如mysql或oracle- 省略格式:JDBC协议:子协议:/// 数据库名
* 前提条件:操作本机数据库且端口号是默认值3306MySQL数据库连接字符串完整格式:
jdbc:mysql://localhost:3306/day11
MySQL数据库连接字符串省略格式:jdbc:mysql:///day11
- 示例代码
/**
目标:与数据库建立连接并获得Connection对象
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
// 方式1: 获得连接对象
// test01();
// 方式2:获得连接对象
test02();
}
/**
* 获得连接对象
*/
private static void test02() throws Exception {
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 创建属性集对象
// 键和值都是String类型
Properties info = new Properties();
// 创建输入流关联配置文件
InputStream in = Demo01.class.getResourceAsStream("/jdbc.properties");
// 从文件中加载数据到集合中
info.load(in);
System.out.println(info);// {user=root, password=root}
/*info.setProperty("user", "root");
info.setProperty("password", "root");*/
// 2. 获得连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///day11", info);
System.out.println(conn);
}
/**
* 获得连接对象
*/
private static void test01() throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "root");
System.out.println(conn);
}
}
05_ JDBC 之 Statement 对象概述-[★★★]
-
Statement 对象的作用:将 SQL 语句发送给数据库执行并获取结果
-
如何获得 Statement 对象:通过连接对象的方法获得:
Statement createStatement();
Statement对象常用方法 | 说明 |
---|---|
boolean execute(String sql) | 可以执行任意SQL语句 一般用来执行DDL语句:创库或创表 |
int executeUpdate(String sql) | 用于执行增删改语句:返回影响的行数 只要不是查询都称为更新操作 |
ResultSet executeQuery(String sql) | 用于执行查询语句 |
06_ JDBC 之执行 DDL 语句_创建表-[★★★]
使用JDBC在数据库创建数据表的步骤
- 注册驱动:
Class.forName("驱动类全名字符串");
- 获得连接对象:
Connection conn = DriverManger.getConnection("连接字符串","用户名","密码");
- 获得SQL语句发送对象:
Statement stmt = conn.createStatement();
- 准备SQL语句:
String sql="....";
- 调用SQL语句发送对象的方法:
stmt.execute...(sql);
- 关闭连接释放资源
- 示例代码
/**
目标:使用JDBC在MySQL的数据库中创建一张学生表
1) id 是主键,整数类型,自增长
2) name 是varchar(20),非空
3) 性别 是char类型
4) 生日 是date类型
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "root");
// 3. 获得SQL语句发送对象
Statement stmt = conn.createStatement();
// 4. 准备SQL语句
String sql = "create table student(" +
"id int primary key auto_increment," +
"name varchar(20) not null," +
"gender char(1)," +
"birthday date);";
// 5. 调用发送对象的方法执行SQL
stmt.execute(sql);
// 6. 释放资源
stmt.close();
conn.close();
}
}
07_JDBC 之执行 DML 语句_增删改-[★★★]
使用JDBC在数据库创建数据表的步骤
- 注册驱动:
Class.forName("驱动类全名字符串");
- 获得连接对象:
Connection conn = DriverManger.getConnection("连接字符串","用户名","密码");
- 获得SQL语句发送对象:
Statement stmt = conn.createStatement();
- 准备SQL语句:
String sql="....";
- 调用SQL语句发送对象的方法:
stmt.execute...(sql);
- 关闭连接释放资源
- 示例代码
/**
目标:使用JDBC实现增删改功能
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
// 插入数据
// testInsert();
// 更新数据
// testUpdate();
// 删除数据
testDelete();
}
// 插入数据
public static void testInsert()throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///day11", "root", "root");
// 3. 获得SQL语句发送对象
Statement stmt = conn.createStatement();
// 4. 准备SQL语句
String sql = "insert into student values(null,'rose','女','2000-12-20'),(null,'luck','男','1990-02-21');";
// 5. 调用SQL语句发送对象的方法
int row = stmt.executeUpdate(sql);
System.out.println("row = " + row);
// 6. 关闭连接释放资源
stmt.close();
conn.close();
}
// 修改数据:将id为3的学生性别修改为女,姓名修改为:lily
public static void testUpdate()throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///day11", "root", "root");
// 3. 获得SQL语句发送对象
Statement stmt = conn.createStatement();
// 4. 准备SQL语句
String sql = "update student set gender = '女', name='lily' where id = 3;";
// 5. 调用SQL语句发送对象的方法
int row = stmt.executeUpdate(sql);
System.out.println("row = " + row); // 1
// 6. 关闭连接释放资源
stmt.close();
conn.close();
}
// 删除数据:把id为2的学生删除
public static void testDelete() throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///day11", "root", "root");
// 3. 获得SQL语句发送对象
Statement stmt = conn.createStatement();
// 4. 准备SQL语句
String sql = "delete from student where id = 2";
// 5. 调用SQL语句发送对象的方法
int row = stmt.executeUpdate(sql);
System.out.println("row = " + row)