方式一:拼接 %
java
public List<User> getUserByUsername(String username) {
// 手动拼接模糊查询字符串
return userMapper.getUserByUsername('%' + username +'%');
}
xml
<select id="getUserByUsername" paramType="string" resultType="user">
selecct * from user where username like #{username};
</select>
缺点: java代码中需要拼接字符串,稍微麻烦点。
方式二:配置文件中写 %
java
public List<User> getUserByUsername(String username) {
// 手动拼接模糊查询字符串
return userMapper.getUserByUsername(username);
}
xml
<select id="getUserByUsername" paramType="string" resultType="user">
selecct * from user where username like '%${username}%';
</select>
缺点: MyBatis 的 $ 底层使用的是拼接的方式,存在SQL注入的风险。
方式三:concat 函数
java
public List<User> getUserByUsername(String username) {
// 手动拼接模糊查询字符串
return userMapper.getUserByUsername(username);
}
xml
<select id="getUserByUsername" paramType="string" resultType="user">
selecct * from user where username like concat('%', #{username}, '%');
</select>
补充知识点
MyBatis
使用#
底层会替换为?
, 交予PrepareStatement
去执行,从而避免了SQL注入的问题。$
则标识拼接字符串,将参数不经过特殊处理直接进行拼接会造成SQL注入的问题。