MyBatis 3.0_[tp-24-25]_映射文件_参数处理_#与$取值区别_#{}更丰富的用法

笔记要点
出错分析与总结

/**================Mybatis参数值的获取:#和$符号的区别===============
        *  #{}:可以获得map中的值或者pojo对象属性的值;
        *  ${}:可以获得map中的值或者pojo对象属性的值;
        *    区别:
        *        #{}: 是以预编译的形式,直接将参数设置到sql语句中;
 *                  使用PreparedStatement的sql封装方法 ,防止sql注入;
 *               ${}: 取出的值直接封装在sql语句中,不能防止sql注入,会有安全问题;
 *           总结:
 *              大多数情况下,我们取参数的值都应该去使用#{};
 *              但是,原生jdbc不支持占位符的地方,我们就可以使用${}进行取值;
 *              比如分表/排序/取到的参数值是表名...:按照年份分表拆分:
 *                      select * from ${year}_salary where xxx;
 *                      select * from tbl_employee order by ${f_name};
 *         ----------------------------------
 * #{}:更丰富的用法:
 *          规定参数的一些规则:  javatype/jdbcType/mode(存储过程)/.......
 *        jdbcType通常需要在某种特定的条件下被设置,在我们的数据为null的时候,
 *        有些数据库可能不能识别mybatis对null的默认处理;比如Oracle(报错)mysql(没有问题).
 *
 *
        */

 


工程组织

接口  EmployeeMapper 

public interface EmployeeMapper {
    //多个参数处理,传入map
    public Employee getEmpByMap(Map<String,Object> map);
}

映射文件 Employee.xml

<mapper namespace="com.dao.EmployeeMapper"><!--namespace: 名称空间;id: 唯一标识; resultType:返回值类型; -->
    <!--public Employee getEmpByMap(Map<String,Object> map);-->
    <select id="getEmpByMap" resultType="com.bean.Employee" databaseId="mysql">
        select * from ${table_name}
        where id = ${id} and last_name = #{lastName}
    </select>

 

测试代码

public class test_tp24 {
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test05() throws Exception{
        //默认是不自动提交数据的,需要我们自己手动提交
        SqlSession openSession = getSqlSessionFactory().openSession();
        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);

            HashMap<String, Object> map = new HashMap<>();
            map.put("lastName", "葫芦娃");
            map.put("id", 4);
            map.put("table_name", "tbl_employee");
            Employee empByMap = mapper.getEmpByMap(map);
            System.out.println(empByMap);
            //最后手动提交
            openSession.commit();
        }finally {
            openSession.close();
        }
    }
}

 

测试结果

 

DEBUG 11-29 15:22:20,111 ==>  Preparing: select * from tbl_employee where id = 4 and last_name = ?   

(BaseJdbcLogger.java:145) 
DEBUG 11-29 15:22:20,132 ==> Parameters: 葫芦娃(String)  (BaseJdbcLogger.java:145) 
DEBUG 11-29 15:22:20,142 <==      Total: 1  (BaseJdbcLogger.java:145) 

Employee{id=4, lastname='葫芦娃', email='葫芦娃@163.com', gender='0'}

 

posted @ 2018-11-29 15:26  山枫叶纷飞  阅读(142)  评论(0编辑  收藏  举报