目录
使用Param注解情况
1.传递单个参数,不使用 @Param 注解
2.传递单个参数,使用@Param注解
3.传递多个参数,使用 @Param 注解
4.传递多个参数,不使用 @Param 注解
官方文档: /mybatis-3/zh/
来源文章1:/Mrqiang9001/article/details/79520436
来源文章2:/javaboy2018/p/
使用Param注解情况
使用@Param注解
当以下面的方式进行写SQL语句时:
@Select("select column from table where userid = #{userid} ")
public int selectColumn(int userid);当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以。
@Select("select column from table where userid = ${userid} ")
public int selectColumn(@Param("userid") int userid);当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错。
@Select("select column from table where userid = ${userid} ")
public int selectColumn(@Param("userid") int userid);
- 如果有多个参数的时候,可以使用@Param 这个注解
1.传递单个参数,不使用 @Param 注解
- 代码如下:
- DAO 层
package ;
/**
* @description: 商品信息 DAO 接口
* @author: lujunqiang
* @email: flying9001@
* @date: 2017/12/17
*/
@Repository
public interface CommodityDao {
// 查询某一件商品
Commodity queryOne(Commodity commodity);
// 省略其他方法
}
- Mapper 文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/">
<mapper namespace="" >
<select resultType="Commodity">
select *
from t_commodity com
where id = #{id}
</select>
</mapper>
- 这里只有一个参数,java 接口不使用 @Param 注解,同时 mapper 文件也不需要使用 parameterType 这个参数,Mybatis会 根据实体类(entity)的类型自动识别并匹配javaBean(这一部分在 spring配置文件关于数据源那一部分)
2.传递单个参数,使用@Param注解
- 代码如下:
- DAO 层
package ;
/**
* @description: 商品信息 DAO 接口
* @author: lujunqiang
* @email: flying9001@
* @date: 2017/12/17
*/
@Repository
public interface CommodityDao {
// 查询某一件商品
Commodity queryOne(@Param("commodity")Commodity commodity);
// 省略其他方法
}
- Mapper 文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/">
<mapper namespace="" >
<select parameterType="" resultType="Commodity">
select *
from t_commodity com
where id = #{}
</select>
</mapper>
- 当使用javaBean作为对象的时候,在写 SQL 语句的时候,必须指定参数类型 parameterType="",同时在 #{ } 取值的时候不能直接填入 javaBean 的属性,必须这样使用 ;否则,会抛出参数类型不匹配异常
如果不是 javaBean,则需要在写 SQL 语句的时候, #{ } 中的属性必须与 @Param中定义的一致,eg: @Param("username") , #{username} ,这样才可以
3.传递多个参数,使用 @Param 注解
- 为了精简代码,作者这里只写关键部分
- DAO 层,
// 用户登录
UserInfo signin(@Param("account")String account,@Param("passcode")String passcode);
- mapper文件
<!-- 用户登录 -->
<select 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 层,
// 搜索用户,对结果进行分页
List searchUser(Map<String,Object>);
- 使用DAO,
UserInfo userInfo = new UserInfo();
Pagination page = new Pagination();
Map<String,Object> map = new HashMap<>;
("userInfo",userInfo);
("page",page);
(map);
- mapper文件
<select parameterType="" resultType="UserInfo">
select *
from t_userinfo user
where 1 =1
<if test=" != null and ''!= ">
and like '%${}$%'
</if>
<if test=" != null and == 10" >
order by asc
</if>
limit ${ * }, #{}
</select>
- 作者通过上边的4种情况,主要是为了说明,Mybatis无论是传单个参数,还是传递多个参数,没有必要使用@Param注解啊
使用@param 注解增添了不少代码不说,还容易导致错误,尤其是在 mapper 文件中(paraterType
属性)