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提供一级缓存和二级缓 ...
随机推荐
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第一天】
本人做过一年的MATLAB编程和简单维护过VB和C++的项目.是跟着网上获得的黑马的Java双元视频课来自学入门Java知识和常用框架的使用. 淘淘商城(SpringMVC+Spring+Mybati ...
- 微信小程序-wx.request-路由跳转-数据存储-登录与授权
wx.request 相当于发送ajax请求 官方文档示例代码 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '', y: '' ...
- Properties类(一)
Java中读写资源文件最重要的类是Properties,功能大致如下: 1. 读写Properties文件 2. 读写XML文件 3. 不仅可以读写上述两类文件,还可以读写其它格式文件如txt等,只要 ...
- LeetCode No.145,146,147
No.145 PostorderTraversal 二叉树的后序遍历 题目 给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 示例 输入: [1,null,2 ...
- 表查询语句及使用-连表(inner join-left join)-子查询
一.表的基本查询语句及方法 from. where. group by(分组).having(分组后的筛选).distinct(去重).order by(排序). limit(限制) 1.单表查询: ...
- 爬虫基本库request使用—爬取猫眼电影信息
使用request库和正则表达式爬取猫眼电影信息. 1.爬取目标 猫眼电影TOP100的电影名称,时间,评分,等信息,将结果以文件存储. 2.准备工作 安装request库. 3.代码实现 impor ...
- iOS 部分API理解
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- Cobbler_自动装系统
Cobbler —自动装系统的操作步骤 Cobbler是一款自动化操作系统安装的实现,与PXE安装系统的区别就是可以同时部署多个版本的系统,而PXE只能选择一种系统. Cobbler 的安装 # 在一 ...
- Laravel 操作指令
php artisan migrate —path=database/migrations/v1 更新表数据 php artisan make:migration create_channels_ta ...
- 记录ionic 最小化应用时所遇的问题
ionic3与ionic4最小化插件安装不一样: ionic3安装方法: $ ionic cordova plugin add cordova-plugin-appminimize $ npm ins ...