文章目录
- JDBC 简介
- 1.使用 JDBC
- 1.建立连接
- 2.程序间交换数据
- 3.普通语句执行
- 4.预编译语句执行(防止 SQL注入)
- 5.事务管理-详解
JDBC 简介
本质是通过一套 API 接口来操作数据库
本质还是 操作关系型数据库 , 核心是数据库 , 这只是对数据库的操作 .
1.使用 JDBC
1.建立连接
本质就是两个程序之间的事情
<!-- 驱动 : -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
// a.注册驱动的四种办法
// 1.Class.forName("驱动全限名")
Class.forName("com.mysql.jdbc.Driver");
// 2.new 构造器
java.sql.Driver driver = new com.mysql.jdbc.Driver();
// 3.设置启动选项
java -Djdbc.drivers=com.mysql.jdbc.Driver;other 源文件
// 4.驱动 jar 包的 META-INF 文件夹里的 :
// services 文件夹里的 : java.sql.Driver 文件
// 编辑 : com.mysql.jdbc.Driver
// 编辑 : com.mysql.fabric.jdbc.FabricMySQLDriver
// b. 获取连接 (独立事务单位)
Connection connt = DriverManager
.getConnection("jdbc:mysql://localhost:3306/db000
?useSSL=false&serverTimezone=Asia/Shanghai
&user=root&password=admin
&useUnicode=true&characterEncoding=UTF-8");
// c.关闭连接 (事务)
connt.close();
2.程序间交换数据
事务本质就是 Connection 实例对象控制
// 自动提交事务关闭 , 等价于开启事务 [true 为自动提交, sql 会自动提交] void
connt.setAutoCommit(false);
// 提交事务 void
connt.commit();
// 事务回滚 void
connt.rollback();
3.普通语句执行
普通语句
// 增删改的操作都在这
int result = statement.executeUpdate(sql);
// 查询操作都交给这个方法 : result 重复使用
ResultSet resultSet = statement.executeQuery(sql);
处理查询结果
while (resultSet.next()) {
// 获取查询数据
System.out.print(resultSet.getInt("id") + "\t");
System.out.print(resultSet.getString("brand_name") + "\t");
System.out.print(resultSet.getString("company_name") + "\t");
System.out.print(resultSet.getInt("ordered") + "\t");
System.out.print(resultSet.getString("description") + "\t");
System.out.println(resultSet.getInt("status") + "\t");
System.out.println("------------------------------------------");
}
2.获取执行结果 (通过对象封装)
package com.example.domain;
public class Brand {
Integer id;
String brand_name;
String company_name;
Integer ordered;
String description;
Integer status;
@Override
public String toString() {
return
"id=" + id +
", brand_name='" + brand_name + '\'' +
", company_name='" + company_name + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status;
}
}
List<Brand> brandList = new ArrayList<>();
while (resultSet.next()) {
Brand brand = new Brand();
// 获取查询数据
int id = resultSet.getInt("id");
String brand_name = resultSet.getString("brand_name");
String company_name = resultSet.getString("company_name");
int ordered = resultSet.getInt("ordered");
String description = resultSet.getString("description");
int status = resultSet.getInt("status");
brand.id = id;
brand.brand_name = brand_name;
brand.company_name = company_name;
brand.ordered = ordered;
brand.description = description;
brand.status = status;
brandList.add(brand);
}
System.out.println(brandList);
4.预编译语句执行(防止 SQL注入)
sql 注入介绍
// a.前端获得数据 name password
String name = "lll";
String password = "` or `1` = `1";
// 拼成 sql 语句后 : 密码是什么都为真
String sql = "select * from tb_brand where
name = 'lll' and password = '' or '1' = '1'";
本质就是预编译后 : 值只会作为字面值而不是运算符号
String sql = "select * from tb_brand where id = ? and status = ?";
PreparedStatement preparedStatement = connt.prepareStatement(sql);
int id = 140;
int status = 0;
preparedStatement.setInt(1, id);
preparedStatement.setInt(2, status);
启动预编译 : 有些人说预编译好, 但他连预编译都没打开, 就很搞笑
启动预编译 : useServerPrepStmts=true
手动重启 mysql 服务即可
5.事务管理-详解
本质 : Connection 对象是事务控制的基本单位
Class.forName("com.mysql.jdbc.Driver");
Connection root1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db000", "root", "159357ljm");
String sql1 = "delete from tb_brand where id = 130";
String sql2 = "delete from tb_brand where id = 131";
String sql3 = "delete from tb_brand where id = 132";
// 语句 : 通过连接获得 , 同一个连接是一个事务
Statement statement1 = root1.createStatement();
// 语句 : 通过连接获得 , 同一个连接是一个事务
Statement statement2 = root1.createStatement();
// 语句 : 通过连接获得 , 同一个连接是一个事务
Statement statement3 = root1.createStatement();
// 自动提交改为 false
root1.setAutoCommit(false);
// 暂时不提交 : 缓存
System.out.println(statement1.executeUpdate(sql1));
// 自动提交改为 true 由 false 变为 true 会 conmmit 缓存中的语句
// sql1 执行
root1.setAutoCommit(true);
// sql2 执行
System.out.println(statement2.executeUpdate(sql2));
// 自动提交改为 true 由 true 变为 false
root1.setAutoCommit(false);
// 不执行 :
System.out.println(statement3.executeUpdate(sql3));
root1.close();
Class.forName("com.mysql.jdbc.Driver");
Connection root1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db000", "root", "159357ljm");
Connection root2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db000", "root", "159357ljm");
String sql1 = "delete from tb_brand where id = 150";
String sql2 = "delete from tb_brand where id = 151";
String sql3 = "delete from tb_brand where id = 152";
String sql4 = "delete from tb_brand where id = 153";
Statement statement11 = root1.createStatement();
Statement statement12 = root1.createStatement();
Statement statement13 = root1.createStatement();
Statement statement21 = root2.createStatement();
// 1.关闭自动提交
root1.setAutoCommit(false);
// 2.打开自动提交
root2.setAutoCommit(true);
// 150 删除
System.out.println(statement21.executeUpdate(sql1));
// 151 缓存
System.out.println(statement11.executeUpdate(sql2));
// 151 commit 删除 : root1 自动提交开启
root1.setAutoCommit(true);
// root2 自动提交关闭
root2.setAutoCommit(false);
// 152 缓存
System.out.println(statement21.executeUpdate(sql3));
// 153 自动删除
System.out.println(statement13.executeUpdate(sql4));
root1.close();
root2.close();