当前位置: 首页 > news >正文

系列五、映射文件xxxMapper.xml

一、概述

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

1.1、parameterType

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

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

二、$ vs #

2.1、概述

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

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

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

public interface UserMapper {

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    UserDO getUserById(Integer id);

}

2.2、区别

2.2.1、使用 $ 打印的日志

2.2.2、使用 # 打印的日志

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

2.3、如何选择

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

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

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

List<UserDO> listAllUser(String search);

http://www.lryc.cn/news/214838.html

相关文章:

  • 【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种
  • P9117 [春季测试 2023] 涂色游戏
  • react如何进行项目配置代理
  • 2023杭州.云栖大会:计算,为了无法计算的价值
  • MIT6.5830 Lab1-GoDB实验记录(二)
  • 设计模式—创建型模式之工厂模式
  • N.B.缩略语的意思
  • SpringBoot源码透彻解析—自动装配
  • 基于springboot实现疫情防控期间外出务工人员信息管理系统项目【项目源码+论文说明】
  • 自动曝光算法(第一讲)
  • QStandardItemModel,setData和setItem区别
  • 应用出海新福祉,融云助IM社交迅速对齐海外用户体验
  • 64T存储松下mov和索尼mp4文件变0字节恢复案例
  • 【C/C++】 常量指针、指针常量、指向常量的常指针
  • 容斥原理,多步容斥
  • vue(32) : win10创建vue2基础前端框架
  • 如何制作一款资源网站app
  • 解决在Win7下运行一些老游戏花屏或色彩异常问题的方法
  • 使用vue3+vite+elctron构建小项目介绍Electron进程间通信
  • 家政APP开发服务同城预约维修接单管理系统软件小程序
  • NOIP2023模拟8联测29 C. 蛋糕
  • echarts的图表立体感——实现立体柱状图和立体饼图的详细教程
  • 解决VSCode使用SSH远程连接时无法指定用户名的问题
  • Vue Camera是什么,如何用
  • ORANGE室内高尔夫—韩国室内模拟高尔夫原装进口真实体验身临其境
  • 【观察】从口袋到云端全景式AI创新,联想“全栈智能”再升级
  • linux 实用命令搜集 —— 筑梦之路
  • 08-Docker-网络管理
  • 【VS Code】使用 VS Code 登陆远程服务器上的 Docker 容器
  • 用Python做数据分析之数据统计