• 系列五、映射文件xxxMapper.xml


    一、概述

            mapper映射文件是mybatis中最重要的部分,涉及到的细节也非常多。

    1.1、parameterType

    表示输入参数的类型。例如:

    1. <select id="getUserById" parameterType="integer" resultType="org.star.entity.model.UserDO">
    2. select id,username,address from `user` where id = #{id}
    3. select>

    二、$ vs #

    2.1、概述

            mybatis中,当我们在xxxMapper.xml中引用变量时,默认使用的是 # ,如上所示,但是除了 # 之外,我们也可以使用 $ 来应用变量,如下所示:

    1. <select id="getUserById" parameterType="integer" resultType="org.star.entity.model.UserDO">
    2.     select id,username,address from `user` where id = ${id}
    3. select>

            在旧版本的MyBatis中,如果使用$来引用一个变量,那么这个变量需要通过@Param取别名,但是在新版本的MyBatis中,无论是 $ 还是 #,如果只有一个参数,可以不用取别名,如下所示: 

    1. public interface UserMapper {
    2.     /**
    3.      * 根据id查询用户
    4.      * @param id
    5.      * @return
    6.      */
    7.     UserDO getUserById(Integer id);
    8. }

    2.2、区别

    2.2.1、使用 $ 打印的日志

    2.2.2、使用 # 打印的日志

            通过观察两者打印的日志信息,可以很明显的看到 $引用的变量,在执行时SQL直接拼接好了,没有参数。而 # 引用的变量,使用了预编译的方式。在传统的jdbc调用中,sql的执行,我们可以通过字符串拼接或者占位符的方式来解决参数传递问题。在mybatis中当然也支持,在mybatis中,$传递的参数相当于jdbc中的字符串拼接,而#则相当于jdbc中的占位符。

    2.3、如何选择

            一般来说,由于参数拼接的方式存在sql注入的风险,因此日常开发中我们大多使用#的方式进行传值,但是在一些特殊的场景下,又不得不使用这种方式。有的sql拼接实际上可以通过数据库函数的方式来解决,例如模糊查询,代码如下:

    1. <select id="getUserByUsername" parameterType="string" resultType="org.star.entity.model.UserDO">
    2.     select id,username,address from `user` where username like concat('%',#{username},'%')
    3. select>

            但是有的sql无法使用#来拼接,例如传递一个动态字段进来,假设我想查询所有的数据,需要排序查询,但是排序的字段不确定,需要通过参数传入,这种场景下就只能使用$来解决了,例如有如下方法:

    List listAllUser(String search);

  • 相关阅读:
    淘宝/天猫API:item_search_best-天猫畅销榜
    潇洒郎: 小白一次性成功——小米红米手机解BL锁+ ROOT-刷面具
    一段代码实现WordPress彩色标签云
    BAT大厂Java面试,如何抓住面试重点知识?收割大厂offer
    Hotspot启动原理(二)
    three.js之访问几何体数据与几何体的旋转平移
    现在可以在Mac桌面上快速打开C知道进行AI提问
    ElasticSearch概述
    【Ambari】银河麒麟V10 ARM64架构_安装Ambari2.7.6&HDP3.3.1问题总结
    Python 算法高级篇:堆排序的优化与应用
  • 原文地址:https://blog.csdn.net/HelloWorld20161112/article/details/134172014