网络安全Java代码审计实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1.2 执行SQL语句的几种方式

在Java中执行SQL语句一般有以下几种方式:

● 使用JDBC的java.sql.Statement执行SQL语句。

● 使用JDBC的java.sql.PreparedStatement执行SQL语句。

● 使用Hibernate执行SQL语句。

● 使用MyBatis执行SQL语句。

1.Statement执行SQL语句

java.sql.Statement是Java JDBC下执行SQL语句的一种原生方式,执行语句时需要通过拼接来执行。若拼接的语句没有经过过滤,将出现SQL注入漏洞。

使用方式如下:

典型代码示例:

驱动注册完成后,实例化Statement对象,SQL语句为“"select*from user where id="+id”,如图2-2所示,然后通过拼接的方式传入id的值,id的值在开始时通过“String id="2"”设置为2,运行此代码后可成功获取user表中id为2的数据信息。

图2-2 获取user表中id为2的数据信息

2.PreparedStatement执行SQL语句

PreparedStatement是继承statement的子接口,包含已编译的SQL语句。PreparedStatement会预处理SQL语句,SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定,而是为每个IN参数保留一个问号(?)作为占位符。每个问号的值,必须在该语句执行之前通过适当的setXXX方法来提供。如果是int型则用setInt方法,如果是string型则用setString方法。

PreparedStatement预编译的特性使得其执行SQL语句要比Statement快,SQL语句会编译在数据库系统中,执行计划会被缓存起来,使用预处理语句比普通语句更快。PreparedStatement预编译还有另一个优势,可以有效地防止SQL注入攻击,其相当于Statement的升级版。

使用方式如下:

典型代码示例:

驱动注册完成后,实例化PreparedStatement对象,SQL语句为“SELECT*FROM user WHERE id=?”,然后通过“preparedStatement.setInt(1,id)”传入id的值,id的值在开始时通过“String id="1"”设置为1,运行此代码后可成功获取user表中id为1的数据信息,如图2-3所示。

图2-3 获取user表中id为1的数据信息

3.MyBatis执行SQL语句

MyBatis是一个Java持久化框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来,它支持自定义SQL、存储过程以及高级映射。MyBatis封装了几乎所有的JDBC代码,可以完成设置参数和获取结果集的工作。

MyBatis可以通过简单的XML或注解将原始类型、接口和Java POJO(Plain Old Java Objects,普通老式Java对象)配置并映射为数据库中的记录。要使用MyBatis,只需将mybatis-x.x.x.jar文件置于类路径(classpath)中即可。

(1)MyBatis注解存储SQL语句

(2)MyBatis映射存储SQL语句

(3)定义主体测试代码文件mybaitstest.java

(4)定义SQL映射文件userMapper.xml

(5)定义MyBatista的mybatisConfig.xml配置文件

在测试代码mybaitstest.java中通过“String statement="com.mybatis.userMapper"+".getUser"”调用了“com.mybatis.sql.User”,在userMapper.xml映射文件中执行的是“select*from users where id=#{id}”,通过测试代码“User user=sqlSession.selectOne(statement,"2")”将id的值设置为2,运行完成后输出id为2的数据信息,如图2-4所示。

图2-4 输出id为2的数据信息