JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成 CRUD 操作。1.2 API
| 类型 | 权限定名 | 简介 |
|---|---|---|
| class | java.sql.DriverManager | 管理多个数据库驱动类,提供了获取数据库连接的方法 |
| interface | java.sql.Connection | 代表一个数据库连接(当connection不是null时,表示已连接数据库) |
| interface | java.sql.Statement | 发送SQL语句到数据库工具 |
| interface | java.sql.ResultSet | 保存SQL查询语句的结果数据(结果集) |
| class | java.sql.SQLException | 处理数据库应用程序时所发生的异常 |
- 在项目下新建一个lib目录,在目录中导入相关的jar包,直接复制进目录(注意mysql版本,不同版本不同驱动)
将mysql-connector-java-5.1.19 添加到项目库,右键 Add as Libraay,点击 OK。
//mysql 5.X 版本
Class.forName("com.mysql.jdbc.Driver");//加载驱动
2.2 获取连接对象
通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象
URL:jdbc:mysql://localhost:3306/databaseusername:rootpassword:1234
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "123456");
2.3 获取发送 SQL 的对象
通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。
Statement statement = connection.createStatement();2.4 执行SQL 语句
执行 SQL 语句并接收执行结果。
String sql = "INSERT INTO `user`( `name`, `password`) VALUES ('ahao', '123456')";
int i = statement.executeUpdate(sql);
注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’DML 语句:增删改时,返回受影响行数(int 类型)。DQL 语句:查询时,返回结果数据(ResultSet 结果集)。 2.5 处理结果
接受处理操作结果。
if(i == 1){
System.out.println("受影响的行: "+i);
}
受影响行数:逻辑判断、方法返回。查询结果集:迭代、依次获取。 2.6 释放资源
遵循先开后关原则,释放所使用到的资源对象。
statement.close(); connection.close();三、CRUD 案例
数据库表结构素材:
-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `password` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;3.1 插入数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
//3.获取statement对象
Statement statement = connection.createStatement();
//4.执行sql
String sql = "INSERT INTO `user`( `username`, `password`) VALUES ('ahao', '123456')";
int i = statement.executeUpdate(sql);
//5.处理结果
if (i>0){
System.out.println("受影响的行:"+i);
}
//6.关闭资源
statement.close();
connection.close();
}
}
3.2 删除数据(根据id)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
//3.获取statement对象
Statement statement = connection.createStatement();
//4.执行sql 删除id为1 的数据
String sql = "DELETE FROM USER WHERe id=1";
int i = statement.executeUpdate(sql);
//5.处理结果
if (i>0){
System.out.println("受影响的行:"+i);
}
//6.关闭资源
statement.close();
connection.close();
}
}
3.3 更新数据(修改)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class UpdateDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
//3.获取statement对象
Statement statement = connection.createStatement();
//4.执行sql 将id为2的用户名改为 法外狂徒
String sql = "update user set username='法外狂徒' where id=2";
int i = statement.executeUpdate(sql);
//5.处理结果
if (i>0){
System.out.println("受影响的行:"+i);
}
//6.关闭资源
statement.close();
connection.close();
}
}
3.4 查询
import java.sql.*;
public class SelectDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
//3.获取statement对象
Statement statement = connection.createStatement();
//4.执行sql 查询user表中的所有数据
String sql = "select * from user";
ResultSet rs = statement.executeQuery(sql);
//5.处理结果
while (rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String address = rs.getString("address");
System.out.println(id+"t"+username+"t"+password+"t"+address);
}
//6.关闭资源
statement.close();
connection.close();
}
}
四、 SQL注入
4.1 什么是 SQL 注入
用户输入的数据中有 SQL 关键字或语法并且参与了 SQL 语句的编译,导致 SQL 语句编译后的条件含义为 true,一直得到正确的结果。这种现象称为 SQL 注入。
4.2 如何避免 SQL 注入使 SQL 语句在用户输入数据前就已进行编译成完整的 SQL 语句,再进行填充数据。
五、prepareStatement 5.1 PreparedStatement的应用预编译SQL 语句,效率高。安全,避免SQL注入 。可以动态的填充数据,执行多个同构的 SQL 语句。 5.1.1 参数标记
//1.预编译 SQL 语句
PreparedStatement ps = connection.prepareStatement("insert into user (username,password,address) values (?,?,?)");
注意:JDBC中的所有参数都由 ?符号占位,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。 5.1.2 动态参数绑定
ps.setXxx(下标,值) 参数下标从 1 开始,为指定参数下标绑定值
//1.预编译 SQL 语句
PreparedStatement ps = connection.prepareStatement("insert into user (username,password,address) values (?,?,?)");
//2.为参数下标赋值
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getAddress());
六、封装DBUtils工具类
6.1 重用
import java.sql.*;
public class DBUtils {
static {//类加载,执行一次
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConnection(){
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//释放资源
public static void close(ResultSet resultSet){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(PreparedStatement ps){
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con){
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}



