文章目录
- 1. JDBC介绍
- 2. 相关jar包引入
- 3. JDBC与数据库基本连接
- 4. JDBC API 详解
- 4.1 Connection 接口
- 4.2 Statement 接口
- 4.3 ResultSet
- 5. PreparedStatement 详解
1. JDBC介绍
JDBC是一套标准接口,这套接口用于操作所有的数据库,不同的数据库厂商对迎合这套标准接口的相关操作都有着对应的实现类,这个实现类也就是对应的jar包即驱动程序。
2. 相关jar包引入
Maven工程(依赖导入)
<!--mysql驱动连接 jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
3. JDBC与数据库基本连接
核心代码
// 1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接 - jdbc:mysql://ip地址:端口号/数据库名
// 若是本机mysql并且端口默认 可以省写 jdbc:mysql:///db_a?useSSL=false
String url = "jdbc:mysql://127.0.0.1:3306/db_a";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
// 3. sql 语句
String sql = "update tb_user set id = 1 where id = 1;";
// 4. 获取执行的sql对象
Statement stmt = conn.createStatement();
// 5. 执行
int k = stmt.executeUpdate(sql);
// 6. 获取结果集
System.out.println(k); // 1
// 7. 关闭连接
stmt.close();
conn.close();
4. JDBC API 详解
4.1 Connection 接口
Connection 接口作用
A. 获取执行SQL的对象
B. 对事务进行管理
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/db_a";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
try{
conn.setAutoCommit(false);
String sql = "update tb_user set username = 4 where id = 4;";
Statement stmt = conn.createStatement();
int k = stmt.executeUpdate(sql);
System.out.println(k); // 1, 证明已经成功处理
int x = 4 / 0; // 这里故意发生错误, 当发生错误时候,会发生错误回滚,数据库数据不会修改
stmt.close();
conn.close();
}catch (Exception e){
conn.rollback();
e.printStackTrace();
}
4.2 Statement 接口
核心作用 : 执行相关SQl语句
4.3 ResultSet
核心作用 : 对查询对象的结果集进行封装,获取相应查询结果
案例展示:
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/db_a";
Connection conn = DriverManager.getConnection(url, "root", "123456");
String sql = "select * from tb_user;";
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery(sql);
while (rst.next()) { // 获取结果集 : 可以根据索引(从1开始)或者列名
int id = rst.getInt(1);
String name = rst.getString("username");
String password = rst.getString(3);
System.out.println(id + " " + name + " " + password);
}
stmt.close();
conn.close();
}
5. PreparedStatement 详解
A. 预编译SQL语句 —— 提升性能 : 因为对于每一个sql语句若使用普通的SQL对象进行使用的话, 需要每一次都对SQL对象进行检查和编译操作,即使对于相同的SQL语句这些操作也是不可避免的。 而使用PreparedStastement之后就可以对相同的sql模板进行一次检查与编译操作,简耗的时间的花销。
B. 防止SQL注入(即原本的拼接字符串的操作可能导致某些特定字符串写上去过后导致字符串的验证操作永远为 true), PreparedStatement 可以将需要用户填入的部分使用 ? 来代替,然后再将用户输入的字符串放入到对应的?上面去,并且会对一些敏感字符进行转义(例如将 ’ 改为 /’ , 前面加上一个斜杠来进行转义, 防止引起字符串拼接所导致的错误 )
例如以下图片: 最后导致拼接的结果永远为true
实例:
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/db_a?&useServerPrepStmts=true"; // 后面一定要加上 useServerPrepStmts=true 才证明预处理开启
Connection conn = DriverManager.getConnection(url, "root", "123456");
String sql = "update tb_user set password = ? where id = ?";
PreparedStatement psmt = conn.prepareStatement(sql); // 在此个语句进行就已经完成检查编译操作
psmt.setString(1,"xxxx");
psmt.setInt(2, 6);
psmt.executeUpdate();
psmt.close();
conn.close();
}