一、mybatis是对JDBC的封装,在JDBC中占位符使用的是?,在mybatis中占位符有两种形式,分别是#{}和${}

大多数情况下使用#{},少数需要使用${}

二、#{}和${}的区别在于,使用#{}占位符,当传递给sql 的参数替换占位符时会进行转译,如果传递的参数是字符串,在替换占位符时,会加上一对''号;而参数在替换${}时是直接拼接

三、当需要为不带引号的字符串进行占位时可以使用${}占位符

四、举例对比

根据字段name进行模糊查询

1、使用${}占位符

mapper.xml文件中:

<select id="findLike" resultType="com.qxzh.Emp">
    select * from emp where name like '%${name}%'
</select>

java中:

public static List<Emp> findLike(){
        List<Emp> list =null;
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSession sqlSession = new SqlSessionFactoryBuilder().build(in).openSession();
            //封装参数
//            Emp emp=new Emp();
//            emp.setName("刘");
//            list = sqlSession.selectList("EmpMapper.findLike", emp);
        //或者:
            HashMap<String, String> map = new HashMap<>();
            map.put("name","陈");
            list = sqlSession.selectList("EmpMapper.findLike", map);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

2、使用#{}占位符

mapper.xml中:

<select id="findLike2" resultType="com.qxzh.Emp">
    select * from emp where name like #{name}
</select>

java中:

public static List<Emp> findLike(){
        List<Emp> list =null;
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSession sqlSession = new SqlSessionFactoryBuilder().build(in).openSession();
            //封装参数
//            Emp emp=new Emp();
//            emp.setName("%刘%");
//            list = sqlSession.selectList("EmpMapper.findLike2", emp);
       //或者
            HashMap<String, String> map = new HashMap<>();
            map.put("name","%陈%");
            list = sqlSession.selectList("EmpMapper.findLike2", map);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }