[mybatis]映射文件_参数处理_#和$取值区别

Posted 唐火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[mybatis]映射文件_参数处理_#和$取值区别相关的知识,希望对你有一定的参考价值。

  • #:可以获取map中的值或者pojo对象属性的值
  • $:可以获取map中的值或者pojo对象属性的值
    • 区别:
      • #:是以预编译的形式,将参数设置到sql语句中,相当于原生jdbc的PreparedStatement;防止sql注入
      • $:取出的值直接拼接在sql语句中;会有安全问题;
      • 大多情况下,我们取参数的值都应该去使用#;

DEBUG 01-23 09:00:50,805 ==>  Preparing: select * from tb1_employee where id = 1 and last_name = ?   (BaseJdbcLogger.java:159) 
DEBUG 01-23 09:00:50,835 ==> Parameters: Tom(String)  (BaseJdbcLogger.java:159) 
DEBUG 01-23 09:00:50,852 <==      Total: 0  (BaseJdbcLogger.java:159) 

原生jdbc不支持占位符的地方,我们就可以使用$进行取值
比如分表:按照年份分表拆分,排序等

select * from 2017_salary where xxx;

写成:

select * from $year_salary where xxx;
select * from tb1_employee order by $f_name $order
  • example
    <!--public Employee getEmpByMap(Map<String,Object> map);-->
    <select id="getEmpByMap" resultType="com.atguigu.mybatis.bean.Employee">
        select * from $tableName where id = #id and last_name = #lastName
    </select>
 @Test
    public void test03() throws IOException 
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession sqlSession = sqlSessionFactory.openSession();

        try
        
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            Map<String,Object> map = new HashMap<>();

            map.put("id",1);

            map.put("lastName","Tom");

            map.put("tableName","tb1_employee");

            Employee employee = mapper.getEmpByMap(map);

            System.out.println(employee);

        finally 

            sqlSession.close();

        
    

以上是关于[mybatis]映射文件_参数处理_#和$取值区别的主要内容,如果未能解决你的问题,请参考以下文章

[mybatis]映射文件_参数处理

[刘阳Java]_MyBatis_映射文件的常用标签总结_第5讲

传参在mybatis的sql映射文件中正确获取

阶段3 1.Mybatis_05.使用Mybatis完成CRUD_2 Mybatis的CRUD-保存操作

MyBatis3系列__04CRUD以及参数处理

mybatis动态sql中的两个内置参数(_parameter和_databaseId)