原文:https://blog.csdn.net/mrqiang9001/article/details/79520436html
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
代码以下:
DAO 层 CommodityDao.java
api
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
mybatis
<?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
代码以下:
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
spa
<?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}
,这样才能够
为了精简代码,做者这里只写关键部分
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 中保持一致才能够
其实从第一种场景中已经能够实现传递多个参数了,即把多个参数封装到一个 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