动态SQL3
Oracle的批量操作
Oracle不支持VALUES(),(),()这种方式,所以不能用上一节所讲的方法。
有时候业务会包含很多次数据库操作,为了减少数据库连接,我们会选择一次提交大量sql,
这时我们会用到begin end,使用begin end需要注意的是,每个sql语句都要确保以";"结尾,代表一句sql结束。
- begin
- insert into tb_employee(id,last_name,email,gender,d_id) VALUES
- (employee_seq.nextval,'Maya','mcl@qq.com','0',1);
- insert into tb_employee(id,last_name,email,gender,d_id) VALUES
- (employee_seq.nextval,'Kafka','kafsl@qq.com','0',2);
- end;
还可以利用中间表,进行批量插入,这部分不熟悉,先跳过,有兴趣的朋友可以深入了解一下,
- <insert id="addEmps">
- begin
- <foreach collection="emps" item="emp">
- insert into tb_employee(id,last_name,email,gender,d_id) VALUES
- (tb_employee_seq.nextval,#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id});
- </foreach>
- end;
- </insert>
内置参数
不只是方法传入的参数可以被用来判断、取值,我们还可以使用两个默认的内置参数:_parameter,_databaseId
_parameter:代表整个参数
单个参数:_ parameter就是这个参数
多个参数:参数会被封装成一个map; _parameter就是代表这个map
_databaseId:如果配置了<databaseIdProvider>标签,那么_databaseId就会有值
_databaseId就代表当前数据库的别名
- <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
- <if test="_databaseId='mysql'">
- select * from tb_employee
- </if>
- <if test="_databaseId='oracle'">
- select * from tb_employee
- </if>
- </select>
- <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
- select * from tb_employee
- <if test="_parameter!=null">
- where last_name = #{_parameter.lastName}
- </if>
- </select>
<bind>标签
这个标签可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值
举个例子,我们之前模糊查询的时候出入Employee对象时,要设定它的lastName为"%青%",也就是说这个%,是要认为拼接的,可是有些人,希望只写一个"青",让%由框架帮我们提供,那该怎么办?
- <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
- select * from tb_employee
- <if test="_parameter!=null">
- where last_name like `%#{ lastName}%`
- </if>
- </select>
这么写行不行?肯定不行,like后面是要作为整体传入数据库查询的,这时候${}就派上用场了,
- <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
- select * from tb_employee
- <if test="_parameter!=null">
- where last_name like '%${ lastName}%'
- </if>
- </select>
由于${}不会进行预编译,所以它会将拼装完成的SQL语句传入数据库,这样就不会出问题了,当然这样不安全,所以我们希望还是使用#{},这样就不得不用<bind>标签了
- <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">
- <bind name="_lastName" value="'%'+ lastName+'%'"/>
- select * from tb_employee
- <if test="_parameter!=null">
- where last_name like #{_lastName}
- </if>
- </select>
<sql>标签
用于抽取重用的sql语句,比如我们上面的例子中,下面的语句使用了多次,这时就可以考虑使用<sql>标签。
last_name,email,gender,d_id
- <sql id="column">
- last_name,email,gender,d_id
- </sql>
接着将原先是这句话的sql语句,用<include>标签替换
- <insert id="addEmps">
- <foreach collection="emps" item="emp" separator=";">
- INSERT INTO tb_employee(<include refid="column"></include>) VALUES
- (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})
- </foreach>
- </insert>
- @Test
- public void TestSaveBach() throws IOException {
- SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
- SqlSession openSession = sqlSessionFactory.openSession(true);
- Department department = new Department(2);
- Employee e1 = new Employee("Wendy","0","adcxs@qq.com",department);
- Employee e2 = new Employee("Diyago","1","aaasaadccjdjj@qq.con",department);
- List<Employee> employeeList = new ArrayList<>();
- employeeList.add(e1);
- employeeList.add(e2);
- try{
- EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);
- mapper.addEmps(employeeList);
- }finally {
- openSession.close();
- }
- }
我们还可以通过<property>标签,自定义一些属性
- <insert id="addEmps">
- <foreach collection="emps" item="emp" separator=";">
- INSERT INTO tb_employee(
- <include refid="column">
- <property name="testColumn" value="test"/>
- </include>
- ) VALUES
- (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})
- </foreach>
- </insert>
注意这里是用${}取值的
- <sql id="column">
- last_name,email,gender,d_id,${testColumn}
- </sql>
DEBUG [main] - ==> Preparing: INSERT INTO tb_employee( last_name,email,gender,d_id,test ) VALUES (?,?,?,?) ; INSERT INTO tb_employee( last_name,email,gender,d_id,test ) VALUES (?,?,?,?)
动态SQL3的更多相关文章
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- 怎样SQL存储过程中执行动态SQL语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- SqlServer:SqlServer(存储过程动态表查询(取消返回值),事务处理,批量还原sqlserver备份,强制删除被占用的数据库)
1.存储过程动态表查询 USE [NETWORKING_AUDIT] GO /****** Object: StoredProcedure [dbo].[impConfigInfo] Script D ...
- iOS可视化动态绘制连通图
上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- Ubuntu 16.10 安装byzanz截取动态效果图工具
1.了解byzanz截取动态效果图工具 byzanz能制作文件小,清晰的GIF动态效果图,不足就是,目前只能通过输入命令方式来录制. byzanz主要的参数选项有: -d, --duration=SE ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- 【开源】.Net 动态脚本引擎NScript
开源地址: https://git.oschina.net/chejiangyi/NScript 开源QQ群: .net 开源基础服务 238543768 .Net 动态脚本引擎 NScript ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
随机推荐
- 绝版珍珍藏:web前端技术学习指南
绝版珍珍藏:web前端技术学习指南 优秀的Web前端开发工程师要在知识体系上既要有广度和深度!应该具备快速学习能力. 前端开发工程师不仅要掌握基本的Web前端开发技术,网站性能优化.SEO和服务器端的 ...
- <转> mysql处理高并发,防止库存超卖
先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购 一个商品.然而,作为活动商品,库存肯定是很有限的,如何 ...
- ASP.Net Web API 输出缓存 转载 -- Output caching in ASP.NET Web API
一.Nuget安装相关dll Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package ...
- BAT美团滴滴java面试大纲(带答案版)之四:多线程Lock
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 这是多线程的第二篇. 多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸 ...
- 【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
自从SSD固态硬盘出世以来,一直都被持续关注着,SSD的性能优势让无数用户起了将操作系统迁移到SSD的心思,直接后果就是让无数机械硬盘为止黯然退场,很多软件都可以做到系统迁移,然而,被完美迁移的系统却 ...
- 第10章 RDB持久化
Redis是一种内存数据库,掉电即失,为了解决这个问题Redis提供了RDB持久化功能,该功能可以把Redis中的内容以RDB文件的形式存储在硬盘上,并且每次RedisServer启动的时候都会尝试从 ...
- poj-1330(暴力写的lca)
传送门 一看就是lca的板子题 然而 (写这个的时候我忘了怎么写lca) 于是我就试着写暴力了 本以为会tle结果e了一次后居然a掉了 开心到起飞.嘿嘿嘿 但还是格式输出错误了一次而且在ce之前也de ...
- Generative Adversarial Nets[Pre-WGAN]
本文来自<towards principled methods for training generative adversarial networks>,时间线为2017年1月,第一作者 ...
- windows下数据挖掘相关包numpy、pandas的安装
安装Anaconda的绕道 这里介绍如何在windows下安装numpy/scipy/matplotlib/pandas/scikit_learn等数据分析相关包 相关环境: win7 64位 pyt ...
- java.net.UnknownHostException: lc001 未知的网络服务
java.net.UnknownHostException: lc001 未知的网络服务 读取的是虚拟机的名称 一.查询环境变量 :echo $HOSTNAME lc001 没什么问题 二.查host ...