MyBatis(二):Select语句传递参数的集中方案
从别人说的方案中看出,传递参数方案还挺多,不如自己整理下,以便以后使用过程中有个笔记回忆录。
- 1、传递一个参数的用法:
配置文件
<select id="getById" resultType="TaskAutoExecutePlan" resultMap="TaskAutoExecutePlanResult" parameterType="java.lang.String">
select * from TaskAutoExecutePlan where id=#{id}
</select>
注意:这里边需要在dao层传递定义的接口类对应getById函数的参数名最好也是id,类型为String,否则也不会出现异常(我测试的结果是通过了,比如:函数写成这样getById(String name))。
Mapper.java
public TaskAutoExecutePlan getById(String id);
Server.java
@Override
public TaskAutoExecutePlan getById(String id) {
SqlSession sqlSession = this.factory.openSession();
TaskAutoExecutePlan result = sqlSession.selectOne("com.xxx.mapper.TaskAutoExecutePlanMapper.getById",id);
sqlSession.commit();
sqlSession.close(); return result;
}
- 2、传递多个参数的用法,使用Index来替换参数名称:
配置文件
<select id="getByTaskStatusAndAutoExecutePlanType" resultType="TaskAutoExecutePlan" resultMap="TaskAutoExecutePlanResult">
select * from TaskAutoExecutePlan where taskStatus=#{0} and autoExecutePlanType=#{1}
</select>
需要注意:
1、#{index}这个更像是用在有IOC的框架中使用,但是目前我并没有使用IOC。
2、如果在传递参数是不能使用List<Object>这种集合来存储参数。
3、目前我使用Map<String,Object>这种方式,虽然实现了Mapper的实现类Server,但不代表他是正宗的用法。
4、目前我这种通过Map参数实现传递Index参数的方案,Map元素中的值不能是Enum类型,即使在配置文件参数中指定类型也不正确。
Mapper.java
public List<TaskAutoExecutePlan> getByTaskStatusAndAutoExecutePlanType(TaskStatus taskStatus, AutoExecutePlanType autoExecutePlanType);
Server.java
@Override
public List<TaskAutoExecutePlan> getByTaskStatusAndAutoExecutePlanType(TaskStatus taskStatus, AutoExecutePlanType autoExecutePlanType) {
SqlSession sqlSession = this.factory.openSession(); Map<String,Object> parameters=new java.util.HashMap<>();
parameters.put("0",taskStatus.getValue());
parameters.put("1",autoExecutePlanType.getValue()); List<TaskAutoExecutePlan> result = sqlSession.selectList("com.xxx.mapper.TaskAutoExecutePlanMapper.getByTaskStatusAndAutoExecutePlanType",parameters);
sqlSession.commit();
sqlSession.close(); return result;
}
- 3、Map封装多参数:
配置文件:
<select id="getByTaskStatusAndAutoExecutePlanType" resultType="TaskAutoExecutePlan" resultMap="TaskAutoExecutePlanResult" parameterType="java.util.Map">
select * from TaskAutoExecutePlan where taskStatus=#{taskStatus,jdbcType=INTEGER} and autoExecutePlanType=#{autoExecutePlanType,jdbcType=INTEGER}
</select>
需要注意:这里不能直接把Enum存储到Map的元素中,第一:方面enum不是object对象,第二:默认TaskStatus.Doing会被转化为“Doing”字符串,参数不是整数意义发生了变换。
Mapper.java
public List<TaskAutoExecutePlan> getByTaskStatusAndAutoExecutePlanType(Map<String,Object> parameters);
Server.java
@Override
public List<TaskAutoExecutePlan> getByTaskStatusAndAutoExecutePlanType(Map<String,Object> parameters) {
SqlSession sqlSession = this.factory.openSession();
List<TaskAutoExecutePlan> result = sqlSession.selectList("com.xxx.mapper.TaskAutoExecutePlanMapper.getByTaskStatusAndAutoExecutePlanType",parameters);
sqlSession.commit();
sqlSession.close(); return result;
}
调用代码:
Map<String,java.lang.Object> parameters=new java.util.HashMap<>();
parameters.put("taskStatus",TaskStatus.Doing.getValue());
parameters.put("autoExecutePlanType",AutoExecutePlanType.MrRasterization.getValue()); List<TaskAutoExecutePlan> items1 = taskAutoExecutePlanServer.getByTaskStatusAndAutoExecutePlanType(parameters);
for (TaskAutoExecutePlan item : items1)
System.out.println(item.getId() + "," + item.getAutoExecutePlanType() + "," + item.getTaskStatus() + "," + item.getCreateDate() + "," + item.getModifyDate());
- 4、List封装in
配置文件:
<select id="getByTaskStatusAndAutoExecutePlanType" resultType="TaskAutoExecutePlan" resultMap="TaskAutoExecutePlanResult">
select * from TaskAutoExecutePlan where id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">#{item,jdbcType=VARCHAR}</foreach>
</select>
Mapper.java
public List<TaskAutoExecutePlan> getByTaskStatusAndAutoExecutePlanType(List<String> list);
Server.java
@Override
public List<TaskAutoExecutePlan> getByTaskStatusAndAutoExecutePlanType(List<String> list) {
SqlSession sqlSession = this.factory.openSession();
List<TaskAutoExecutePlan> result = sqlSession.selectList("com.xxx.mapper.TaskAutoExecutePlanMapper.getByTaskStatusAndAutoExecutePlanType",list);
sqlSession.commit();
sqlSession.close(); return result;
}
调用:
List<String> list=new java.util.ArrayList<>();
list.add("6a5987a6f78c11e69fb300fffdc16f2e");
list.add("0729bf7ef78d11e69fb300fffdc16f2e"); List<TaskAutoExecutePlan> items1 = taskAutoExecutePlanServer.getByTaskStatusAndAutoExecutePlanType(list);
for (TaskAutoExecutePlan item : items1)
System.out.println(item.getId() + "," + item.getAutoExecutePlanType() + "," + item.getTaskStatus() + "," + item.getCreateDate() + "," + item.getModifyDate());
其他方式还有混合调用、注解等方式,这些需要学习了Spring+MyBatis后在使用。
更多用法请参考:http://www.cnblogs.com/mingyue1818/p/3714162.html
MyBatis(二):Select语句传递参数的集中方案的更多相关文章
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- Mybatis查询select 传单个参数不识别,找不到
今天, Mybatis查询select 传单个参数不识别,找不到 解决办法: 加上jdbc=varchar #{XXX,jdbc=VARCHAR}
- mybatis where in语句中参数过多
ps : mybatis在in中参数过多 出现问题 com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数.该服务器支持最多 210 ...
- Shell学习心得(二):传递参数、运算符
1.传递参数 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 向脚本传递三个参数, ...
- mybatis 中sql语句传递多个参数
Available parameters are [2, 1, 0, param1, param2, param3] <select id="loginByTeacher" ...
- 关于Mybatis的@Param注解 及 mybatis Mapper中各种传递参数的方法
原文:https://blog.csdn.net/mrqiang9001/article/details/79520436 关于Mybatis的@Param注解 Mybatis 作为一个轻量级的数 ...
- 关于实现mybatis order by 排序传递参数实现 问题记录
一 问题场景:本人项目纯纯的后端系统 并且项目前端采用纯纯的原生js 实现 1)表格 通过查询列表数据放入到域中 前段采用 for循环的方式实现遍历生成列表 2)分页实现本人是公司内部自定 ...
- mybatis框架中 #和$传递参数的区别 和注意
#{}: 1. 是预编译 2. 编译成占位符 3. 可以防止sql注入 4. 自动判断数据类型 5. 一个参数时,可以使用任意参数名称进行接收 ${}: 1. 非预编译 2. sql的直 ...
- Mybatis(二):Mybatis的映射文件sqlmapper详解
MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...
随机推荐
- NGUI_Font
三.NGUI中的UI字体制作 1.概述: 系统中提供的字体 比较少,而UI字体又是使用最为频繁的,不能因为单一的字体而损失用户量,则这个时候我们就可以通过Font Maker进行字体的制作. 2.动态 ...
- 快速排序及优化(Java实现)
普通快速排序 找一个基准值base,然后一趟排序后让base左边的数都小于base,base右边的数都大于等于base.再分为两个子数组的排序.如此递归下去. public class QuickSo ...
- 斗地主案例(利用集合/增强for等技术)
斗地主案例(利用集合/增强for等技术) package Task10; import java.util.ArrayList; import java.util.Collections; publi ...
- Object.defineProperty实现数据绑定
1.Object.defineProperty方法 Object.defineProperty(obj, prop, descriptor); (1)参数: obj:目标对象 prop:需要定义的属 ...
- 利用NPOI将EXCEL转换成HTML的C#实现
领导说想做一个网页打印功能,而且模板可以自定义,我考虑了三个方案,一是打印插件,二是在线 html 编辑器,三是 excel 模板,领导建议用的是打印插件的形式,我研究了一下,一个是需要下载安装,二个 ...
- 连不上虚拟机中的Redis的原因分析、以及虚拟机网络配置
1. 网络最好是桥接方式.我之前用的是"网络地址转换(NAT)",导致虚拟机里用命令ifconfig得到的ip是10.0.2.15,好奇怪的感觉,然后在真实机上一直连不上.有的说用 ...
- clumsy模拟客户端网络差的场景的使用
1.为什么需要模拟客户端网络差的情况? a. 研发环境的网络配置一般较高,网络响应快,不容易出现网络故障,但是客户使用的网络环境千差万别,不排除使用过程中遇到网络故障的情况. b.程序有些时候是多线程 ...
- JavaScript 哈希表(散列表)应用
查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...
- Bate测试报告
1 测试中找出的bug Bug类型 总数 描述 修复的bug 10 1.注册成功并没有直接跳转到登录页面: 2.学校地区无限制,数字也可以: 3.虽然相同用户名不能注册,但是只是显示,注册失败,却没有 ...
- C语言——第二次作业(2)
作业要求一 PTA作业的提交列表 作业要求二 题目1.删除字符串中数字字符(函数题) 1.设计思路 - (1)算法 第一步:调用定义的函数. 第二步:定义i=0.j=0,i为原字符数组角标,j为删除后 ...