关于Mybatis的@Param注解
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注解相关推荐
- Mybatis的@Param注解作用
单个参数 若无@Param注解,Blog getBlog(Long id);,mybatis中传入的变量名id 可以随便写 如#{0},#{id}, #{aaa} - 如果带有注解 Blog getB ...
- 关于mybatis的@Param注解和参数
1,使用@Param注解 当以下面的方式进行写SQL语句时: @Select("select column from table where userid = #{userid} " ...
- Mybatis中的@Param注解
前言 今天在使用Mybatis时遇到一个问题,主要出错原因在于Mybatis的@Param注解,如果我不在参数前面加上@Param注解,数据库操作就会报错,如下: @Param作用 @Param注解的 ...
- mybatis java类注解式_mybatis注解详解
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://ww ...
- @param注解_启用 parameters 编译选项简化 mybatis @Param 注解重复问题
在使用 mybatis 查询的时候, 只需要定义一个查询接口, mybatis 会为我们注入注解实现或是 xml 实现. 但当我们需要传递参数时, 通常需要 @Param 来定义一个名称, 但经常的, ...
- mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法
转载自 mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法 useActualParamName配置 useActualParamName 允许使用方法签名中的名称作为 ...
- Mybatis多条件直接查询Param注解版
1.UserMapper接口 package com.william.dao;import com.william.domain.QueryValueObject; import com.willia ...
- mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...
- mybatis 不生效 参数_MyBatis参数使用@Param注解获取不到自增id问题
一.背景 群里有个哥们分享了一个mybatis的小"坑". "分享一个菜鸡点:mybatis中使用@param注解后,要keyProperty="注解名.id& ...
最新文章
- android dslr控制软件,DSLR Controller
- android 蓝牙设置平板电脑,java – BlueCove,笔记本电脑和带蓝牙的Android平板电脑
- android web通讯录,Android手机开发之通讯录
- 谁能制约云厂商滥用开源,谁来帮助开源软件作者?
- ESX/ESXi 主机上的每个插槽中安装了多少内存
- python groupby_用python自动生成全校学生成绩报告
- mysql 储存过程放到哪_MySQL储存过程
- Illustrator 教程,如何在 Illustrator 中创建及应用图案?
- Android eclipse加载项目出现红色感叹号
- 【WePY小程序框架实战四】-使用asyncawait异步请求数据
- oracle获取当前年上一年时间,Oracle获取一年中的所有日期和一个月中的所有日期...
- linux tc 对本机网卡限速
- GNS3环境搭建与测验实战图文详解
- Windows server 2008 R2 SP1 安装KB4512486补丁失败的解决方法
- vc2005 应用程序正常初始化(0XC0150002)失败
- 使用data breakpoint 追踪地址寄存器被修改的问题
- 64位 regsrv win10_有没有 极品飞车9 win10 64位的中文补丁
- SSD ECC中的LDPC编解码原理
- 网站盈利的10种方式
- 学习企业管理最有效的方法就是看这管理类书籍!
热门文章
- 在Keil C51下生成LIB库文件以及如何使用LIB库文件
- 显著性水平、置信区间、假设检验与方差分析知识点总结
- 终极方法, 解决Duplicate class 开头的报错内容全过程详解 - Duplicate class com.github.promeg.tinypinyin
- Java-Scanner用法
- 仙侠情缘传java下载_仙侠情缘传手游官方下载-仙侠情缘传手游下载v1.0 安卓版-西西安卓游戏...
- 高斯消元法java_高斯消元法解线性方程(java实现)
- Flex css 运用
- 微信小程序API全局域名配置设置
- idea每次修改java都要重启_IDEA修改java代码、Thymeleaf的html模板需要重启
- pinyin4j项目实战演练