概念:JDBC就是使用java语言操作关系型数据库的一套API
全称:(Java DataBase Connectivity)java数据库连接
解决问题: 主要是为了使用同一套java 代码 操作多种关系型数据库 JDBC定义了一套完整的接口
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取链接对象
String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
String username = "root";
String password = "root123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3. 定义SQL
String sql = "update account set balance = 500 where id = 1";
//4.获取执行sql的对象
Statement stmt = conn.createStatement();
// 5. 执行sql
int count = stmt.executeUpdate(sql);
// 6. 处理结果
System.out.println(count);
// 7. 释放资源
stmt.close(); conn.close();
使用步骤
-
创建工程,导入驱动jar包,可以去官网下载相关版本dev.mysql.com/downloads/c…
-
注册驱动
Class.forName("com.mysql.jdbc.Driver");
3.获取链接
Connection conn = DriverManager.getConnection(url, username, password);
- 定义sql语句
String sql = "update account set balance = 500 where id = 1";
- 获取执行sql对象
Statement stmt = conn.createStatement();
- 执行sql
stmt.executeUpdate(sql);
7.释放资源
jDBC API详情
DriverManager 作用:1. 注册驱动 2. 获取数据库连接
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看Driver类源码
static {
try {
// 已经记录了对应驱动类
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
提示 :
MySQL 5之后的驱动包 可以省略注册驱动步骤
自动加载jar包中META—INF/services/java.sql.Driver文件中的驱动类
2.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
参数:
- url 连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
eg:jdbc:mysql://127.0.0.1:3306/db1
注意:1.如果连接的是主机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
- 配置 useSSL = false参数, 禁用安全连接方式, 解决警告提示
Connection
Connection(数据库连接对象) 作用 : 1. 获取执行SQL的对象 2. 管理事务
- 获取执行sql的对象
普通执行sql对象
Statement createStatement()
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
执行存储过程的对象
CallableStatement prepareCall(sql)
- 事务管理
mysql事务管理
开启事务:BEGIN;/START TRANSACTION
提交事物:COMMIT
回滚事务:ROLLBACK
MYSQL默认自动提交事务
JDBC事务管理 Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false 为手动提交事务 即为开启事务
提交事务:commit()
回滚事务:rollback()
try {
// 开启事务
conn.setAutoCommit(false);
// 5. 执行sql
int count1 = stmt.executeUpdate(sql1);
// 6. 处理结果
System.out.println(count1);
// 5. 执行sql
//int i = 3/0;
int count2 = stmt.executeUpdate(sql2);
// 6. 处理结果
System.out.println(count2);
// 提交事务
conn.commit();
} catch (Exception throwables){
// 回滚事务
conn.rollback();
throwables.printStackTrace();
}
Statement
Statment作用:
- 执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
返回值:1.DML语句影响的行数 2 DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行DQL语句
返回值: ResultSet结果集对象
ResultSet
ResultSet结果集对象作用
- 封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql) : 执行DQL语句,返回ResultSet对象
获取查询结果
boolean next() : 1. 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
返回值 true 有效行 当前行有数据 false 无效行 当前行没有数据
使用步骤 1. 游标向下移动一行 并判断该行是否有数据 next();
2. 获取数据: getXxx(参数)
// 循环判断游标是否是最后一行末尾
while(rs.next()){
// 获取数据
rs.getXxx(参数);
}
PreparedStatement
作用 1. 预编译Sql语句并执行:预防SQL注入问题
SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
1.预编译SQL并执行SQL语句
获取Prepared Statement对象
// SQL 语句中的参数值 使用?占位符替代
Strings sql = "select * from user where username = ? and password = ?";
// 通过Connection 对象获取 并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型; 如 setInt(参1,参2);
参数:
参数1: ?的位置编号,从1开始
参数2: ?的值
执行SQL
executeUpdate(); / executeQuery(); 不需要再传递SQl
//useServerPrepStmts=true 开启预编译功能
String url="jdbc:mysql://localhost:3306/db1useSSL=false&useServerPrepStmts=true"; String username = "root";
String password = "root123456";
Connection conn = DriverManager.getConnection(url, username, password);
// sql 注入演示
String name = "lisfsi";
String passwd = "' or '1' = '1";
// 定义sql
String sql = "select * from tb_user where username = ? and password = ?";
// 获取pstmt 对象
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,name);
pstmt.setString(2,passwd );
// 执行sql
ResultSet rs = pstmt.executeQuery();
// 判断是否登陆成功
if(rs.next()){
System.out.println("登陆成功");
}else{
System.out.println("登陆失败");
}
rs.close();
pstmt.close();
conn.close();
PreparedStatment好处:
-
预编译SQL。性能更高
-
防止SQL注入:将敏感字符进行转义
数据流连接池
-
数据库连接池是个容器,负责分配、管理数据库连接(connection)
-
它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个
-
释放空闲时间超过最大空闲时间的数据连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
资源重用,提升系统响应速度,避免数据库连接遗漏
数据库连接池标准接口:DataSource
官方提供的数据库连接池标准接口 由第三方组织实现此接口。
Connection getConnection()
常见数据库连接池: DBCP C3P0 Druid
Driud 使用步骤
// 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接
Connection connection = dataSource.getConnection();
// 定义SQL
String sql = "select * from tb_brand";
// 获取pstmt对象
PreparedStatement pstmt = connection.prepareStatement(sql);
// 设置参数
// 执行sql
ResultSet rs = pstmt.executeQuery();
Brand brand = null;
List<Brand> brands = new ArrayList<>();
while (rs.next()){
// 获取数据
int id = rs.getInt("id");
String brandName = rs.getString("brand_name");
String companyName = rs.getString("company_name");
int ordered = rs.getInt("ordered");
String description = rs.getString("description");
int status = rs.getInt("status");
// 封装Brand对象
brand = new Brand();
brand.setId(id);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(ordered);
brand.setDescription(description);
brand.setStatus(status);
// 装载集合
brands.add(brand);
}
System.out.println(brands);
// 释放资源
rs.close();
pstmt.close();
connection.close();