JDBC 的介绍
Java DataBase Connectivity 是一个独立于特定数据库的管理系统,通用的 SQL 数据库存取和操作的公共接口。
JDBC 定义了一组标准,为访问不同数据库提供了统一的途径。
JDBC 接口包括两个层面:
1、JDBC API:面向应用的 API,供程序员调用面向数据库的 API
供开发者调用的接口:java.sql 和 javax.sql
- DriverManager 类
- Connection 接口
- Statement 接口
- ResultSet 接口
2、DriverManager:面向数据库的API,负责连接不同厂商的数据库驱动
- 加载数据库驱动,Java 程序和数据库之间的桥梁。
- 获取 Connection,Java 程序与数据库的一次连接。
- 创建 Statement 对象,由 Connection 产生,执行 SQL 语句。
- 如果需要接收返回值,创建 ResultSet 对象,保存 Statement 执行之后所查询到的结果。
JDBC 的使用示例
-
引入驱动:mysql-connector-java-8.0.11.jar
-
insert 示例代码:
public class Test {
public static void main(String[] args) {
try {
//1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url,user,password);
//3. 创建Statement,执行sql语句
String sql = "insert into user(name,age) values('诸葛亮',37)";
Statement statement = connection.createStatement();
int result = statement.executeUpdate(sql);
System.out.println(result);
//关闭连接
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1
- select 示例代码:
public class Test {
public static void main(String[] args) {
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url,user,password);
//创建Statement,执行sql语句
String sql = "select * from user";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()) {
Integer id = resultSet.getInt("id");
String name = resultSet.getString("name");
Integer age = resultSet.getInt("age");
System.out.println(id+"-"+name+"-"+age);
}
//关闭连接
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1-BLU-20
2-张三-23
3-李四-35
4-王五-27
5-小明-44
6-诸葛亮-37
PreparedStatement
Statement 的子类,提供了 SQL 占位符的功能
使用 Statement 进行开发有两个问题:
1、需要频繁拼接 String 字符串,出错率较高。
2、存在 SQL 注入的⻛险。
SQL 注入:利用某些系统没有对用户输入的信息进行充分检测,在用户输入的数据中注入非法的 SQL语句,从而利用系统的 SQL 引擎完成恶意行为的做法。
例如:
String name = "xxxx' or '1'='1";
String password = "xxxx' or '1'='1";
String sql = "select * from user where name = '"+ name +"' and password = '"+ password +"'" ;
使用 PreparedStatement 代替 Statement 的写法:
public class Test {
public static void main(String[] args) {
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url,user,password);
//创建Statement,执行sql语句
String name = "BLU";
int age = 20;
String sql = "select * from user where name = ? and age = ? ";
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.setString(1, name);
prepareStatement.setInt(2, age);
ResultSet resultSet = prepareStatement.executeQuery();
if(resultSet.next()) {
System.out.println("查询成功");
Integer id = resultSet.getInt("id");
String dbName = resultSet.getString("name");
Integer dbAge = resultSet.getInt("age");
System.out.println(id+"-"+dbName+"-"+ dbAge);
}else {
System.out.println("查询失败");
}
//关闭连接
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
查询成功
1-BLU-20