关于Mybatis的@Param注解 及 mybatis Mapper中各类传递参数的方法

 

原文:https://blog.csdn.net/mrqiang9001/article/details/79520436html

关于Mybatis的@Param注解

Mybatis 做为一个轻量级的数据持久化框架,目前(2018)的应用很是普遍,基本能够取代Hibernate。关于 @param 这个注解的使用,做者这里整理了一些笔记。java

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

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

也就是说若是有多个参数的时候,可使用@Param 这个注解,可是不是必定须要用到 @Param 这个注解呢?做者在这里列出如下几种情景spring

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

代码以下:
DAO 层 CommodityDao.javaapi

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.xmlmybatis

<?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配置文件关于数据源那一部分)app

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.xmlspa

<?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 info
        where 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

相关文章
相关标签/搜索