Mybatis 作为一个轻量级的数据持久化框架,目前(2018)的应用非常广泛,基本可以取代Hibernate。关于 @param 这个注解的使用,作者这里整理了一些笔记。

关于Mybatis @Param 注解,官方文档: http://www.mybatis.org/mybatis-3/zh/java-api.html
其中关于 @param部分的说明是:

@Param Parameter N/A 如果你的映射器的方法需要多个参数, 这个注解可以被应用于映射器的方法 参数来给每个参数一个名字。否则,多 参数将会以它们的顺序位置来被命名 (不包括任何 RowBounds 参数) 比如。 #{param1} , #{param2} 等 , 这 是 默 认 的 。 使 用 @Param(“person”),参数应该被命名为 #{person}。

也就是说如果有多个参数的时候,可以使用@Param 这个注解,但是不是一定需要用到 @Param 这个注解呢?作者在这里列出以下几种情景

1.传递单个参数,不使用 @Param 注解

代码如下:
DAO 层 CommodityDao.java

package com.ljq.cs.dao;
/*** @description: 商品信息 DAO 接口* @author: lujunqiang* @email: flying9001@gmail.com* @date: 2017/12/17*/
@Repository
public interface CommodityDao {//   查询某一件商品Commodity queryOne(Commodity commodity);// 省略其他方法 }

Mapper 文件: commoditymapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ljq.cs.dao.CommodityDao" ><select id="queryOne" resultType="Commodity">select *from t_commodity com where id = #{id}</select>
</mapper>

这里只有一个参数,java 接口不使用 @Param 注解,同时 mapper 文件也不需要使用 parameterType 这个参数,Mybatis会 根据实体类(entity)的类型自动识别并匹配javaBean(这一部分在 spring配置文件关于数据源那一部分)

2.传递单个参数,使用@Param注解

代码如下:
DAO 层 CommodityDao.java

package com.ljq.cs.dao;/*** @description: 商品信息 DAO 接口* @author: lujunqiang* @email: flying9001@gmail.com* @date: 2017/12/17*/
@Repository
public interface CommodityDao {//   查询某一件商品Commodity queryOne(@Param("commodity")Commodity commodity);// 省略其他方法 }

Mapper 文件: commoditymapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ljq.cs.dao.CommodityDao" ><select id="queryOne" parameterType="com.ljq.cs.entity.Commodity" resultType="Commodity">select *from t_commodity com where id = #{commodity.id}</select>
</mapper>

当使用javaBean作为对象的时候,在写 SQL 语句的时候,必须指定参数类型 parameterType="com.ljq.cs.entity.Commodity",同时在 #{ } 取值的时候不能直接填入 javaBean 的属性,必须这样使用 commodity.id ;否则,会抛出参数类型不匹配异常
如果不是 javaBean,则需要在写 SQL 语句的时候, #{ } 中的属性必须与 @Param中定义的一致,eg: @Param("username") , #{username} ,这样才可以

3.传递多个参数,使用 @Param 注解

为了精简代码,作者这里只写关键部分
DAO 层, UserInfoDao.java

//   用户登录UserInfo signin(@Param("account")String account,@Param("passcode")String passcode);

mapper文件userInfomapper.xml

 <!-- 用户登录 --><select id="signin" resultType="UserInfo">select *from t_userinfo infowhere account=#{account} and passcode=#{passcode}</select>

这里 @Param 中定义的变量名必须和 mapper 中保持一致才可以

4.传递多个参数,不使用 @Param 注解

其实从第一种场景中已经可以实现传递多个参数了,即把多个参数封装到一个 javaBean 中就可以实现了,但是如果是两个或者多个 javaBean 的时候,可以通过使用@Param注解的方式来实现,但是需要把每个 javaBean 中的属性全部拆分出来,这样就增加了巨大的代码量,因此不推荐这么做
那么有没有可以不使用@Param注解,同样也可以传递多个参数(尤其是多个 javaBean)呢?答案是有的,废话不多说,直接上代码

同上,这里只贴出关键部分
DAO 层, UserInfoDao.java

    //   搜索用户,对结果进行分页List searchUser(Map<String,Object>);

使用DAO,UserService.java

UserInfo userInfo = new UserInfo();
Pagination page = new Pagination();
Map<String,Object> map = new HashMap<>;
map.put("userInfo",userInfo);
pam.put("page",page);
userService.searchUser(map);

mapper文件userInfomapper.xml

 <select id="searchUser" parameterType="java.util.Map" resultType="UserInfo">select *from t_userinfo user where 1 =1<if test="user.uname != null and ''!= user.uname ">and user.uname like '%${userInfo.uname}$%'</if><if test="page.order != null and page.order == 10" >order by user.id asc</if>limit ${page.pagenum * page.limitnum}, #{page.limitnum}</select>

作者通过上边的4种情况,主要是为了说明,Mybatis无论是传单个参数,还是传递多个参数,没有必要使用@Param注解啊
使用@param 注解增添了不少代码不说,还容易导致错误,尤其是在 mapper 文件中(paraterType 属性)

以上只是作者的列举的部分代码,源码请看这里: https://github.com/Flying9001/campustore

最后,推荐一下作者的公众号,主要分享一些作者平时的一些见解与感悟,有兴趣的可以关注

关于Mybatis的@Param注解相关推荐

  1. Mybatis的@Param注解作用

    单个参数 若无@Param注解,Blog getBlog(Long id);,mybatis中传入的变量名id 可以随便写 如#{0},#{id}, #{aaa} - 如果带有注解 Blog getB ...

  2. 关于mybatis的@Param注解和参数

    1,使用@Param注解 当以下面的方式进行写SQL语句时: @Select("select column from table where userid = #{userid} " ...

  3. Mybatis中的@Param注解

    前言 今天在使用Mybatis时遇到一个问题,主要出错原因在于Mybatis的@Param注解,如果我不在参数前面加上@Param注解,数据库操作就会报错,如下: @Param作用 @Param注解的 ...

  4. mybatis java类注解式_mybatis注解详解

    http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://ww ...

  5. @param注解_启用 parameters 编译选项简化 mybatis @Param 注解重复问题

    在使用 mybatis 查询的时候, 只需要定义一个查询接口, mybatis 会为我们注入注解实现或是 xml 实现. 但当我们需要传递参数时, 通常需要 @Param 来定义一个名称, 但经常的, ...

  6. mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法

    转载自  mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法 useActualParamName配置 useActualParamName 允许使用方法签名中的名称作为 ...

  7. Mybatis多条件直接查询Param注解版

    1.UserMapper接口 package com.william.dao;import com.william.domain.QueryValueObject; import com.willia ...

  8. mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数

    mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...

  9. mybatis 不生效 参数_MyBatis参数使用@Param注解获取不到自增id问题

    一.背景 群里有个哥们分享了一个mybatis的小"坑". "分享一个菜鸡点:mybatis中使用@param注解后,要keyProperty="注解名.id& ...

最新文章

  1. android dslr控制软件,DSLR Controller
  2. android 蓝牙设置平板电脑,java – BlueCove,笔记本电脑和带蓝牙的Android平板电脑
  3. android web通讯录,Android手机开发之通讯录
  4. 谁能制约云厂商滥用开源,谁来帮助开源软件作者?
  5. ESX/ESXi 主机上的每个插槽中安装了多少内存
  6. python groupby_用python自动生成全校学生成绩报告
  7. mysql 储存过程放到哪_MySQL储存过程
  8. Illustrator 教程,如何在 Illustrator 中创建及应用图案?
  9. Android eclipse加载项目出现红色感叹号
  10. 【WePY小程序框架实战四】-使用asyncawait异步请求数据
  11. oracle获取当前年上一年时间,Oracle获取一年中的所有日期和一个月中的所有日期...
  12. linux tc 对本机网卡限速
  13. GNS3环境搭建与测验实战图文详解
  14. Windows server 2008 R2 SP1 安装KB4512486补丁失败的解决方法
  15. vc2005 应用程序正常初始化(0XC0150002)失败
  16. 使用data breakpoint 追踪地址寄存器被修改的问题
  17. 64位 regsrv win10_有没有 极品飞车9 win10 64位的中文补丁
  18. SSD ECC中的LDPC编解码原理
  19. 网站盈利的10种方式
  20. 学习企业管理最有效的方法就是看这管理类书籍!

热门文章

  1. 在Keil C51下生成LIB库文件以及如何使用LIB库文件
  2. 显著性水平、置信区间、假设检验与方差分析知识点总结
  3. 终极方法, 解决Duplicate class 开头的报错内容全过程详解 - Duplicate class com.github.promeg.tinypinyin
  4. Java-Scanner用法
  5. 仙侠情缘传java下载_仙侠情缘传手游官方下载-仙侠情缘传手游下载v1.0 安卓版-西西安卓游戏...
  6. 高斯消元法java_高斯消元法解线性方程(java实现)
  7. Flex css 运用
  8. 微信小程序API全局域名配置设置
  9. idea每次修改java都要重启_IDEA修改java代码、Thymeleaf的html模板需要重启
  10. pinyin4j项目实战演练