首页 > 其他分享 >Mybatis06 - 获取参数的两种方式 #{} ${}

Mybatis06 - 获取参数的两种方式 #{} ${}

时间:2023-02-13 21:12:47浏览次数:40  
标签:语句 实体类 类型 int 获取 参数 emp SQL Mybatis06

数据输入

实际使用时仅需考虑两种情况

  1. 实体类型:接口传参是实体类,则在 SQL语句中直接使用类的属性 #{属性1},#{属性2}...
  2. 非实体类型:在接口传参时使用 @Param("key") value注解,则SQL语句中直接使用 #

#{}形式

Mybatis会将SQL语句中的#{}转换为问号占位符。

${}形式

${}形式传参,底层Mybatis做的是字符串拼接操作,'${xxx}'。

通常不会采用{}的方式传值。 一个特定的适用场景是:通过Java程序动态生成数据库表,表名部分需要Java程序通过参数传入;而JDBC对于表名部分是不能使用问号占位符的,此时只能使用{}。

结论:实际开发中,能用#{}实现的,肯定不用${}。

1、Mybatis总体机制概括

img

2、概念说明

这里数据输入具体是指上层方法(例如Service方法)调用Mapper接口时,数据传入的形式。

  • 简单类型:只包含一个值的数据类型
    • 基本数据类型:int、byte、short、double、……
    • 基本数据类型的包装类型:Integer、Character、Double、……
    • 字符串类型:String
  • 复杂类型:包含多个值的数据类型
    • 实体类类型:Employee、Department、……
    • 集合类型:List、Set、Map、……
    • 数组类型:int[]、String[]、……
    • 复合类型:List、实体类中包含集合……

3、单个简单类型参数

①Mapper接口中抽象方法的声明

Employee selectEmployee(Integer empId);

②SQL语句

<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">

  select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{empId}

</select>

单个简单类型参数,在#{}中可以随意命名,但是没有必要。通常还是使用和接口方法参数同名。

4、实体类类型参数

①Mapper接口中抽象方法的声明

int insertEmployee(Employee employee);

②SQL语句

<insert id="insertEmployee">

  insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})

</insert>

③对应关系

img

④结论

Mybatis会根据#{}中传入的数据,加工成getXxx()方法,通过反射在实体类对象中调用这个方法,从而获取到对应的数据。填充到#{}解析后的问号占位符这个位置。

5、零散的简单类型数据

零散的多个简单类型参数,如果没有特殊处理,那么Mybatis无法识别自定义名称:

#{xxx} 底层翻译为 ? 即 jdbc中SQL语句中的站位符,不能区分

${xxx} 底层翻译为字符串拼接

①Mapper接口中抽象方法的声明

int updateEmployee(@Param("empId") Integer empId,@Param("empSalary") Double empSalary);

②SQL语句

<update id="updateEmployee">

  update t_emp set emp_salary=#{empSalary} where emp_id=#{empId}

</update>

③对应关系

img

6、Map类型参数

①Mapper接口中抽象方法的声明

int updateEmployeeByMap(Map<String, Object> paramMap);

②SQL语句

<update id="updateEmployeeByMap">

  update t_emp set emp_salary=#{empSalaryKey} where emp_id=#{empIdKey}

</update>

③junit测试

@Test

public void testUpdateEmpNameByMap() {

  EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);

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

  paramMap.put("empSalaryKey", 999.99);

  paramMap.put("empIdKey", 5);

  int result = mapper.updateEmployeeByMap(paramMap);

  log.info("result = " + result);

}

④对应关系

#{}中写Map中的key

⑤使用场景

有很多零散的参数需要传递,但是没有对应的实体类类型可以使用。使用@Param注解一个一个传入又太麻烦了。所以都封装到Map中。

标签:语句,实体类,类型,int,获取,参数,emp,SQL,Mybatis06
From: https://www.cnblogs.com/Ashen-/p/17117800.html

相关文章

  • Docker参数命令大全详解
    哦,docker就是那个鲸鱼哇,集装箱技术,我是这么理解的。那我觉得这部分知识有什么好记好背的,用到了直接CTRL+F搜索,然后CTRL+C复制,再然后CTRL+V粘贴就好了,就没了,基础的流......
  • 获取 个位数 十位数 百位数 千位数
    以c语言为例,js需要向下取整个位​​​num%10​​​==​​num/1%10​​​十位​​num/10%10​​百位​​num/100%10​​千位​​num/1000%10​​......
  • java通过属性名称获取属性值或设置属性值
    一、实体类publicclassMessageBean{privateintcode=200;//编码privateStringmessage="";//信息publicintgetCode(){returncode;}pu......
  • abp6.0获取currentuser的值
    在host的启动项目里面,MedicalClusterHttpApiHostModule里面增加```AbpClaimTypes.UserId=JwtClaimTypes.Subject;AbpClaimTypes.UserName=JwtClaimTypes.P......
  • 36V的ESD二极管ESD36VD5B参数介绍
    静电防护二极管、ESD管、ESD保护管、ESD静电保护二极管、ESD二极管、静电保护器件、ESD静电二极管、静电防护器件、ESD防静电保护二极管、ESD保护二极管、ESD静电保护系列二......
  • Spring Boot 参数校验
    JSR-303JSR-303是JavaEE6中的一项子规范,叫做BeanValidation,为JavaBean验证定义了相应的元数据模型和API,通过使用xml可以对原有的元数据信息进行覆盖和扩展,在应用......
  • 对json中的字典提取其中的所有参数(包括list和dict中)整合为一层
    例如:在python中,我有一个字典,类似于{s1:[{s11:0,s12:2},{s13:3,s14:4}],s2:'s2',s3:{s31:0,s32:2}},我想使用递归提取其中所有的字典的key值和value,并在key值中包含它在字典......
  • 微信运动接口(获取自己的微信运动数据)
    @​​toc​​1、微信运动接口wx.getWeRunData()1.1实现步骤  该接口获取用户过去30天微信运动步数。该接口比较复杂,具体操作步骤如下:先调用​​wx.login()​​接口获取c......
  • 获取指定网卡的ip
    #!/usr/bin/envpython#-*-coding:utf-8-*-importsocketimportfcntlimportstructdefget_ip_address(ifname):s=socket.socket(socket.AF_INET,sock......
  • springmvc文件上传(ajax请求 带参数)
    前言这里用ajax文件上传,并携带几个参数,网上查到的大多都是没带参数只有文件的。由于我项目代码太多,这里只给出关键代码。操作我用的SSM框架,传之前,先在WEB-INF/dispatcherSe......