Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis传参的方式总结

Mybatis传参的方式总结

作者头像
猫头虎
发布于 2024-04-07 07:28:59
发布于 2024-04-07 07:28:59
1K00
代码可运行
举报
运行总次数:0
代码可运行

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

摘要:

本文总结了MyBatis中传参的多种方式,包括基本类型参数、对象参数、Map参数、注解参数等。通过了解这些传参方式,读者可以更好地在MyBatis中进行参数的传递与处理。

引言:

MyBatis是一款流行的Java持久化框架,用于数据库操作。在使用MyBatis进行数据库查询或更新操作时,需要向SQL语句传递参数。MyBatis提供了多种传参方式,以满足不同场景下的需求。本文将介绍这些传参方式及其使用方法。

配置方法:

MyBatis中传参的方式有多种,包括:

  1. 基本类型参数:直接在SQL语句中使用#{参数名}来引用基本类型参数。
  2. 对象参数:将Java对象作为参数传递,使用#{属性名}引用对象的属性。
  3. Map参数:将参数封装为Map,使用#{key}引用Map中的值。
  4. 注解参数:使用@Param注解为参数命名,使用#{value}引用参数值。
  5. 动态SQL参数:根据不同的条件,动态生成SQL语句。
  6. 枚举参数:将Java枚举类型作为参数传递。

配置步骤:

  1. 基本类型参数:在SQL语句中使用#{参数名}引用基本类型参数。
  2. 对象参数:将Java对象作为参数传递,使用#{属性名}引用对象的属性。
  3. Map参数:将参数封装为Map,使用#{key}引用Map中的值。
  4. 注解参数:在方法参数上使用@Param注解,并使用#{value}引用参数值。
  5. 动态SQL参数:根据需要使用<if><choose>等标签构建动态SQL语句。
  6. 枚举参数:将Java枚举类型作为参数传递,使用#{参数名}引用枚举值。

首先大家都清楚,Mybatis里面传参方式分别有使用 #{} 和 ${}。

对于使用

符存在安全问题的,该篇不做分析和介绍(其实就是如果传参的话,使用

需要手动拼接‘ ’ ,这就存在注入的风险)

接下来,进入正题,通过简单举例介绍,

#{}

第一种情形,传入单个参数 userId

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo(Integer userId) {
    User user = userMapper.getUserInfo(userId);
    //省略 业务代码...
    return user;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(Integer userId);
mapper.xml:
<!--查询-->
<select id="getUserInfo" resultType="com.demo.elegant.pojo.User">
    select userId 
    from users
    where userId=#{userId};
</select>

第二种情况,传入多个参数 userId,sex 使用索引对应值

按照顺序传参 注意mapper层和xml层! service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo(Integer userId,String sex) {
    User user = userMapper.getUserInfo(userId,sex);
    //省略 业务代码...
    return user;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(Integer userId,String sex);
mapper.xml:
<!--查询-->
<select id="getUserInfo" resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where userId=#{0} and sex=#{1};
</select>

第三种情形,传入多个参数 userId,sex 使用注解@Param

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo(Integer userId,String sex) {
    User user = userMapper.getUserInfo(userId,sex);
    //省略 业务代码...
    return user;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(@Param("userId")Integer userId,@Param("sex")String sex);
mapper.xml:
<!--查询-->
<select id="getUserInfo" resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where userId=#{userId} and sex=#{sex};
</select>

第四种情形,传入多个参数 使用User实体类传入

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo(User user) {
    User userInfo = userMapper.getUserInfo(user);
    //省略 业务代码...
    return userInfo;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(User user);
mapper.xml:
<!--查询-->
<select id="getUserInfo"  parameterType="User"  resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where userId=#{userId} and sex=#{sex};
</select>

第五种情形,传入多个参数, 使用Map类传入

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo(Map map) {
    User user = userMapper.getUserInfo(map);
    //省略 业务代码...
    return user;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(Map map);
mapper.xml层:
<!--查询-->
<select id="getUserInfo"  parameterType="Map"  resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where userId=#{userId} and sex=#{sex};
</select>

第六种情形,传入多个参,使用 map封装实体类传入

这种情况其实使用场景比较少,因为上面的各种姿势其实已经够用了 service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo1(Integer userId,String sex) {
    User userInfo = new User(userId,sex);
    Map<String,Object> map=new HashMap<String,Object>();
    map.put("user",userInfo);
    User userResult=  userMapper.getUserInfo(map);
    //省略 业务代码...
    return userResult;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(Map map);

mapper.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--查询-->
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="getUserInfo"  parameterType="Map"  resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where userId=#{userInfo.userId} and sex=#{userInfo.sex};
</select>

第七种情形,即需要传入实体类,又需要传入多个单独参,使用注解@Param

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUserInfo(User user,Integer age) {
    User userResult = userMapper.getUserInfo(user,age);
    //省略 业务代码...
    return userResult;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(@Param("userInfo") User user,@Param("age") Integer age);
mapper.xml:
<!--查询-->
<select id="getUserInfo"   resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where userId=#{userInfo.userId} and sex=#{userInfo.sex} and age=#{age};
</select>

List传参

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer>list= new ArrayList>();
 list. add(44);
 list. add(45);
 list. add(46);
List<SysUser> sysUser= sysUserMapper. selectList(list);

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 List<SysUser> selectList(List<Integer> ids);
mapper.xml:
 <select id="selectList"resultMap"BaseResultMap">
 select
 <include refid="Base_Column_List"/>
 from sys_user
 where id in
 <foreach item="item" index="index" collection="list"open="("separator","close=")"> #{item}
 </foreach>
 </select>

数组传参

service层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<SysUser> sysuser= sysUserMapper. selectlist(new Integer[]{44,45,46});

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<SysUser> selectList(Integer[]ids);

mapper.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<select id="selectList"resultMap"BaseResultMap">
 select
 <include refid="Base Column_List"/>
 from sys user
 where id in
 <foreach item="item" index="index collection="array"open="("separator="," close=")"> #{item}
 </foreach>
 </select>

${}

使用这个的时候,只需要注意,如果是传递字段名或者表名,是直接做参数传入即可, 但是如果作为sql’语句里面使用的值, 记得需要手动拼接 ’ ’ 号。

例如, 传入单个参数 sex: service层: @Override

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public User getUserInfo(String sex) {
    sex="'"+sex+"'";
    User user = userMapper.getUserInfo(sex);
    //省略 业务代码...
    return user;
}

mapper层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User getUserInfo(String sex);

mapper.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--查询-->
<select id="getUserInfo"   resultType="com.demo.elegant.pojo.User">
    select userId
    from users
    where sex=${sex};
</select>

多个参数,那也就是使用注解@Param取名字解决即可。

注意事项:

  • 参数名要与SQL语句中的占位符保持一致。
  • 若参数为对象,则属性名要与对象属性名保持一致。
  • 使用@Param注解时,保证参数名与注解值一致。

总结:

MyBatis支持多种传参方式,开发者可以根据不同的情况选择合适的方式。了解这些传参方式,能够更加灵活地操作SQL语句,提高代码的可读性和维护性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis的几种传参方式,你了解多少?
目录 前言 单个参数 多个参数 使用索引【不推荐】 使用@Param 使用Map POJO【推荐】 List传参 数组传参 总结 前言 前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Mybatis中有几种传参方式吗? 没想到其他问题回答的很好,唯独这个问题一知半解,勉强回答了其中两种方式。 于是这篇文章就来说一说Mybatis传参的几种常见方式,给正在面试或者准备面试的朋友巩固一下。 单个参数 单个参数的传参比较简单,可以是任意形式的,比如#{a}、#{b}或者#{param1},但是为了开发规范
猿天地
2020/10/26
2.6K0
lagou 爪哇 1-1 mybatis 笔记
Mybatis框架是一个半自动的ORM持久层框架,也可以在Java中实现类似 insert(User)的操作最终操作数据库,但是需要我们自己写Sql语句。Mybatis是目前比较流行的Dao层框架。
acc8226
2022/05/17
8170
Mybatis分页查询——四种传参方式
         分页查询时,Sql语句使用limit关键字,需要传入开始索引和每页条数两个参数。MyBatis的多参数处理有以下方式:
会洗碗的CV工程师
2023/03/30
1.2K0
Mybatis分页查询——四种传参方式
MyBatis——增删查改(XML 方式)
使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中
2的n次方
2024/11/19
2920
MyBatis——增删查改(XML 方式)
_Mybatis分页查询——四种传参方式
分页查询时,Sql语句使用limit关键字,需要传入开始索引和每页条数两个参数。MyBatis的多参数处理有以下方式:
会洗碗的CV工程师
2023/11/21
6490
_Mybatis分页查询——四种传参方式
Mybatis学习笔记之一(环境搭建和入门案例介绍)
  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Kevin_Zhang
2019/02/20
1.2K0
Mybatis学习笔记之一(环境搭建和入门案例介绍)
MyBatis框架之第一篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
1.2K0
Mybatis系列第5篇:Mapper接口多种方式传参详解、原理、源码解析
Mybatis系列目标:从入门开始开始掌握一个高级开发所需要的Mybatis技能。
路人甲Java
2019/12/10
4.1K0
myBatis笔记
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
HUC思梦
2020/09/03
1.5K0
myBatis笔记
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
在使用JDBC 的时候,我们通常将数据直接返回,但现在也会将数据封装到实体类对象中,由对象携带数据。这样操作的时候,可以通过操作对象的方式操作数据。但是手写这类代码通常是繁琐的、重复的,如果有自动完成这些功能的程序就好了。
张哥编程
2024/12/13
2370
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
mybatis高级foreach用法
最近有时需要用到mybatis的in查询,总忘记这个foreach怎么查。顺便记录下笔记。
无敌小菜鸟
2022/05/17
4K0
mybatis高级foreach用法
SpringBoot整合Mybatis超详细流程
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
全栈程序员站长
2022/11/17
1.2K0
SpringBoot整合Mybatis超详细流程
Mybatis 框架学习(二)—— 简单CRUD的实现
通过这个CRUD的操作,我们能很明确的感觉到mybatis操作数据库比 JDBC操作数据库的简洁明了
RAIN7
2022/06/12
4120
Mybatis入门到精通
简介 Mybatis将Java方法与SQL语句关联,简化了JDBC的使用,SQL语句在一行代码中执行 提供了映射引擎,将SQL执行结果与对象树映射起来 通过内建的类XML表达式语言,可以动态生成SQL语句 支持声明式数据缓存,提供了默认的基于HashMap实现的缓存,以及Ehcache、Memcached的默认连接器 简单使用 数据库 mybatis-config.xml里面配置settings、typeAliases、environments、mappers 实体类与mapper.xml 通过confi
IT架构圈
2018/06/01
9300
Mybatis的传参方式
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
QGS
2023/11/02
3980
MyBatis学习笔记(一) --- MyBatis入门
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 
挽风
2021/04/13
1.4K0
MyBatis学习笔记(一) --- MyBatis入门
MyBatis 的分页方式,你都会吗
分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率!也减轻了前端渲染的压力!
Java技术精选
2021/09/15
1.5K0
MyBatis学习笔记
MyBatis 1.MyBatis是一个优秀的持久层框架,对jdbc的操作数据库的过程进行了封装,使开发者只需要关注SQL本身。   而不用花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集等jdbc繁杂的过程。 2.MyBatis配置: SQLMapConfig.xml  全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml sql映射文件,配置了操作数据库的sql语句。需要在SqlMapConfig.xml里边加载。
曼路
2018/10/18
5030
MyBatis学习笔记
mybatis动态SQL常用语法总结
在 mybatis 的 xml 文件里写的 sql 语句实际用的是一门叫做 OGNL 的表达式语言,OGNL 全称 Object Graph Navigation Language 对象图导航语言,是常应用于 Java 中的一个开源的表达式语言(Expression Language),它被集成在 Spring、Mybatis、Struts2 等 Java 框架中,通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现类型转化等功能。
人人都是码农
2024/07/10
2720
Mybatis
解决方案: 持久层(DAO)的零实现。所谓的零实现,就是不用写实现类代码,直接使用接口就可以操作数据库。
Carlos Ouyang
2019/08/19
7730
Mybatis
相关推荐
Mybatis的几种传参方式,你了解多少?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档