MyBatis底层实现模糊查询的方法有哪些
MyBatis实现模糊查询
模糊查询在我们开发中是一项必不可缺少的重要内容。、
对于我们mybatis实现模糊查询有五种方式,以下具体的实现步聚:
1. 添加模糊查询的接口方法likeSearchUsers
/**
* 根据name模糊查询
* @param name
* @return
*/
public List<User> likeSearcherUsers(String name);
2.配置接口方法对应的sql文件
1) 配置占位符方式#{}
<select id="likeSearcherUsers" parameterType="String" resultType="cn.offcn.entity.User">
select * from user where name like #{name}
</select>
<!--此时如果要实现模糊查询,查询的关键字前后需要带有%,如查询姓名中带有王的,这样写查询关键字:%王% -->
2) 配置拼接字符串方式${}——存在sql注入问题
<select id="likeSearcherUsers" parameterType="String" resultType="cn.offcn.entity.User">
select * from user where name like '%${value}%'
</select>
我们在上面将原来的#{}占位符,改成了${value}。
注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其它名字。
3) 配置mysql函数方式concat
<select id="likeSearcherUsers" parameterType="String" resultType="cn.offcn.entity.User">
select * from user where name like concat('%',#{name},'%')
</select>
<!--函数方式concat只能用在mysql数据库中,如果用在其他数据库会有问题-->
4)动态标签
<select id="getPersonByLikeName2" resultMap="BaseResultMap">
<bind name="personName" value="'%' + _parameter.getName() + '%'"></bind>
select * from person where p_name like #{personName}
</select>
<!--此种方法模糊查询的只能是实体类对象,不能是基本数据类型数据-->
5)最佳方式——配置占位符方式#{}实现模糊查询且避免sql注入
<select id="getPersonByLikeName" resultMap="BaseResultMap">
select * from person where p_name like '%' #{name} '%'
</select>
<!--此种方法#{name}左右空格不可忽略-->
3.#{}和${}的区别
1.#{}是预编译处理,${}是字符串替换(有可能会产生sql注入问题)。
2.Mybatis在处理${}时,就是把${}替换成变量的值。
3.Mybatis在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。
4.使用#{}可以有效的防止 SQL 注入,提高系统安全性。