JDBC(Java Data Base Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
简单理解:用Java的类和接口去获得数据库连接,以及操作数据库。
框架理解:
JDBC执行流程图理解:
以下示例是基于maven的,故导入依赖即可,否则需要手动导入数据库驱动。
1、先创建数据库,建表插入数据。
2、使用Java idea连接好数据库
选择数据库
导入成功
pom.xml中配置依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
编写jdbc的步骤:
1、配置数据库驱动标识及登录信息
2、通过反射加载数据库驱动
3、连接数据库
4、编写sql语句
5、执行sql语句并获得结果集
6、关闭连接,释放资源,先开后关
1、使用不安全的Statement对象
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//数据库连接地址及配置信息
String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//1、利用反射加载数据可驱动
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库,connection 代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3、数据库 connection 创建一个执行对象statement
Statement statement = connection.createStatement();
//4、编写sql语句
String sql = "select * from users";
//5、statement可执行增删查改操作(CRUD),返回结果集(增,删,改—>返回int类型受影响行数,查->返回字符串)
//resultSet 结果集对象,本身对应数据库中的数据
ResultSet resultSet = statement.executeQuery(sql);
//6、判断结果集中是否含有数据,遍历
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("name="+resultSet.getObject("name"));
System.out.println("password="+resultSet.getObject("password"));
System.out.println("email="+resultSet.getObject("email"));
System.out.println("birthday="+resultSet.getObject("birthday"));
}
//7、关闭连接,释放资源,(重要)先开后关
resultSet.close();
statement.close();
connection.close();
}
}
2、使用安全的PreparedStatement对象(防止sql注入)
package com.lijian.jdbc;
import java.net.URLEncoder;
import java.sql.*;
//使用安全的
public class Testjdbc1 {
public static void main(String[] args) throws Exception {
//1、封装连接信息
String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//2、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3、创建连接
Connection connection = DriverManager.getConnection(url, username, password);
//4、编写sql语句
String sql = "insert into users(id, name, password, email, birthday) values (?,?,?,?,?);";
//5、预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给占位符赋值
preparedStatement.setInt(1,5);//给第一个占位符 ? 赋值
preparedStatement.setString(2,"LIJIAN");//给第er个占位符 ? 赋值
preparedStatement.setString(3,"123456");//给第三个占位符 ? 赋值
preparedStatement.setString(4,"124587@qq.com");//给第四个占位符 ? 赋值
preparedStatement.setDate(5,new Date(2022-02-03));//给第五个占位符 ? 赋值
//6、执行sql
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("执行成功,共插入"+i+"行");
}
//7、关闭连接
preparedStatement.close();
connection.close();
}
}
数据库事务
数据库事务( transaction)是操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,不可分割。
事务的ACID特性:
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。 [1]
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。 [1]
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 [1]
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
下面实现的功能为,从获取数据库驱动到连接数据库,执行sql语句,提交执行结果到数据库的过程中,只要发生错误(如:int i = 1/0;)立即执行事务回滚,保证数据库中数据安全。
package com.lijian.jdbc;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestJdbc2 {
//@Test,junit单元测试,作用域只能在方法上
@Test
public void test(){
//1、封装连接信息
String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
Connection connection =null;
try {
//2、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3、创建连接
connection = DriverManager.getConnection(url, username, password);
//制造错误
// int i = 1/0;
//4、通知数据库开启事务
connection.setAutoCommit(false);
String sql = "update salar set money = money-100 where name = 'll';";
connection.prepareStatement(sql).executeUpdate();
//提交
connection.commit();
System.out.println("success");
} catch (Exception e) {
try {
//如果出现异常,则执行事务回滚
connection.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}