未经许可,不得转载。
文章目录
- Hibernate 与 SQL 安全
- MyBatis 与 SQL 安全
- MyBatis 的两种写法
- 1. 基于注解的 MyBatis 写法
- 2. 基于 XML 配置的 MyBatis 写法
- 解决方案
Hibernate 与 SQL 安全
在 Java 开发中,Hibernate 是一种流行的 ORM(对象关系映射) 框架,它将数据库中的表与 Java 类进行映射,简化了数据库操作。通过 Spring 的依赖注入,我们可以轻松地与 Hibernate 集成,从而提高开发效率并减少 SQL 操作的复杂性。以下是一个简单的 Hibernate 使用示例:
@Autowired
CategoryDAO categoryDAO; // 依赖注入@RequestMapping("/hibernate")
public String hibernate(@RequestParam(name = "id") int id) {Category category = categoryDAO.getOne(id); // 使用 Hibernate 获取数据return category.getName(); // 返回类别名称
}
在这个例子中,CategoryDAO
是通过 依赖注入 获取的一个数据访问对象,它封装了对数据库的操作。通过 getOne(id)
方法,我们可以直接从数据库中查询指定 ID 的 Category 实体,并返回其名称。
Hibernate 默认采用 预编译 SQL 机制来执行查询。当我们使用 Hibernate 的方法时,它会自动处理查询语句并使用预编译的方式与数据库交互,从而避免了 SQL 注入风险。
然而,在某些复杂场景下,我们可能需要使用 手写 SQL。例如,当我们使用 Hibernate 的 @Query
注解或 Session.createSQLQuery()
方法时,涉及动态拼接 SQL 的场景(如 LIKE、ORDER BY、IN 等)时,Hibernate 不再自动生成 SQL 语句。
MyBatis 与 SQL 安全
MyBatis 是一个持久层框架,用于简化 Java 应用程序与数据库之间的交互。它本质上是对 JDBC(Java Database Connectivity)的封装,提供了 SQL 语句的映射功能,使开发者能够更方便地执行数据库操作。
MyBatis 的两种写法
注意:在 Maven 项目 中,mapper.xml
文件必须存放在 resources
目录 下,才能被 MyBatis 正确识别并加载。
MyBatis 主要提供了两种方式来执行 SQL 查询:基于注解的方式 和 基于 XML 配置的方式。
1. 基于注解的 MyBatis 写法
@Mapper
public interface CategoryMapper {@Select("SELECT * FROM category_ WHERE name= '${name}' ")CategoryM getByName(@Param("name") String name);
}
在这种方式下,SQL 语句直接写在 @Select
注解 中,MyBatis 会在运行时解析并执行该 SQL 语句。
2. 基于 XML 配置的 MyBatis 写法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.seaii.springboot.mapper.CategoryMapper"><select id="get" resultType="cn.seaii.springboot.pojo.CategoryM">SELECT * FROM category_ WHERE id= ${id}</select>
</mapper>
在 XML 方式中,SQL 语句被写入独立的 mapper.xml
文件中,并通过 namespace
关联接口,实现 SQL 的分离管理。
上述代码中的 WHERE name= '${name}'
和 WHERE id= ${id}
直接拼接用户输入,可能导致 SQL 注入漏洞。
解决方案
应该使用 #{} 方式 绑定参数,避免 SQL 注入问题。
基于注解
@Mapper
public interface CategoryMapper {@Select("SELECT * FROM category_ WHERE name= #{name}")CategoryM getByName(@Param("name") String name);
}
基于 XML
<select id="get" resultType="cn.seaii.springboot.pojo.CategoryM">SELECT * FROM category_ WHERE id = #{id}
</select>
这样,MyBatis 会自动 将参数作为占位符处理,避免 SQL 注入风险。