学习目标:
- 掌握JDBC的概念
- 掌握JDBC操作单表CRUD的方法
- 掌握JDBC操作数据库事务的方法
- 掌握数据库操作工具类的实现方法
什么是JDBC
Java DataBase Connectivity
(Java数据库连接) JDBC是Java访问数据库的标准规范
JDBC的作用:JDBC是用于执行SQL语句的Java API
说人话就是:Java语言通过JDBC可以操作数据库
JDBC的使用
需要先导包,根据MySQL的不同版本来导入对应版本的jar包
下载地址
下面是固定语法,只要用到JDBC基本都会写:
//mysql5:Class.forName("com.mysql.jdbc.Driver");
//mysql8:Class.forName("com.mysql.cj.jdbc.Driver");
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
/获取连接
//若为访问本机的3306端口可以省略为jdbc:mysql:///数据库?serverTimezone=UTC
Connection conn=DriverManager.getConnection("协议:子协议://访问主机:端口号/数据库?serverTimezone=UTC", "账号", "密码");
使用JDBC来CRUD
创建
创建一个test表:
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn=null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///test?serverTimezone=UTC", "root", "root");
String sql="create table test( ID INT PRIMARY KEY AUTO_INCREMENT,name varchar(255)";
PreparedStatement statement = conn.prepareStatement(sql);
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
conn.close();
};
向内部插入数据:
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
Connection conn=null;
try {
//加载驱动
conn = DriverManager.getConnection("jdbc:mysql:///test?serverTimezone=UTC", "root", "root");
//定义sql语句
String sql="insert into test1(id, name) values(?, ?)";
// 4.获取预处理器
PreparedStatement statement = conn.prepareStatement(sql);
//5.设置参数
//setInt(第几个参数, 值);因为我们前面只填了两个?所以只有两个值
statement.setInt(1, 1);
statement.setString(2, "张三");
//6.执行SQL
statement.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
conn.close();
}
修改
修改数据,将张三改成李四 :
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
Connection conn=null;
try {
//加载驱动
conn = DriverManager.getConnection("jdbc:mysql:///test?serverTimezone=UTC", "root", "root");
//定义sql语句
String sql="update test set name = ? where id = ?";
// 4.获取预处理器
PreparedStatement statement = conn.prepareStatement(sql);
//5.设置参数
statement.setInt(1, 1);
statement.setString(2, "李四");
//6.执行SQL
statement.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
conn.close();
}
删除
删除id为1的数据:
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
Connection conn=null;
try {
//加载驱动
conn = DriverManager.getConnection("jdbc:mysql:///test?serverTimezone=UTC", "root", "root");
//定义sql语句
String sql="delete from test where id = ?";
// 4.获取预处理器
PreparedStatement statement = conn.prepareStatement(sql);
//5.设置参数
statement.setInt(1, 1);
//6.执行SQL
statement.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
conn.close();
}
查询
由于查询会返回数据,而前三者并不会所以查询放到最后
查询test表的所有数据:
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
Connection conn=null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///test?serverTimezone=UTC", "root", "root");
String sql="select * from test";
PreparedStatement statement = conn.prepareStatement(sql);
//获取查询的返回值
ResultSet rs= statement.executeQuery();
//输出
while (rs.next()) {
int i=rs.getInt("id");
String name=rs.getString("name");
System.out.println(i+","+name);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
conn.close();
}
JDBC的核心对象
- DriverManager:驱动管理(驱动的注册,打开连接)
- Connection:连接(控制连接、处理事务)
- PreparedStatement:设置参数、执行SQL
- PreparedStatement和Statement的区别
详细请看这里
- PreparedStatement和Statement的区别
- ResultSet:结果集(封装了查询语句中返回的所有数据)
-
- 获取结果数据(获取内容):
resultSet.getInt("id");
- 获取结果数据(获取内容):
-
- 获取元数据对象:
resultSet.getMetaData();
- 获取元数据对象:
-
- 获取总列数:
metaData.getColumnCount();
- 获取总列数:
-
- 获取列名:
metaData.getColumnName(i);
- 获取列名:
-
- 获取列类型名称:
metaData.getColumnTypeName(i);
- 获取列类型名称:
-
- 获取对应的Java中的数据类型:
metaData.getColumnClassName(i);
- 获取对应的Java中的数据类型:
-
JDBC的事务
之前我们学习了事务,但是只是在Java中,使用,实际上基本都要用到JDBC,那么如何在JDBC中使用事务呢?
JDBC事务的API介绍
- 自动提交:
connection.setAutoCommit(boolean);
true表示自动提交(默认),false则为手动提交 - 提交事务:
connection.commit();
- 回滚事务:
connection.rollback();
JDBC事务的使用
案例:同时修改两个人的密码
初始数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class affairs {
/**
* 事务修改
*/
public static final String URL = "jdbc:mysql:///test?serverTimezone=UTC";
public static final String USER = "root";
public static final String PASSWORD = "root";
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
Connection conn=null;
try {
conn = DriverManager.getConnection(URL, USER, PASSWORD);
conn.setAutoCommit(false);
String sql="update t_user set pwd = ? where name = ?";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, "456");
statement.setInt(2, 2);
statement.executeUpdate();
System.out.println(1/0);
statement.setString(1, "456");
statement.setInt(2, 3);
statement.executeUpdate();
//提交
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//回滚
conn.rollback();
}finally {
conn.close();
}
}
}
由于不能除以零所以报错后回滚,数据没有变动
我们将1/0去掉后即可正常运行