1. 批处理 插入

非常多时候都涉及到一系列数据的插入,通过mybatis的动态sql语句可以非常好的解决问题。当然。oracle已经提供了批插入的语句:

insert into students
select id,name ,email ,sdate from dual union
select id,name ,email ,sdate from dual union
select id,name ,email ,sdate from dual

利用mybatis动态sql语言的写法:

<!-- 集合 有集合类型  collection 可以指定 parameterType="list"  -->
<!-- 数组没有 array 的參数类型 collection="array" parameterType 指定是数组里面存放的数据类型 -->
<insert id="batchInsertStudents" parameterType="list">
insert into students
<foreach collection="list" separator=" union " item="stus">
select #{stus.id},#{stus.name},#{stus.email},#{stus.sdate} from dual
</foreach>
</insert>

以下看測试:

/**
* 批处理: 插入一组数据
*/
@Test
public void TestbatchInsertStudents(){
List<Student> stus=Arrays.asList(new Student[]{
new Student("Rindy_1",9770,"15211433541013",new Date()),
new Student("Rindy_2",97710,"1521143546392@163.com",new Date()),
new Student("Rindy_3",97720,"152114743366658",new Date()),
new Student("Rindy_4",97730,"1527395357437",new Date()),
new Student("Rindy_5",97740,"132126835435644",new Date()),
new Student("Rindy_6",97750,"152114524322140",new Date()),
new Student("Rindy_7",97760,"15873242923860",new Date()),
new Student("Rindy_8",97770,"15096242043460",new Date()) });
int rows=stum.batchInsertStudents( stus );
System.out.println( rows );
assertEquals(rows,8);
}

測试成功

批量删除:

<delete id="deleteStuById" parameterType="int">
delete from students where stud_id= #{id}
</delete>

測试成功

批量更新比較麻烦,我们先来回想一下 oracle的更新:

UPDATE 表名 set 列名 = 新值[, 列名 = 新值[…]] [WHERE condition_expression];

參数多组。批量操作可採用 case when then语句实现

<!-- 批处理: update students set xxx where id  -->
<update id="batchUpdateStudents02" parameterType="list">
update students
<set>
<foreach collection="list" item="stus" open="name = case " close="end,">
when stud_id=#{stus.id} then #{stus.name}
</foreach>
<foreach collection="list" item="stus" open="email = case " close="end,">
when stud_id=#{stus.id} then #{stus.email}
</foreach>
<foreach collection="list" item="stus" open="sdate = case " close="end,">
<!-- 容错处理。当属性值为空的时候。不更新 -->
<if test=" #{stus.sdate} !=null ">
when stud_id=#{stus.id} then #{stus.sdate}
</if>
</foreach> </set>
<foreach collection="list" open="where stud_id in(" separator="," item="stus" close=")">
#{stus.id}
</foreach> </update>

測试:

/**
* 批处理: 更新一组数据
*/
@Test
public void TestbatchUpdateStudents(){
List<Student> stus=Arrays.asList(new Student[]{
new Student("Rindy_1_update",9770,"15211423431013_update",new Date()),
new Student("Rindy_2_update",97710,"15211433446392@163.com",new Date()),
new Student("Rindy_3_update",97720,"1524321231476658_update",new Date()),
new Student("Rindy_4_update",97730,"1527395324327437_update",new Date()),
new Student("Rindy_5_update",97740,"13212268235644_update",new Date()),
new Student("Rindy_6_update",97750,"152114522432140_update",new Date()),
new Student("Rindy_7_update",97760,"1587233922433860_update",new Date()),
new Student("Rindy_8_update",97770,"1502496032443460_update",new Date()) });
int rows=stum.batchUpdateStudents02( stus );
System.out.println( rows );
assertEquals(rows,8);
}

測试结果

以下是是本次案例的辅助代码

  1. 数据库脚本
DROP TABLE STUDENTS;
drop sequence seq_stu_id; CREATE TABLE STUDENTS
(
stud_id integer PRIMARY KEY,
name varchar2(50) NOT NULL,
email varchar2(50) ,
sdate date
); create sequence seq_stu_id ; insert into students(name,email,dob) values('Student1','student1@gmail.com', to_date('1983-06-25', 'yyyy-MM-dd'); insert into students(name,email,dob) values('Student2','student2@gmail.com', to_date('1985-06-25', 'yyyy-MM-dd');

2.java entity

package com.rindy.maven.entity;

import java.util.Date;

public class Student {
private String name;
private Integer id;
private String email;
private Date sdate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getSdate() {
return sdate;
}
public void setSdate(Date sdate) {
this.sdate = sdate;
}
public Student(String name, Integer id, String email, Date sdate) {
super();
this.name = name;
this.id = id;
this.email = email;
this.sdate = sdate;
}
public Student() {
super();
} public Student(String name, String email, Date sdate) {
super();
this.name = name;
this.email = email;
this.sdate = sdate;
}
@Override
public String toString() {
return "Student [name=" + name + ", id=" + id + ", email=" + email
+ ", sdate=" + sdate + "] \n";
} }

3.MybatisUtil 工具类

package com.rindy.maven.utils;

import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class MybatisUtil {
private static Logger log=LoggerFactory.getLogger(MybatisUtil.class);
private static SqlSessionFactory factory;
static{
try {
log.debug("载入mybatis.xml的配置文件");
InputStream in =Resources.getResourceAsStream("mybatis.xml");
log.debug("载入mybatis.xml的配置文件成功"); log.debug("通过配置文件的数据构建sql session工厂");
factory=new SqlSessionFactoryBuilder().build(in);
log.debug("通过配置文件的数据构建sql session工厂 【成功】" ); log.debug("生产sqlsession 工厂对象");
} catch (IOException e) {
e.printStackTrace();
log.debug("载入mybatis.xml的配置文件失败",e);
} } public static SqlSession getSession(){
//原来这么些
//InputStream in=MybatisUtil.class.getClassLoader().getResourceAsStream("mybatis.xml"); //mybatis这么写
SqlSession session=null;
session=factory.openSession();
log.debug("生产sqlsession 工厂对象 成功");
return session;
} /**
*
* @param isAutoCommit :true: 自己主动提交事务, false 手动事务
* @return
*/
public static SqlSession getSession(boolean isAutoCommit){
SqlSession session=null;
session=factory.openSession( isAutoCommit );
log.debug("生产sqlsession 工厂对象 成功");
return session;
} }

sql语句注意常常复习。

Mybatis+Oracle批处理的更多相关文章

  1. mybatis+oracle添加一条数据并返回所添加数据的主键问题

    最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题 controller层 @RequestMapping("/addplan") public ...

  2. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  3. (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中

    利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目  Dao   (jar)   Service (jar)   Controller (web) ...

  4. Mybatis + Oracle 批量insert的问题

    这个问题真的太坑了 之前用ibatis+sql server 的foreach 很容易就写出来批量insert数据,但是测试后报错:SQL结束格式错误 现在换到银行工作,数据库也换成Oracle了 特 ...

  5. mybatis+oracle 完成插入数据库,并将主键返回的注意事项

    mybatis+oracle 完成插入数据库,并将主键返回的注意事项一条插入语句就踩了不少的坑,首先我的建表语句是: create table t_openapi_batch_info( BATCH_ ...

  6. mybatis oracle两种方式批量插入数据

    mybatis oracle两种方式批量插入数据 注意insert,一定要添加: useGeneratedKeys="false" ,否者会报错. <insert id=&q ...

  7. mybatis oracle mysql 批量插入时的坑爹问题--需谨记

    mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from du ...

  8. spring+mybatis+oracle/mysql整合开发需要的jar包详解

    导入spring,mybatis,c3p0,oracle和mybatis提供的与spring整合的插件包   mysql的jar:         mysql-connector-java-5.1.7 ...

  9. maven新建Spring MVC + MyBatis + Oracle的Web项目中pom.xml文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

随机推荐

  1. jQuery+ajax实现局部刷新

    在项目中,经常会用到ajax,比如实现局部刷新,比如需要前后端交互等,这里呢分享局部刷新的两种方法,主要用的是ajax里面的.load(),其他高级方法的使用以后再做详细笔记. 第一种: 当某几个页面 ...

  2. Python基础---python中的异常处理

    Python中的异常处理 一.什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) ...

  3. shell全自动登录远程终端

    先看效果 你需要做的事情,在配置文件中配置服务器信息,选择对应的服务器,进行连接. 传统手工连接 #密码方式 ssh user@ip # 然后输入服务器密码 #密钥登录 ssh -i identity ...

  4. vagrant扩容

    参考: https://gist.github.com/christopher-hopper/9755310 https://www.madcoder.cn/vagrant-box-resize.ht ...

  5. Database differential backup差异备份和还原

    完整备份: 备份全部选中的文件和文件夹,并不依赖文件的存档属性来确定备份哪些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性),完全备份也叫完整备份. 差异 ...

  6. jquery无new构建学习笔记

    当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是 ...

  7. Webstorm 快捷键大全 整理收录

    "工欲善其事,必先利其器" 作为一名开发人员,好用的工具能让你效率更高,剩下的时间用来偷懒吹牛逼吧... 以下整理Webstorm快捷键大全   Windows版本 注释(// 或 ...

  8. Jfinal启动原理及源码简析

    以下所有源码只截取了部分代码,标题即为类名 1.Web.xml <filter-name>jfinal</filter-name> <filter-class>co ...

  9. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  10. Go语言教程5 if switch select

    首先您需要有php或是c的基础. 否则可能看不明白 方法如下 if 表达式{ //需要注意的是  没有括号. 没错. 没有括号 比如  if  1>2 {}else{} } else { } s ...