当前位置:   article > 正文

@Param注解

@param

目录

使用Param注解情况

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

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

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

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


官方文档: http://www.mybatis.org/mybatis-3/zh/java-api.html

来源文章1:https://blog.csdn.net/Mrqiang9001/article/details/79520436

来源文章2:https://www.cnblogs.com/javaboy2018/p/8884507.html

使用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 层 CommodityDao.java
  1. package com.ljq.cs.dao;
  2. /**
  3. * @description: 商品信息 DAO 接口
  4. * @author: lujunqiang
  5. * @email: flying9001@gmail.com
  6. * @date: 2017/12/17
  7. */
  8. @Repository
  9. public interface CommodityDao {
  10. // 查询某一件商品
  11. Commodity queryOne(Commodity commodity);
  12. // 省略其他方法
  13. }

 

  • Mapper 文件: commoditymapper.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ljq.cs.dao.CommodityDao" >
  6. <select id="queryOne" resultType="Commodity">
  7. select *
  8. from t_commodity com
  9. where id = #{id}
  10. </select>
  11. </mapper>

 

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

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

 

  • 代码如下:
  • DAO 层 CommodityDao.java
  1. package com.ljq.cs.dao;
  2. /**
  3. * @description: 商品信息 DAO 接口
  4. * @author: lujunqiang
  5. * @email: flying9001@gmail.com
  6. * @date: 2017/12/17
  7. */
  8. @Repository
  9. public interface CommodityDao {
  10. // 查询某一件商品
  11. Commodity queryOne(@Param("commodity")Commodity commodity);
  12. // 省略其他方法
  13. }
  • Mapper 文件: commoditymapper.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ljq.cs.dao.CommodityDao" >
  6. <select id="queryOne" parameterType="com.ljq.cs.entity.Commodity" resultType="Commodity">
  7. select *
  8. from t_commodity com
  9. where id = #{commodity.id}
  10. </select>
  11. </mapper>

 

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

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

  • 为了精简代码,作者这里只写关键部分
  • DAO 层, UserInfoDao.java
  1. // 用户登录
  2. UserInfo signin(@Param("account")String account,@Param("passcode")String passcode);
  • mapper文件userInfomapper.xml
  1. <!-- 用户登录 -->
  2. <select id="signin" resultType="UserInfo">
  3. select *
  4. from t_userinfo info
  5. where account=#{account} and passcode=#{passcode}
  6. </select>
  • 这里 @Param 中定义的变量名必须和 mapper 中保持一致才可以

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

 

  • 其实从第一种场景中已经可以实现传递多个参数了,即把多个参数封装到一个 javaBean 中就可以实现了,但是如果是两个或者多个 javaBean 的时候,可以通过使用@Param注解的方式来实现,但是需要把每个 javaBean 中的属性全部拆分出来,这样就增加了巨大的代码量,因此不推荐这么做
  • 那么有没有可以不使用@Param注解,同样也可以传递多个参数(尤其是多个 javaBean)呢?答案是有的,废话不多说,直接上代码
  • 同上,这里只贴出关键部分
  • DAO 层, UserInfoDao.java
  •  
  1. // 搜索用户,对结果进行分页
  2. List searchUser(Map<String,Object>);

 

  • 使用DAO,UserService.java
  1. UserInfo userInfo = new UserInfo();
  2. Pagination page = new Pagination();
  3. Map<String,Object> map = new HashMap<>;
  4. map.put("userInfo",userInfo);
  5. pam.put("page",page);
  6. userService.searchUser(map);
  • mapper文件userInfomapper.xml
  1. <select id="searchUser" parameterType="java.util.Map" resultType="UserInfo">
  2. select *
  3. from t_userinfo user
  4. where 1 =1
  5. <if test="user.uname != null and ''!= user.uname ">
  6. and user.uname like '%${userInfo.uname}$%'
  7. </if>
  8. <if test="page.order != null and page.order == 10" >
  9. order by user.id asc
  10. </if>
  11. limit ${page.pagenum * page.limitnum}, #{page.limitnum}
  12. </select>
  • 作者通过上边的4种情况,主要是为了说明,Mybatis无论是传单个参数,还是传递多个参数,没有必要使用@Param注解啊
    使用@param 注解增添了不少代码不说,还容易导致错误,尤其是在 mapper 文件中(paraterType 属性)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/548740
推荐阅读
相关标签
  

闽ICP备14008679号