Mybatis${value} #{} 区别分析

2020-03-15  本文已影响0人  名字是乱打的

方法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语句正常写,我们讲%放在了传参里,将匹配字符做一个整体传入

方法二: \color{red}{固定占位符} ${value}

其他的不变,只修改mapper.xml

 <!--根据名字模糊查询用户方法二 固定占位符-->
    <select id="findUserByNameMethods2" parameterType="string" resultType="user">
        select * from  user  where username like  '${value}'
    </select>

提示 :
这里`${value}` 一点不能改,一点不能少
原因:
源码已指出,这里是通过固定的value作为key

3 #{}与${}的区别

如下图,展示了上面两种模糊查询结合第三项的结果

而不用占位符可能导致的sql注入漏洞大家都知道.

上一篇下一篇

猜你喜欢

热点阅读