Show Me More!!!✨|

Journey&Flower

园龄:7年3个月粉丝:40关注:121

MyBatis参数映射之@Param注解的用法解析

1、MyBatis的参数映射配置

MyBatis的参数映射利用的属性是:parameterType。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数。

2、简单类型,不需要设置 parameterType

对于大多数简单的使用场景,你都不需要使用复杂的参数,比如:

<select id="selectUsers" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>

上面的这个示例说明了一个非常简单的命名参数映射。鉴于参数类型(parameterType)会被自动设置为 int,这个参数可以随意命名。

3、复杂类型,需要设置 parameterType

原始类型或简单数据类型(比如 Integer 和 String)因为没有其它属性,会用它们的值来作为参数,不需要设置 parameterType。 然而,如果传入一个复杂的对象,行为就会有点不一样了。比如:

<insert id="insertUser" parameterType="User">
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

此时需要 User 类型的参数对象传递到了语句中,会查找 id、username 和 password 属性,然后将它们的值传入预处理语句的参数中。

另外,还可以使用 map 传递,这是最原始的用法。定义接口使用map传递多个参数进行查询,如下所示:

public List<Product> getByMap(Map<String, Object> paramMap);

sql语句

<!--通过map传递参数 -->
<select id="selectUsers" resultType="User" parameterType="map">
  select id, username, password
  from users
  where id = #{id} and age = #{age}
</select>

需要注意的有:
1、parameterType参数类型为map(此处使用别名)
2、参数名称是map中的key

4.1、复杂类型,不需要设置 parameterType ,使用@Param注解

创建接口,使用注解传递多个参数进行查询

public List<Users> getUsers(@Param("name") String name, @Param("age") int age);
<select id="selectUsers" resultType="User">
  select id, username, password
  from users
  where id = #{id} and age = #{age}
</select>

这种方式不需要设置参数类型 ,参数名称为注解定义的名称。这种方式能够大大提高可读性,但是只适合参数较少的情况,一般是少于5个用此方法

4.2、复杂类型,不需要设置 parameterType ,使用@Param注解

代码如下:
DAO 层 UserDao.java

package com.User.dao;
/**
 * @description: 用户 DAO 接口
 */
@Mapper
public interface UserDao {
    //批量新增用户
    int batchInsert(@Param("records") List<UserVo> records);  
}

DAO 层 UserMapper.xml

<insert id="batchInsert">
    insert all
     <foreach item="record" index="index" collection="records">
            into t_user
          <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="record.id != null">
                    id,
                </if>
                <if test="record.username != null">
                    username,
                </if>
                <if test="record.password != null">
                    password,
                </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="record.id != null">
                    #{record.id},
                </if>
                <if test="record.username != null">
                    #{record.username},
                </if>
                <if test="record.password != null">
                    #{record.password},
                </if>
         </trim>
    </foreach>
    SELECT 1 FROM DUAL
</insert>

4.2、复杂类型,需要设置 parameterType ,不使用@Param注解

代码如下:
DAO 层 UserDao.java

package com.User.dao;
/**
 * @description: 用户 DAO 接口
 */
@Mapper
public interface UserDao {
    //批量新增用户  注意参数 records 到xml内不能写作 records
    int batchInsert(List<UserVo> records);  
}

DAO 层 UserMapper.xml

<insert id="batchInsert" parameterType="java.util.List">
    insert all
     <!--此处的collection="list"不能改写为collection="records"-->
     <foreach item="record" index="index" collection="list">
            into t_user
          <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="record.id != null">
                    id,
                </if>
                <if test="record.username != null">
                    username,
                </if>
                <if test="record.password != null">
                    password,
                </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="record.id != null">
                    #{record.id},
                </if>
                <if test="record.username != null">
                    #{record.username},
                </if>
                <if test="record.password != null">
                    #{record.password},
                </if>
         </trim>
    </foreach>
    SELECT 1 FROM DUAL
</insert>

注意UserDao.javabatchInsert参数是 records

注意UserMapper.xmlbatchInsert中的遍历必须写作 collection="list" 不能写作为 collection="records"

5、小结

在不使用@Param注解的时候,函数的参数只能为一个,并且在查询语句取值时只能用#{}。如果想传递多个参数,parameterType参数类型为map(此处为别名)或者为JavaBean。

而使用@Param注解则可以使用多个参数,无需再设置parameterType,并且在查询语句中使用时可以使用#{}或者${}

原文链接:MyBatis中文官网

本文作者:Journey&Flower

本文链接:https://www.cnblogs.com/JourneyOfFlower/p/15160010.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Journey&Flower  阅读(1089)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 Not Found REOL
  2. 2 白色恋人 游鸿明
  3. 3 盛夏的果实 莫文蔚
  4. 4 以父之名 周杰伦
  5. 5 晴天 周杰伦
  6. 6 简单爱 周杰伦
  7. 7 东风破 周杰伦
  8. 8 稻香 周杰伦
  9. 9 爱在西元前 周杰伦
  10. 10 千里之外 费玉清-周杰伦
  11. 11 偏爱 张芸京
  12. 12 大海 张雨生
  13. 13 月亮惹的祸 张宇
  14. 14 雨一直下 张宇
  15. 15 过火 张信哲
  16. 16 隐形的翅膀 张韶涵
  17. 17 天下 张杰
  18. 18 当你孤单你会想起谁 张栋梁
  19. 19 清明雨上 许嵩
  20. 20 玫瑰花的葬礼 许嵩
  21. 21 断桥残雪 许嵩
  22. 22 城府 许嵩
  23. 23 等一分钟 徐誉滕
  24. 24 客官不可以 徐良_小凌
  25. 25 坏女孩 徐良_小凌
  26. 26 犯贱 徐良
  27. 27 菠萝菠萝蜜 谢娜
  28. 28 贝多芬的悲伤 萧风
  29. 29 睫毛弯弯 王心凌
  30. 30 我不是黄蓉 王蓉
  31. 31 秋天不回来 王强
  32. 32 今天你要嫁给我 陶喆,蔡依林
  33. 33 丁香花 唐磊
  34. 34 绿光 孙燕姿
  35. 35 求佛 誓言
  36. 36 十一年 邱永传
  37. 37 下辈子如果我还记得你 马郁
  38. 38 一千年以后 林俊杰
  39. 39 江南 林俊杰
  40. 40 曹操 林俊杰
  41. 41 背对背拥抱 林俊杰
  42. 42 会呼吸的痛 梁静茹
  43. 43 勇气 梁静茹
  44. 44 爱你不是两三天 梁静茹
  45. 45 红日 李克勤
  46. 46 星月神话 金莎
  47. 47 嘻唰唰 花儿乐队
  48. 48 穷开心 花儿乐队
  49. 49 六月的雨-《仙剑奇侠传》电视剧插曲 胡歌
  50. 50 一个人的寂寞两个人的错 贺一航
  51. 51 好想好想-《情深深雨濛濛》电视剧片尾曲 古巨基
  52. 52 情人 刀郎
  53. 53 冲动的惩罚 刀郎
  54. 54 西海情歌 刀郎
  55. 55 2002年的第一场雪 刀郎
  56. 56 红玫瑰 陈奕迅
  57. 57 浮夸 陈奕迅
  58. 58 爱情转移 陈奕迅
  59. 59 独家记忆 陈小春
  60. 60 记事本 陈慧琳
  61. 61 看我72变 蔡依林
  62. 62 寂寞在唱歌 阿桑
  63. 63 樱花草 Sweety
  64. 64 中国话 S.H.E
  65. 65 波斯猫 S.H.E
  66. 66 杀破狼-《仙剑奇侠传》电视剧片头曲 JS
  67. 67 Lydia F.I.R.
  68. 68 I Miss You 罗百吉_青春美少女.
盛夏的果实 - 莫文蔚
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 李焯雄

作曲 : Meyna Co

编曲 : 张佳添

也许放弃 才能靠近你 不再见你

你才会把我记起 时间累积

这盛夏的果实 回忆里寂寞的香气

我要试着离开你 不要再想你

虽然这并不是我本意

你曾说过 会永远爱我

也许承诺 不过因为没把握 别用沉默

再去掩饰什么 当结果是那么赤裸裸

以为你会说什么 才会离开我

你只是转过头 不看我

不要刻意说 你还爱我

当看尽潮起潮落 只要你记得我

你曾说过 会永远爱我 也许承诺

不过证明没把握 不用难过

不用掩饰什么 当结果是那么赤裸裸

其实不必说什么

才能离开我 起码那些经过 属于我

也许放弃 才能靠近你 不再见你

你才会把我记起 时间累积

这盛夏的果实 回忆里爱情的香气

我以为不露痕迹 思念却满溢

或许这代表了我的心

不要刻意说 你还爱我

当看尽潮起潮落 只要你记得我

如果你会梦见我 请你再抱紧我