• 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'}
  • 相关阅读:
    VM环境安装Linux系统
    设置ShowDialog
    sqlserver同步表的脚本
    C#winform设置DateTimePicker的时间格式
    C#winform解析marc显示在datagridview中以及marc卡片显示
    C#实现图书馆程序导入ISO-2709格式(MARC)功能
    时间格式转换+固定字段加空格
    sqlserver 保留小数方法
    winform的datagridview单元格输入限制和右键单击datagridview单元格焦点跟着改变
    怎么查看那个端口被占用
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/10038589.html
Copyright © 2020-2023  润新知