文章目录
- 前言
- 一、PrepareStatement类是什么?
- 二、实操展示
- 1.增
- 2.删
- 3.改
- 4.查
- 总结
前言
既然连接数据库都可以通过java语言实现,那么通过java语言对数据库进行增删改查的操作自然是顺理成章的事情了。
一、PrepareStatement类是什么?
PrepareStatement类是Java JDBC API中的一个类,用于执行预编译的SQL语句。这个类实现java语言增删改查数据库的功能。它是Statement的子接口,提供了更高级别和更灵活的功能。(所以在编译SQL语句的时候,不要使用Statement类,直接使用它的子接口吧!)
通过使用PrepareStatement类,可以先将SQL语句发送到数据库进行编译,然后可以重复执行该语句,并且可以使用参数化查询和批处理等高级功能。
PrepareStatement类可以防止SQL注入攻击,提高性能,并且可以方便地处理不同类型的数据。
SQL注入攻击,以statement类为例,当使用Statement对象执行动态拼接SQL语句时,如果不对用户输入进行正确的过滤和转义,攻击者可以通过构造恶意的“密码"进行输入来修改或执行未经授权的SQL语句。(利用转义漏洞,绕过了账号密码,直接访问并可以攻击数据)
PrepareStatement的构造方法:
connection.PrepareStatement(String sql);
//创建一个新的PrepareStatement对象,以指定的SQL语句初始化。
connection.PrepareStatement(String sql, int autoGeneratedKeys);
//创建一个新的PrepareStatement对象,以指定的SQL语句和生成的键标志初始化。
connection.PrepareStatement(String sql, int[] columnIndexes);
//创建一个新的PrepareStatement对象,以指定的SQL语句和列索引标志初始化。
connection.PrepareStatement(String sql, String[] columnNames);
//创建一个新的PrepareStatement对象,以指定的SQL语句和列名标志初始化。
PrepareStatement类是没有直接的构造方法的,但是可以通过Connection对象调用PrepareStatement()方法来创建自己的对象。第一个方法是最经常使用的,其他的想忽略也行。
方法 | 功能描述 | 返回值 |
setNull(int parameterIndex, int sqlType) | 将指定的参数设置为SQL NULL | void |
setBoolean(int parameterIndex, boolean x) | 将指定参数设置为给定的Java布尔值 | void |
setByte(int parameterIndex, byte x) | 将指定参数设置为给定的Java字节值 | void |
setShort(int parameterIndex, short x) | 将指定参数设置为给定的Java short值 | void |
setInt(int parameterIndex, int x) | 将指定参数设置为给定的Java int值 | void |
setLong(int parameterIndex, long x) | 将指定参数设置为给定的Java long值 | void |
setFloat(int parameterIndex, float x) | 将指定参数设置为给定的Java float值 | void |
setDouble(int parameterIndex, double x) | 将指定参数设置为给定的Java double值 | void |
setBigDecimal(int parameterIndex, BigDecimal x) | 将指定参数设置为给定的Java BigDecimal值 | void |
setString(int parameterIndex, String x) | 将指定参数设置为给定的Java String值 | void |
setBytes(int parameterIndex, byte[] x) | 将指定参数设置为给定的Java 字节数组 | void |
setDate(int parameterIndex, Date x) | 将指定参数设置为给定的SQL date值 | void |
setTime(int parameterIndex, Time x) | 将指定的参数设置为给定的SQL时间戳值 | void |
setObject(int parameterIndex, Object x) | 将指定参数设置为给定的Java Object对象 | void |
executeQuery() | 执行这个PreparedStatement对象中的SQL查询,并返回查询生成的ResultSet对象 | ResultSet |
executeUpdate() | 执行这个PreparedStatement对象中的SQL语句(可能是INSERT、UPDATE或DELETE语句),并返回受影响行的计数 | int |
execute() | 执行这个PreparedStatement对象中的SQL语句,它可能返回多个结果 | boolean |
clearParameters() | 清除PreparedStatement对象中的当前参数值 | void |
setArray(int parameterIndex, Array x) | 将指定参数设置为给定的SQL Array对象 | void |
setBlob(int parameterIndex, Blob x) | 将指定参数设置为给定的SQL Blob对象 | void |
setClob(int parameterIndex, Clob x) | 将指定参数设置为给定的SQL Clob对象 | void |
使用以上PrepareStatement的方法就可以实现对数据库的增删改查的功能了。
PrepareStatement类比Statement类多一个预处理的功能,需要使用到通配符" ? "(也正是该功能减轻了SQL注入攻击)
所以,PrepareStatement实例化时的String数据的SQL语句时不完整的,需要将通配符替换掉,才能进行使用,这和格式化输出语句的道理一样。
在上面常用方法的表格中,最常见的是set()方法,尽管数据类型不同,但第一个参数:int parameterIndex 该参数都是指在String字符串中编写SQL语句的第几个通配符,然后这个在SQL语句中的问号( ? )可以被你设置的第二个数据类型替代,SQL语句被补全了,可以进行下一步执行运行的操作了。
二、实操展示
以下的所有操作都建立在连接好数据库之后,对连接框架的代码进行了省略。
增删改查的操作步骤大致都是("查"需要循环输出语句反馈到控制台):
第一步,创建String对象,编写SQL语句。
第二步,利用connection对象调用方法创建PrepareStatement对象。
第三步,使用PrepareStatement类的set()方法,补全SQL语句中的通配符。
最后一步,调用PrepareStatement类的executeUpdate()方法执行该SQL语句。
executeUpdate()方法执行后,Java代码会将SQL语句发送给MySQL数据库,并执行相应的操作,如插入、更新或删除数据。执行完毕后,MySQL数据库会返回操作的结果,Java代码可以通过executeUpdate()方法获取到受影响的行数。
1.增
实操展示:
这是数据库表单原本的样子:
这个table只有三行,需求:添加一个id是104,name是小浩的数据。
主要代码:
String sql = "INSERT INTO table_name (id, name) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, 104);
statement.setString(2, "小浩");
statement.executeUpdate();
运行结果:
如上图所示,刷新Workbench,实时显示出了数据库内容的更新。
2.删
实操展示:
这是数据库表单原本的样子:
需求:删除一个id是103,name是小张的数据。
主要代码:
String sql = "DELETE FROM test_table WHERE id = ? AND name = ?";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 103);
statement.setString(2, "小张");
statement.executeUpdate();
运行结果:
如上图所示,数据库表单的id=103,name=小张的这一串数据已被删除。
3.改
实操展示:
这是数据库表单原本的样子:
需求:将id=104 name=小王的这一串数据里,id值修改为103。
主要代码:
String sql = "UPDATE test_table SET id= ? WHERE id = ? ";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 103);
statement.setInt(2, 104);
statement.executeUpdate();
运行结果:
如上图所示,数据库中小浩的id由104更改为了103。
4.查
这是数据库表单原本的样子:
需求:查询id为101的用户的name值是什么。
主要代码:
String sql = "SELECT name FROM test_table WHERE id = ? ";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 101);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
// 处理查询结果
String value1 = resultSet.getString("name");
System.out.println("查询结果:id值为101的用户名称是 "+value1);
}
运行结果:
对比数据库的信息:
如上面两张图显示,通过PrepareStatement类可以轻松实现java后端与数据库之间的互通。
总结
以上就是使用java的PrepareStatement类对数据库进行增删改查的操作,本文初步介绍了java的使用,没有写关于SQL语句之类的数据库知识,有补充或指正的地方,欢迎在评论区中留言。