方法1:匹配字符作参数整体传入
mapper.java
public interface UserMapper {
int findCountUsers();
}
mapper.xml
<!--根据名字模糊查询用户-->
<select id="findUserByName" parameterType="string" resultType="user">
select * from user where username like #{name}
</select>
test.java
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private UserMapper userMapper;
@Before//用于在测试方法执行之前执行
public void init() throws Exception {
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userMapper = sqlSession.getMapper(UserMapper.class);
}
@After//用于在测试方法执行之后执行
public void destroy() throws Exception {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
@Test
public void findUserByName() {
List<User> userList = userMapper.findUserByName("%王%");
for (User u: userList){
System.out.println(u);
}
}
}
该种方法,我们的sql语句正常写,我们讲%放在了传参里,将匹配字符做一个整体传入
方法二: ${value}
其他的不变,只修改mapper.xml
<!--根据名字模糊查询用户方法二 固定占位符-->
<select id="findUserByNameMethods2" parameterType="string" resultType="user">
select * from user where username like '${value}'
</select>
提示 :
这里`${value}` 一点不能改,一点不能少
原因:
源码已指出,这里是通过固定的value作为key
3 #{}与${}的区别
如下图,展示了上面两种模糊查询结合第三项的结果而不用占位符可能导致的sql注入漏洞大家都知道.
网友评论