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


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

    关于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 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

  • 相关阅读:
    java高并发程序设计模式-并发级别:阻塞、无障碍、无锁、无等待【转载】
    Java创建线程的三种主要方式
    Java乐观锁实现之CAS操作
    Java解释执行和编译执行
    手把手教你使用百度大脑地址识别API
    详解百度大脑EdgeBoard出色的视频处理技术
    一步到位!!百度大脑语音合成快速搞定会员到访提醒功能
    一文带你了解百度大脑云狐语音全攻略(附代码)
    AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略!!
    快速上手百度大脑EasyDL专业版·物体检测模型(附代码)
  • 原文地址:https://www.cnblogs.com/libin6505/p/10036765.html
Copyright © 2020-2023  润新知