SpringBoot使用MyBatis时的几种传参规范示例

目录
  • 1.单个简单参数传递
  • 2.匿名参数顺序传递
  • 3.使用@Param注解传递
  • 4.使用Map传递参数
  • 5.使用JavaBean(POJO)传递
  • 6.使用List、Array、Set传递

使用Mybatis作为持久层框架时,对于数据库的增删改查等操作都需要参数的传递,这里学习记录一下MyBatis中可用的参数传递方式。

1. 单个简单参数传递

使用 MyBatis 传递单个参数时比较简单,形式如#{a},#{b},#{param1}等都可以在 MyBatis 中获取到唯一参数,但是参数名尽量和入参名一致,这样更符合开发规范。

Mapper 文件定义

UserInfo selectById(String userId);

xml 文件定义

  • 单个参数时,标签中可不定义参数类型
<select id="selectByUserId" resultType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_id=#{userId}
</select>

2. 匿名参数顺序传递

匿名参数传递时使用的是 MyBatis 中索引传递的方式,对于传递的多个参数,在sql语句标签中使用#{param1}#{param2}等索引依次代表传入的参数值。

Mapper 文件

  • 使用匿名参数传递时,接口中定义的方法参数无需使用注解
UserInfo selectByNameAndAge(String userName, Integer age);

xml 文件

  • xml中读取参数时可以使用使用arg0, arg1, param1, param2等形式
  • 参数有多个类型且匿名,因此不需要指定入参类型
  • Mapper中没有使用注解,因此直接使用参数名时会报错参数名找不到
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_name=#{param1} and user_gender=#{param2}
</select>
  • 匿名参数传递方法可读性差,对后期维护不友好,不符合开发规范。

3. 使用@Param注解传递

@Param注解用于指定key,指定了key之后,在sql标签中可以使用key来索引对应的参数值。

Mapper 文件

  • 接口中定义时使用 @Param注解指定参数对应的key
UserInfo selectByNameAndAge(@Param("userName") String userName, @Param("age") Integer age);

xml 文件

  • 不需要指定传入参数类型
  • 使用注解指定的key就可以获取到对应入参值
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_name=#{userName} and user_gender=#{age}
</select>

@Param注解传参使用时清晰简洁明了,符合开发规范,在参数较少时建议使用该方式。

4. 使用Map传递参数

MyBatis框架底层就是将入参转换成Map类型进行传递的,因此我们也可以使用Map进行参数的传递,传入的参数在sql标签中可以根据Map中的key值直接获取。

使用时,需要将传入的参数放入到map中

  map.put("userName","tom");
  map.put("gender",1);

Mapper 文件

UserInfo selectByNameAndAge(Map<String, Object> map);

xml 文件

  • 入参类型指定为Map
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo" paramterType="map">
    select user_id, user_name from user_info where user_name=#{userName} and user_gender=#{age}
</select>

使用Map传递参数符合MyBatis底层的设计,性能也没有问题,但是在开发中由于将所有值封装成为map,无法直观看到map中可能含有的参数,在后期维护上不太友好。

5. 使用JavaBean(POJO)传递

除了Map方式,还可以使用JavaBean的方式来传递多个参数,此时在sql标签中直接使用bean对象的属性来索引参数值,注意bean对象中 需要有相应参数的get方法,否则无法正常获取。

使用javabean作为参数,需要先定义JavaBean

@Data
public class UserInfo {
  private String userName;
  private Integer age;
}

Mapper 文件

UserInfo selectByEntity(UserInfo userInfo);

xml 文件

  • 指定入参类型为相应的JavaBean全路径限定类名
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo" paramterType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_name=#{userName} and user_gender=#{age}
</select>

JavaBean的参数传递方式更符合项目开发的规范,实际使用时简洁明了,在参数较多时建议使用这种方式,创建JavaBean来作为参数传递对象。

6. 使用List、Array、Set传递

List、Array、Set等方式的传参通常用于sql标签中的in操作,即用于MyBatis中的标签。

使用list或array时,一般是做in操作,只有一个参数。

Mapper 文件

UserInfo selectByIdList(List<String> userIdList);

xml 文件

  • 不需要指定入参类型,或指定为List
  • 使用标签处理sql中的in操作
  • 如果参数是list,则collection为list;如果参数类型是array,则collection是array
  • 如果是多个参数或者是对象的属性值作为list,则传参应为map/bean类型,collection应为对象属性中的list
<select id="selectByIdList" resultMap="userResultMap">
    select * from user_info where status=1
    and user_id in
    <foreach collection="list" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

到此这篇关于SpringBoot使用MyBatis时的几种传参规范示例的文章就介绍到这了,更多相关SpringBoot MyBatis 传参内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

  • Mybatis传参为逗号分隔的字符串情形进行in条件查询方式

    目录 传参为逗号分隔的字符串情形进行in条件查询 后端只需要做如下调整 根据逗号分隔的id查询 传参为逗号分隔的字符串情形进行in条件查询 在业务变更需支持多条件查询,在改动最小的情况下,实现方式就是只改mapper.xml,这时,可让前端逗号分隔传参 后端只需要做如下调整 <if test="paramXXX!= null and paramXXX!= ''">   and t.paramXXX in     <foreach item="item&quo

  • Mybatis order by 动态传参出现的问题及解决方法

    问题由来 一个简单的需求,要求把和当前用户相关的数据置顶展示. 这里,我用了一个简单的用户表来复现这个需求. 很简单,查询语句后面加上:order by t.login_name='wulaoer' desc 就行了. 如下所示,吴老二就到顶了. 那Mybatis脚本怎么写呢? 就这么写

  • Mybatis中使用万能的Map传参实现

    在编程中,有可能遇到我们的实体类或者数据库中表的字段或参数过多的情况,那这时候用Map传参是比较理想的选择. Map的特性是键值对应的,只要确定了一个键key,那么值value可以是任何的数据,这样就可以在map内存中存入任何数据. 下面例子演示在mybatis中结合Map实现基本的增删改查 数据库表(fruits)结构: 实体类: package com.pojo.pp1; import java.math.BigDecimal; /** * 简述: *创建实体 * @author:LiYan

  • 详解mybatis #{}和${}的区别、传参、基本语法

    1 #{}和${}的区别.及注入问题 (1) 区别: 首先清楚一点,动态 SQL 是 mybatis 的强大特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析,#{} 和 ${} 在预编译中的处理是不一样的: 例如:select * from t_user where userName = #{name}; #{}预编译:用一个占位符 ? 代替参数:select * from t_user where userName = ? #{}预编

  • mybatis group by substr函数传参报错的解决

    目录 mybatis group by substr传参报错 报异常 原因 使用group by 分组查询返回为null 解决方法 mybatis group by substr传参报错 报异常 ### Cause: java.sql.SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式 SELECT     SUBSTR( region_code, 1,#{ queryMap.groupCodeLength, jdbcType = INTEGE

  • Mybatis的几种传参方式详解

    前言 前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Mybatis中有几种传参方式吗? 没想到其他问题回答的很好,唯独这个问题一知半解,勉强回答了其中两种方式. 于是这篇文章就来说一说Mybatis传参的几种常见方式,给正在面试或者准备面试的朋友巩固一下. 单个参数 单个参数的传参比较简单,可以是任意形式的,比如#{a}.#{b}或者#{param1},但是为了开发规范,尽量使用和入参时一样. Mapper如下: UserInfo selectByUserId(String userI

  • 浅谈Mybatis传参类型如何确定

    目录 I. 环境配置 1. 项目配置 2. 数据库表 II. 传参类型确定 1. 参数类型为整形 2. 指定jdbcType 3. 传参类型为String 4. TypeHandler实现参数替换强制添加引号 5. 小结 最近有小伙伴在讨论#{}与${}的区别时,有提到#{}是用字符串进行替换,就我个人的理解,它的主要作用是占位,最终替换的结果并不一定是字符串方式,比如我们传参类型是整形时,最终拼接的sql,传参讲道理也应该是整形,而不是字符串的方式 接下来我们来看一下,mapper接口中不同的

  • SpringBoot使用MyBatis时的几种传参规范示例

    目录 1.单个简单参数传递 2.匿名参数顺序传递 3.使用@Param注解传递 4.使用Map传递参数 5.使用JavaBean(POJO)传递 6.使用List.Array.Set传递 使用Mybatis作为持久层框架时,对于数据库的增删改查等操作都需要参数的传递,这里学习记录一下MyBatis中可用的参数传递方式. 1. 单个简单参数传递 使用 MyBatis 传递单个参数时比较简单,形式如#{a},#{b},#{param1}等都可以在 MyBatis 中获取到唯一参数,但是参数名尽量和入

  • SpringBoot整合Mybatis LocalDateTime 映射失效的解决

    目录 SpringBoot整合Mybatis LocalDateTime映射失效 一.概述 二.具体原因 三.解决办法 四.小结一下 使用LocalDateTime报错问题 解决方法 SpringBoot整合Mybatis LocalDateTime映射失效 一.概述 最近在开发一个项目,在使用SpringBoot继承Mybatis时,做单元测试时,由于需要根据参数(类型LocaDateTime)去更新数据,发现更新记录为0. 刚开始以为是没有提交事务(Mybatis默认没有开启自动提交),后来

  • SpringBoot整合mybatis简单案例过程解析

    这篇文章主要介绍了SpringBoot整合mybatis简单案例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在springboot项目中的pom.xml中添加mybatis的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifac

  • springboot+thymeleaf+mybatis实现甘特图的详细过程

    首先我们要明白:这个甘特图需要哪些动态数据. (1)需要:ID,tName,number,计划开始时间,开始时间,计划结束时间,结束时间,项目负责人,参与人,知情人ID,计划时长(可以计算得出的,不必在数据库中):前置任务:项目进度,该任务属于哪个任务 (2)然后利用easycode插件生成实体类,映射类,服务类,ontCroller等 (3)利用bootstrap框架做出甘特图的样式,写好JS. <!DOCTYPE html> <html xmlns:th="http://w

  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

  • springboot整合mybatis中的问题及出现的一些问题小结

    1.springboot整合mybatis mapper注入时显示could not autowire,如果强行写(value  = false ),可能会报NullPointException异常 解决方案: dao层加注解@Component(value = "首字母小写的接口名如UserMapper->userMapper") dao层还可以加注解@Mapper 2.The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecogni

  • springboot基于Mybatis mysql实现读写分离

    近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离.这里用博客记录下过程,一方面可备日后查看,同时也能分享给大家(网上的资料真的大都是抄来抄去,,还不带格式的,看的真心难受). 完整代码:https://github.com/FleyX/demo-project/tree/master/dxfl 1.背景 一个项目中数据库最基础同时也是最主流的是单机数据库,读写都在一个库中.当用户逐渐增多,单机数据库无法满足性能要求时,就会进行读写分离改造(适用于读多写少),写操作一个库,读操作多个库

  • SpringBoot整合Mybatis实现CRUD

    准备工具:IDEA jdk1.8 Navicat for MySQL Postman 一.新建Project 选择依赖:mybatis Web Mysql JDBC 项目结构 pom依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o

  • SpringBoot整合Mybatis使用Druid数据库连接池

    本文实例为大家分享了SpringBoot整合Mybatis使用Druid数据库连接池的方法,具体内容如下 在SpringBoot项目中,增加如下依赖 <!-- spring mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version

随机推荐