关于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
关于Mybatis的@Param注解 及 mybatis Mapper中各种传递参数的方法的更多相关文章
- mybatis之Param注解
一.作用 使用@Param注解表示给参数命名,名称就是括号中的内容.给参数命名,然后在映射文件中就能根据名称获取参数值了.在mybatis中我们常常要使用到多个参数,但是在xml中的parameter ...
- @Param注解在Mybatis中的使用 以及传递参数的三种方式
第一种: Dao层的方法 public User selectUser(String name,String password); 对应的Mapper.xml <select id=" ...
- 关于mybatis的@Param注解和参数
1,使用@Param注解 当以下面的方式进行写SQL语句时: @Select("select column from table where userid = #{userid} " ...
- Mybatis框架-@Param注解
回顾一下上一个小demo中存在的问题,是是根据用户的id修改用户的密码,我们只是修改了用户的密码,结果我们的在写接口方法的时候掺入的参数确实一个User对象,这样让别人看到我们的代码真的是很难读懂啊! ...
- mybatis 传递参数的方法总结
有三种mybatis传递参数的方式: 第一种 mybatis传入参数是有序号的,可以直接用序号取得参数 User selectUser(String name,String area); 可以在xml ...
- mybatis传递参数的方法
一.传递一个参数 例:根据员工编号查询员工的基本信息 1.在dao接口中声明一个方法 2.在mapper中实现该方法 3.测试 /** * 传递一个参数 */ public class Test02 ...
- 在 mapper 中如何传递多个参数?
1.第一种: DAO 层的函数 public UserselectUser(String name,String area); 对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1} ...
- @Param注解在mybatis中的使用以及传入参数的几种方式(转)
第一种: Dao层的方法 <span style="font-size:12px;">Public User selectUser(String name,String ...
- mybatis框架中 #和$传递参数的区别 和注意
#{}: 1. 是预编译 2. 编译成占位符 3. 可以防止sql注入 4. 自动判断数据类型 5. 一个参数时,可以使用任意参数名称进行接收 ${}: 1. 非预编译 2. sql的直 ...
随机推荐
- python操作符及其循环语句(非常全)
//2018.10.14 1. Windows + R可以直接进行运行cmd 2. Random.randint(a,b):产生a-b的任意一个整数,在IDLE里面运行时需要注意在前面写好调用impo ...
- 应用UserDefaults储存游戏分数和最高分
应用UserDefaults储存游戏分数和最高分 我们在GameScene.swift里 private var currentScore:SKLabelNode! // 当前分数节点 private ...
- 213. String Compression【LintCode java】
Description Implement a method to perform basic string compression using the counts of repeated char ...
- BOM / URL编码解码 / 浏览器存储
BOM 浏览器对象模型 BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的 ...
- Pandas基础教程
pandas教程 更多地可以 参考教程 安装 pip install pandas pandas的类excel操作,超级方便: import pandas as pd dates = pd.date_ ...
- 关于GitHub推送时发生Permission denied (publickey)的问题
今天在学习廖雪峰老师官网的git教程“添加远程库”时发现总是推送失败,下边提示“Permission denied (publickey) 这个问题” 传送门:https://www.liaoxuef ...
- HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)
Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...
- 《安装ubuntu及VMware以及相关问题汇总》
一.VMware Ubuntu安装详细过程 http://blog.csdn.net/u013142781/article/details/50529030 二.VMware Tools (ubunt ...
- Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
. : 关机, 如果将Linux默认运行等级设置为0, 系统将无法启动; -- : 多用户模式, 允许使用网络文件系统, 一般不使用图形界面登陆就是这种模式; -- : 多用户图形界面模式, 该模式下 ...
- Internet History
Alan Turing and Bletchley Park Top secret breaking effort(二战破译希特勒密码) 10,000 people at the peak(team ...