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. 使用js获取数组中最大、最小的数字

    1.查询最大值 var maxValue=Math.max.apply(Math,array); 2.查询最小值 var minValue=Math.min.apply(Math,array);

  2. 用大白话扯扯那"神奇"的面向对象编程思维(一)

    前言: 每当提到面向对象的时候,初学者肯定都是一脸懵逼的状态,到底什么是面向对象?会用面向对象后有什么牛逼之处吗?不会用是不是就会死掉?答案肯定不会死掉,我们可以来简单的举一 个栗子 1.当你想到熊猫 ...

  3. java继承系列之添加一个LinkLable类

    import java.awt.*; import javax.swing.*; import javax.swing.JFrame; import java.awt.event.WindowList ...

  4. [转载] Java NIO教程

    转载自并发编程网 – ifeve.com http://ifeve.com/java-nio-all/ 关于通道(Channels).缓冲区(Buffers).选择器(Selectors)的故事. 从 ...

  5. 前端面试题系列(1):doctype作用 标准模式与兼容模式

    1.doctype作用 <!DOCTYPE>声明位于HTML文档的第一行.处于<HTML>标签之前.告知浏览器的解析器用什么文档标准解析这个文档.DOCYTYPE不存在或格式不 ...

  6. SpringMVC---Method

    GET 平时网页的一些基本的URL都是GET请求的,用于执行查询操作. 但是由于GET中URL是有长度的限制的,而GET会把所有的参数都放在URL中 因此就会有下面的问题: 1 数据都明文暴露,用户可 ...

  7. 激光相机数据融合(5)--Gazebo仿真数据融合

    这一节将用ROS+Gazebo 环境获取激光获取点云,并用PCL和OPENCV处理,源代码在:https://github.com/ZouCheng321/5_laser_camera_sim 由于激 ...

  8. iOS获取所有机型

    1.手机系统版本:9.1 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSSt ...

  9. Java实现Html转PDF的方法

    写在前面 以下路径问题根据项目结构自己修改,以下是我使用spring boot打成jar包的写法. 一.需求背景 在前端编辑器中输入任意的文本,包括css样式变化,保存为html文本.通过Java后台 ...

  10. gulp 小坑一个

    学习gulp的时候,看到很多人写到 gulp.task('styles', function() { return gulp.src('src/styles/main.scss') .pipe(sas ...