MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])
针对Oracle不支持自增的解决方案
Oracle不支持自增,但是它使用序列来模拟自增,每次插入数据的主键是从序列中拿到的值,那么如何获取这个值呢?
<insert id="addEmp" databaseId="oracle">
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
select EMPLOYEE_SEQ.nextval from dual
</selectKey>
insert into tb_employee(EMPLOYEE_ID,last_name,email,gender)
values(#{id},#{lastName},#{email},#{gender})
</insert>
还有另外一种After版本
<insert id="addEmp" databaseId="oracle">
<selectKey keyProperty="id" order="AFTER" resultType="Integer">
select EMPLOYEE_SEQ.currval from dual
</selectKey>
insert into tb_employee(EMPLOYEE_ID,last_name,email,gender)
values(EMPLOYEE_SEQ.nextval,#{lastName},#{email},#{gender})
</insert>
参数处理
通过上面的几个例子,参数处理的直观感受就是拿#{}这个结构,在中间填写属性名。当然,Mybatis的参数处理还有很多,这里我们一一介绍一下:
①单个参数
#{参数名}:取出参数。
其实单个参数的传入,我们可以不按规定随意填写这个参数名,如下例子:
Employee getEmpById(Integer id);
<select id="getEmpById" resultType="com.figsprite.bean.Employee">
select id,last_name lastName,gender,email from tb_employee where id = #{ helloworld}
</select>
②多个参数
我们来做个尝试,先在接口中编写新的方法
Employee getEmpByIdAndLastName(Integer id,String lastName);
- <select id="getEmpByIdAndLastName" resultType="com.figsprite.bean.Employee">
- select id,last_name lastName,gender,email from tb_employee where id = #{id} and last_name = #{lastName}
- </select>
- @Test
- public void test6()throws IOException{
- SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
- SqlSession openSession = sqlSessionFactory.openSession();
- try{
- EmployeeMapper employeeMapper = openSession.getMapper(EmployeeMapper.class);
- Employee e = employeeMapper.getEmpByIdAndLastName(4,"Hello");
- System.out.println(e);
- }finally {
- openSession.close();
- }
- }
此时,运行这个测试发现报错,
- ### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
- ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
采用的方法是Employee getEmpByIdAndLastName(Integer id,String lastName);
取值是:#{id},#{lastName},当我们传入多个参数Mybatis会将这些参数封装成map,#{}就是从map中获取指定key的值,这个和Java中的map概念类似,也是键值对,
Key:param1、param2……
Value:参数值
因此,我们更改#{}中的值
- <select id="getEmpByIdAndLastName" resultType="com.figsprite.bean.Employee">
- select id,last_name lastName,gender,email from tb_employee where id = #{param1} and last_name = #{param2}
- </select>
发现没有问题了,但是这种方式当然会让我们书写十分困难,当参数类型十分多的时候,这简直是场灾难,因此多个参数传入时,我们推荐使用命名参数。
③命名参数
我们只要在接口中的方法做一些小小的更改即可
Employee getEmpByIdAndLastName(@Param("id") Integer id,@Param("lastName") String lastName);
<select id="getEmpByIdAndLastName" resultType="com.figsprite.bean.Employee"> select id,last_name lastName,gender,email from tb_employee where id = #{id} and last_name = #{lastName} </select>
MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])的更多相关文章
- MyBatis映射文件 相关操作
一.MyBatis映射文件 1.简介 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行 ...
- Mybatis映射文件中#取值时指定参数相关规则
Mybatis映射文件中#取值时指定参数相关规则 在#{}中,除了需要的数值外,还可以规定参数的一些其他规则. 例如:javaType,jdbcType,mode(存储过程),numericScale ...
- SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis
一:DAO实体编码 1:首先,在src目录下,新建org.myseckill.entity包,用于存放实体类: 2:实体类设计 根据前面创建的数据库表以及映射关系,创建实体类. 表一:秒杀商品表 对应 ...
- 03、MyBatis 映射文件
1.XML映射器 2.select Select元素来定义查询操作 Id:唯一标识符 - 用来引用这条语句,需要和接口的方法名一致 parameterType:参数类型 - 可以不传,MyBatis会 ...
- MyBatis 映射文件
Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...
- Mybatis映射文件完整模板参照
Mybatis映射文件完整模板参照 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...
- MyBatis 映射文件详解
1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...
- MyBatis映射文件中用#和$传递参数的特点
在MyBatis映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...
- Mybatis映射文件标签(关于sql)
Mybatis映射文件 1.接口的全限定名和映射文件的namespace一致 <mapper namespace="com.offcn.dao.UserDao"> 2. ...
随机推荐
- SQL IN 操作符
IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...
- 第9章 Java中的线程池 第10章 Exector框架
与新建线程池相比线程池的优点 线程池的分类 ThreadPoolExector参数.执行过程.存储方式 阻塞队列 拒绝策略 10.1 Exector框架简介 10.1.1 Executor框架的两级调 ...
- fuser - 查看文件/网络端口等被什么进程占用
前提 linux环境下,当使用umount命令卸载挂载点时,会遇到“device is busy”提示,这时fuser就能查出谁在使用这个资源;当然umount –lf [挂载点] 也可以强制卸载 ...
- gcd和exgcd和lcm
Gcd▪ 欧几里得算法又称辗转相除法,用于计算两个正整数 a, b 的最大公约数.▪ 计算公式为 gcd(a,b) = gcd(b,a mod b).▪ 公式无需证明,记忆即可.▪ 如果要求多个数的最 ...
- 论文笔记(一)---翻译 Rich feature hierarchies for accurate object detection and semantic segmentation
论文网址: https://arxiv.org/abs/1311.2524 RCNN利用深度学习进行目标检测. 摘要 可以将ImageNet上的进全图像分类而训练好的大型卷积神经网络用到PASCAL的 ...
- MVC5 + EF6 完整教程 (转)
点击查看: MVC5 + EF6
- Generative Adversarial Nets[Improved GAN]
0.背景 Tim Salimans等人认为之前的GANs虽然可以生成很好的样本,然而训练GAN本质是找到一个基于连续的,高维参数空间上的非凸游戏上的纳什平衡.然而不幸的是,寻找纳什平衡是一个十分困难的 ...
- Python学习总结 13 Scrapy
当前环境是 Win8 64位的,使用的Python 3.5 版本. 一 安装Scrapy 1,安装 lxml pip install lxml -i https://pypi.douban.com/s ...
- 比官方文档更易懂的Vue.js教程!包你学会!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门> ...
- 3.sparkSQL整合Hive
spark SQL经常需要访问Hive metastore,Spark SQL可以通过Hive metastore获取Hive表的元数据.从Spark 1.4.0开始,Spark SQL只需简单的配置 ...