JDBC 就是使用Java语言操作关系型数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接
JDBC的本质:
JDBC的好处:
以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。
使用JDBC操作mysql步骤
CREATE DATABASE /*!32312 IF NOT EXISTS*/`jdbc` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `jdbc`;
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`money` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into `account`(`id`,`name`,`money`) values (1,'A',1000),(2,'B',1000),(3,'C',1000);
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
import java.sql.*;
public class AccountDao {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建数据库连接url useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
// 2. 获取数据库的连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 创建查询的sql语句
String sql = "select * from account";
// 3. 获取sql执行对象
PreparedStatement ps = conn.prepareStatement(sql);
// 4. 执行查询
ResultSet rs = ps.executeQuery();
// 获取查询数据
while (rs.next()) {
System.out.println("id: " + rs.getObject("id"));
System.out.println("name: " + rs.getObject("name"));
System.out.println("money: " + rs.getObject("money"));
System.out.println();
}
// 5. 关闭数据库连接对象
rs.close();
ps.close();
conn.close();
}
}
成功获取到数据库的数据;
详细介绍可以查看博客请点击:网页链接
要么都成功,要么都失败
ACID原则
事务在数据库中大致分为一下几个步骤
-- 事务开启
-- 事务执行
-- 事务回滚
-- 事务提交
编写java代码测试事务:
模拟A用户给B转账100元
import java.sql.*;
public class AccountDao {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建数据库连接url useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
// 2. 获取数据库的连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 模拟转账
String sql = "update account set money = money - 100 where name = 'A'";
// 执行转账sql
conn.prepareStatement(sql).executeUpdate();
sql = "update account set money = money + 100 where name = 'B'";
// 执行收款sql
conn.prepareStatement(sql).executeUpdate();
conn.close();
}
}
正常情况下,直接转账成功
查看数据库结果:
现在模拟发生异常
import java.sql.*;
public class AccountDao {
public static void main(String[] args){
Connection conn = null;
String sql;
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建数据库连接url useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
// 获取数据库的连接对象
conn = DriverManager.getConnection(url, user, password);
// 模拟转账
sql = "update account set money = money - 100 where name = 'A'";
// 执行转账sql
conn.prepareStatement(sql).executeUpdate();
// 异常
int a = 1 / 0;
sql = "update account set money = money + 100 where name = 'B'";
// 执行收款sql
conn.prepareStatement(sql).executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
// 关闭数据库连接对象
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
运行报错,重新查看数据库中的数据
A用户数据减少,但是B用户数据没有增加
开启事务:
执行前恢复数据库数据:
重新编写代码
import java.sql.*;
public class AccountDao {
public static void main(String[] args){
Connection conn = null;
String sql;
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建数据库连接url useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
// 获取数据库的连接对象
conn = DriverManager.getConnection(url, user, password);
// 开启事务
conn.setAutoCommit(false);
// 模拟转账
sql = "update account set money = money - 100 where name = 'A'";
// 执行转账sql
conn.prepareStatement(sql).executeUpdate();
// 异常
int a = 1 / 0;
sql = "update account set money = money + 100 where name = 'B'";
// 执行收款sql
conn.prepareStatement(sql).executeUpdate();
// 没有发生异常提交事务
conn.commit();
System.out.println("转账成功!");
} catch (Exception e) {
// 发生异常让数据回滚
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
// 打印数据回滚提示
System.out.println("发生异常转账失败,数据回滚!");
}finally {
// 关闭数据库连接对象
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
查看数据库数据
没有发生异常情况,数据成功回滚
当没有异常情况
import java.sql.*;
public class AccountDao {
public static void main(String[] args){
Connection conn = null;
String sql;
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 创建数据库连接url useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
// 获取数据库的连接对象
conn = DriverManager.getConnection(url, user, password);
// 开启事务
conn.setAutoCommit(false);
// 模拟转账
sql = "update account set money = money - 100 where name = 'A'";
// 执行转账sql
conn.prepareStatement(sql).executeUpdate();
sql = "update account set money = money + 100 where name = 'B'";
// 执行收款sql
conn.prepareStatement(sql).executeUpdate();
// 没有发生异常提交事务
conn.commit();
System.out.println("转账成功!");
} catch (Exception e) {
// 发生异常让数据回滚
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
// 打印数据回滚提示
System.out.println("发生异常转账失败,数据回滚!");
}finally {
// 关闭数据库连接对象
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
转账成功!
评论
登录后才可以进行评论哦!