mybatis参数映射
转载地址:http://iyiguo.net/blog/2012/09/27/mybatis-param-mapping-rules/
规则
非注解参数
当参数未使用@Param注解时,可以通过以下方式访问:
#{参数位置[0..n-1]}
或者
#{param[1..n]}
如果参数类型是自定义对象Bean时,只需加上.对象属性即可
#{参数位置[0..n-1].对象属性}
#{param[1..n].对象属性}
特别的,如果非注解参数只有一个时,可使用
#{任意字符}
注解参数
@Param 注释了参数后相当于给该参数指定了一个别名。注释后的参数只能通过
#{注解别名}
或者
#{param[1..n]}
如果参数类型是自定义对象Bean时,只需加上.对象属性即可访问对象属性
#{注解别名.属性}
#{param[1..n].属性}
示例
为了明确上述规则,我们的示例具体细分了各种情况进行展示。
非注解型
一个参数
User getUserById(int id);select * from <TABLE> where id = #{id}// orselect * from <TABLE> where id = #{abdc}// orselect * from <TABLE> where id = #{param1}User getUser(User user); // user.getName user.getAgeselect * from <TABLE> where name = #{name} and age = #{age}
多个参数
User getUser(String name, int age);select * from <TABLE> where name = #{0} and age = #{1}// orselect * from <TABLE> where name = #{param1} and age = #{param2}User getUser(User usr, int flag);select * from <TABLE> where name = #{0.name} and age = {0.age} and flag = #{1}// orselect * from <TABLE> where name = #{param1.name} and age = {param1.age} and flag = #{param2}
注解型
一个参数
User getUserById(@Param(value="keyId") int id);select * from <TABEL> where id = #{keyId}// orselect * from <TABLE> where id = #{param1}User getUser(@Param(value="user") User user); // user.getName user.getAgeselect * from <TABLE> where name = #{user.name} and age = #{user.age}// orselect * from <TABLE> where name = #{param1.name} and age = #{param1.age}
多个参数
User getUser(@Param(value="xm") String name, @Param(value="nl") int age);select * from <TABLE> where name = #{xm} and age = #{nl}// orselect * from <TABLE> where name = #{param1} and age = #{param2}// orselect * from <TABLE> where name = #{xm} and age = #{param2}User getUser(@Param(value="usr") User user, @Param(value="tag") int flag);select * from <TABLE> where name = #{usr.name} and age = #{usr.age} and flag = #{tag}// orselect * from <TABLE> where name = #{param1.name} and age = #{param1.age} and flag = #{param2}// orselect * from <TABLE> where name = #{usr.name} and age = #{param1.age} and flag = #{param2}
非注解和注解型混合型
当采用部分参数使用@Param注解时,参数注释为将以上两种情况结合起来即可.
User getUser(String name, @Param(value="nl") age, int gendar);// 对于age的访问不能是 #{1} 只能是 #{param2} | #{nl}select * from <TABLE> where name = #{0} and age = #{nl} and gendar = #{param3)
框架主要映射处理代码
参数的获取
org.apache.ibatis.binding.MapperMethod
private Object getParam(Object[] args) {final int paramCount = paramPositions.size();// 无参数if (args == null || paramCount == 0) {return null;// 无注解并参数个数为1} else if (!hasNamedParameters && paramCount == 1) {return args[paramPositions.get(0)];} else {Map<String, Object> param = new MapperParamMap<Object>();for (int i = 0; i < paramCount; i++) {param.put(paramNames.get(i), args[paramPositions.get(i)]);}// issue #71, add param names as param1, param2...but ensure backward compatibility// 这就是 #{param[1..n]} 的来源for (int i = 0; i < paramCount; i++) {String genericParamName = "param" + String.valueOf(i + 1);if (!param.containsKey(genericParamName)) {param.put(genericParamName, args[paramPositions.get(i)]);}}return param;}}
SQL预编译参数设置
org.apache.ibatis.executor.parameter.DefaultParameterHandler
public void setParameters(PreparedStatement ps) throws SQLException {ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();if (parameterMappings != null) {MetaObject metaObject = parameterObject == null ? null : configuration.newMetaObject(parameterObject);for (int i = 0; i < parameterMappings.size(); i++) {ParameterMapping parameterMapping = parameterMappings.get(i);if (parameterMapping.getMode() != ParameterMode.OUT) {Object value;String propertyName = parameterMapping.getProperty();PropertyTokenizer prop = new PropertyTokenizer(propertyName);if (parameterObject == null) {value = null;} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {value = parameterObject;} else if (boundSql.hasAdditionalParameter(propertyName)) {value = boundSql.getAdditionalParameter(propertyName);} else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)&& boundSql.hasAdditionalParameter(prop.getName())) {value = boundSql.getAdditionalParameter(prop.getName());if (value != null) {value = configuration.newMetaObject(value).getValue(propertyName.substring(prop.getName().length()));}} else {value = metaObject == null ? null : metaObject.getValue(propertyName);}TypeHandler typeHandler = parameterMapping.getTypeHandler();if (typeHandler == null) {throw new ExecutorException("There was no TypeHandler found for parameter " + propertyName + " of statement " + mappedStatement.getId());}JdbcType jdbcType = parameterMapping.getJdbcType();if (value == null && jdbcType == null) jdbcType = configuration.getJdbcTypeForNull();typeHandler.setParameter(ps, i + 1, value, jdbcType);}}}}
mybatis参数映射的更多相关文章
- MyBatis参数绑定规则及原理分析
MyBatis参数的传递有几种不同的方法,本文通过测试用例出发,对其中的方式进行总结和说明,并对其部分源码进行分析. 一.测试用例(环境参考之前博客SSM接口编程一文 http://www.cnblo ...
- Mybatis sql映射文件浅析 Mybatis简介(三)
简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...
- Mybatis sql映射文件浅析 Mybatis简介(三) 简介
Mybatis sql映射文件浅析 Mybatis简介(三) 简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...
- Mybatis输入映射和输出映射
本节内容: 输入参数映射 输出映射 resultMap Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 一.环境准备 复制 ...
- Mybatis(二):Mybatis的映射文件sqlmapper详解
MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...
- (十一)mybatis之映射器(select)
映射器 映射器的主要元素有八种: 元素名称 描述 select 查询语句,可自定义参数 insert 插入语句,执行后返回插入的条数 update 更新语句,执行后返回更新的条数 delete 删除语 ...
- Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)
Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...
- mybatis中映射文件和实体类的关联性
mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~ ...
- mybatis 高级映射和spring整合之查询缓存(5)
mybatis 高级映射和spring整合之查询缓存(5) 2.0 查询缓存 2.0.1 什么是查询缓存 mybatis提供缓存,用于减轻数据压力,提高数据库性能. mybatis提供一级缓存和二级缓 ...
随机推荐
- Ubuntu---gedit 打开windows 下 .txt 文件乱码的解决方法
问题出现情况:在windows 下编辑的 .txt 文件复制到 Ubuntu 下打开,默认打开方式为 gedit 软件打开,出现如下乱码: 出现原因:在 windows 系统下,.txt 文件默认编码 ...
- SLAM资料
当下SLAM方案的总体介绍 http://wwwbuild.net/roboteasy/908066.html slam基础知识 https://www.zhihu.com/question/3518 ...
- C语言笔记 16_标准库&stdio&stdlib&string&time
<stdio.h> 简介 stdio .h 头文件定义了三个变量类型.一些宏和各种函数来执行输入和输出. 库变量 下面是头文件 stdio.h 中定义的变量类型: 序号 变量 & ...
- Linux设置环境变量PATH路径的两种方法
echo 'export dataPath=$HOME/data/pre' >> ~/.bash_profile 路径即刻生效: . .bash_profile 或 source .bas ...
- Andorid Studio 3.1 引入第三方jar包的方法
今天手痒,把android studio 从3.0升级到3.1.2 发现很多问题 1.发现编译会下载好多东西,等半天 2.之前的jar包导不进来了 针对jar包导入不成功,我查了一下说是不支撑comp ...
- Qt QPixmap QImage 图片等比例缩放到指定大小
QPixmap pixmap(path); //pixmap=QPixmap::fromImage(imgShow); pixmap = pixmap.scaled(, , Qt::KeepAspec ...
- linux下tab作用的描述?
[Tab] 接在一串指令的第一个字的后面,则为命令补全; 实例怎么描述?什么叫一串指令的第一个字?[Tab] 接在一串指令的第二个字以后时,则为『文件补齐』 实例怎么描述?什么叫一串指令的 ...
- Springboot中RestTemplate -- 用更优雅的方式发HTTP请求
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...
- GSON转换成Long型变为科学计数法及时间格式转换异常的解决方案
直接上工具类了,简单实用 public class GsonUtils { private static Gson gson = null; static { if (gson == null) { ...
- php 二维码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...