Oracle的批量操作

Oracle不支持VALUES(),(),()这种方式,所以不能用上一节所讲的方法。

有时候业务会包含很多次数据库操作,为了减少数据库连接,我们会选择一次提交大量sql,

这时我们会用到begin end,使用begin end需要注意的是,每个sql语句都要确保以";"结尾,代表一句sql结束。

  1. begin  
  2. insert into tb_employee(id,last_name,email,gender,d_id) VALUES  
  3. (employee_seq.nextval,'Maya','mcl@qq.com','0',1);  
  4. insert into tb_employee(id,last_name,email,gender,d_id) VALUES  
  5. (employee_seq.nextval,'Kafka','kafsl@qq.com','0',2);  
  6. end;  

还可以利用中间表,进行批量插入,这部分不熟悉,先跳过,有兴趣的朋友可以深入了解一下,

  1. <insert id="addEmps">  
  2.     begin  
  3.     <foreach collection="emps" item="emp">  
  4.         insert into tb_employee(id,last_name,email,gender,d_id) VALUES  
  5.         (tb_employee_seq.nextval,#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id});  
  6.     </foreach>  
  7.     end
  8. </insert>  

内置参数

不只是方法传入的参数可以被用来判断、取值,我们还可以使用两个默认的内置参数:_parameter,_databaseId

_parameter:代表整个参数

单个参数:_ parameter就是这个参数

多个参数:参数会被封装成一个map; _parameter就是代表这个map

_databaseId:如果配置了<databaseIdProvider>标签,那么_databaseId就会有值

_databaseId就代表当前数据库的别名

  1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
  2.     <if test="_databaseId='mysql'">  
  3.         select * from tb_employee  
  4.     </if>  
  5.     <if test="_databaseId='oracle'">  
  6.         select * from tb_employee  
  7.     </if>  
  8. </select>  
  1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
  2.         select * from tb_employee  
  3.         <if test="_parameter!=null">  
  4.           where last_name = #{_parameter.lastName}  
  5.         </if>  
  6. </select>  

<bind>标签

这个标签可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值

举个例子,我们之前模糊查询的时候出入Employee对象时,要设定它的lastName为"%青%",也就是说这个%,是要认为拼接的,可是有些人,希望只写一个"青",让%由框架帮我们提供,那该怎么办?

  1.     <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
  2.         select * from tb_employee  
  3.         <if test="_parameter!=null">  
  4.           where last_name like `%#{ lastName}%` 
  5.         </if>  
  6. </select>  

这么写行不行?肯定不行,like后面是要作为整体传入数据库查询的,这时候${}就派上用场了,

  1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
  2.         select * from tb_employee  
  3.         <if test="_parameter!=null">  
  4.           where last_name like '%${ lastName}%'  
  5.         </if>  
  6. </select>  

由于${}不会进行预编译,所以它会将拼装完成的SQL语句传入数据库,这样就不会出问题了,当然这样不安全,所以我们希望还是使用#{},这样就不得不用<bind>标签了

  1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
  2.     <bind name="_lastName" value="'%'+ lastName+'%'"/>  
  3.     select * from tb_employee  
  4.     <if test="_parameter!=null">  
  5.         where last_name like #{_lastName}  
  6.     </if>  
  7. </select>

<sql>标签

用于抽取重用的sql语句,比如我们上面的例子中,下面的语句使用了多次,这时就可以考虑使用<sql>标签。

last_name,email,gender,d_id

  1. <sql id="column">  
  2.       last_name,email,gender,d_id  
  3. </sql>  

接着将原先是这句话的sql语句,用<include>标签替换

  1. <insert id="addEmps">  
  2.     <foreach collection="emps" item="emp" separator=";">  
  3.         INSERT INTO tb_employee(<include refid="column"></include>) VALUES  
  4.         (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})  
  5.     </foreach>  
  6. </insert>  
  1. @Test  
  2. public void TestSaveBach() throws IOException {  
  3.     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  
  4.     SqlSession openSession = sqlSessionFactory.openSession(true);  
  5.     Department department = new Department(2);  
  6.     Employee e1 = new Employee("Wendy","0","adcxs@qq.com",department);  
  7.     Employee e2 = new Employee("Diyago","1","aaasaadccjdjj@qq.con",department);  
  8.     List<Employee> employeeList = new ArrayList<>();  
  9.     employeeList.add(e1);  
  10.     employeeList.add(e2);  
  11.     try{  
  12.         EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);  
  13.         mapper.addEmps(employeeList);  
  14.     }finally {  
  15.         openSession.close();  
  16.     }  
  17. }  

我们还可以通过<property>标签,自定义一些属性

  1. <insert id="addEmps">  
  2.     <foreach collection="emps" item="emp" separator=";">  
  3.         INSERT INTO tb_employee(  
  4.             
  5.         <include refid="column">  
  6.             <property name="testColumn" value="test"/>  
  7.         </include>  
  8.         ) VALUES  
  9.         (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})  
  10.     </foreach>  
  11. </insert> 

注意这里是用${}取值的

  1. <sql id="column">  
  2.       last_name,email,gender,d_id,${testColumn}  
  3. </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的更多相关文章

  1. 存储过程中执行动态Sql语句

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  2. 怎样SQL存储过程中执行动态SQL语句

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  3. SqlServer:SqlServer(存储过程动态表查询(取消返回值),事务处理,批量还原sqlserver备份,强制删除被占用的数据库)

    1.存储过程动态表查询 USE [NETWORKING_AUDIT] GO /****** Object: StoredProcedure [dbo].[impConfigInfo] Script D ...

  4. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  5. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  6. Ubuntu 16.10 安装byzanz截取动态效果图工具

    1.了解byzanz截取动态效果图工具 byzanz能制作文件小,清晰的GIF动态效果图,不足就是,目前只能通过输入命令方式来录制. byzanz主要的参数选项有: -d, --duration=SE ...

  7. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  8. 【开源】.Net 动态脚本引擎NScript

    开源地址: https://git.oschina.net/chejiangyi/NScript 开源QQ群: .net 开源基础服务  238543768 .Net 动态脚本引擎 NScript   ...

  9. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

随机推荐

  1. 使用IntelliJ IDEA和Maven管理搭建Web开发环境(以Spring MVC为例)(二)

    前言:在使用IntelliJ IDEA和Maven管理搭建Web开发环境(以Spring MVC为例)(一)中已经介绍了如何对web基础环境进行搭建,这里主要演示,如何对spring环境进行搭建,然后 ...

  2. 2.03-handler_openner

    import urllib.request def handler_openner(): #系统的urlopen并没有添加代理的功能所以需要我们自定义这个功能 #安全 套接层 ssl第三方的CA数字证 ...

  3. 【转】【fiddler】抓取https数据失败,全部显示“Tunnel to......443”

    这个问题是昨天下午就一直存在的,知道今天上午才解决,很感谢“韬光养晦”. 问题描述: 按照网络上的教程,设置fiddler开启解密https的选项,同时fiddler的证书也是安装到系统中,但是抓取h ...

  4. 如何在关闭ssh连接的情况下,让进程继续运行?

    #screen 1 回车后进入Screen子界面,此时putty标题栏会指示处于子界面状态,然后运行你的程序 #应用程序名 1 然后按下Ctrl+A后抬起,然后按下d键,此时切换回主界面,Putty的 ...

  5. RS-485总线通信协议

    https://blog.csdn.net/ouyangxin95/article/details/78174145 RS-485总线技术只是规定了接口的电气标准,并没有规定RS-485接口的电缆,插 ...

  6. day2-安装python以及基本使用

    安装Python windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境变量 [右键计算机]- ...

  7. node.js api文档生成

    ApiDoc官网地址为:http://apidocjs.com/在Java中有Swagger及其升级版的Swagger2+Springfox自动生成接口管理文档.而在Node.js中则可以利用ApiD ...

  8. mysql从5.5直接升级到5.7后,执行mysql_upgrade速度很慢且执行结束后数据目录大小增加一倍及 mysqlpump备份出现1577错误

    mysql官网不支持夸大版本升级,比如跳过5.6直接升级到5.7,但由于一些客观原因,项目需要从5.5直接升级到5.7,以下是具体操作 1.备份之前mysql,(数据量少,可直接拷贝安装目录及data ...

  9. 环境部署(九):linux下安装python+chrome+Xvfb

    在基于selenium进行的UI自动化测试中,开发调试环境一般都是windows操作系统.完成后需要部署到专门的测试环境. 如要要部署到linux环境的服务器(阿里云.腾讯云)执行,那么测试脚本也需要 ...

  10. 设计模式(5)原型模式(Prototype)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 设 ...