zoukankan      html  css  js  c++  java
  • 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'}
  • 相关阅读:
    Swift流程控制之循环语句和判断语句详解
    框架内的文件集合
    十分钟让你明白Objective-C的语法(和Java、C++的对比)
    Swift版音乐播放器(简化版),swift音乐播放器
    通过数字电视通过宽带网络取代互联网电视机顶盒应用
    JS学习笔记-OO创建怀疑的对象
    如果不能显示真正的考验个别车型toast问题解决
    swift 它们的定义TabBarItem
    NSUserDefaults API简单的介绍和使用英文文件
    FZU 1686 龙之谜 重复覆盖
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/10038589.html
Copyright © 2011-2022 走看看