Mybatis+Oracle批处理
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);
}
測试结果
以下是是本次案例的辅助代码
- 数据库脚本
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批处理的更多相关文章
- mybatis+oracle添加一条数据并返回所添加数据的主键问题
最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题 controller层 @RequestMapping("/addplan") public ...
- Mybatis oracle多表联合查询分页数据重复的问题
Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...
- (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中
利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目 Dao (jar) Service (jar) Controller (web) ...
- Mybatis + Oracle 批量insert的问题
这个问题真的太坑了 之前用ibatis+sql server 的foreach 很容易就写出来批量insert数据,但是测试后报错:SQL结束格式错误 现在换到银行工作,数据库也换成Oracle了 特 ...
- mybatis+oracle 完成插入数据库,并将主键返回的注意事项
mybatis+oracle 完成插入数据库,并将主键返回的注意事项一条插入语句就踩了不少的坑,首先我的建表语句是: create table t_openapi_batch_info( BATCH_ ...
- mybatis oracle两种方式批量插入数据
mybatis oracle两种方式批量插入数据 注意insert,一定要添加: useGeneratedKeys="false" ,否者会报错. <insert id=&q ...
- mybatis oracle mysql 批量插入时的坑爹问题--需谨记
mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from du ...
- spring+mybatis+oracle/mysql整合开发需要的jar包详解
导入spring,mybatis,c3p0,oracle和mybatis提供的与spring整合的插件包 mysql的jar: mysql-connector-java-5.1.7 ...
- 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 ...
随机推荐
- 入门到熟练-SpringBoot
Spring Boot概述 1.1. Spring Boot是什么 Spring Boot是一套基于Spring框架的微服务框架. 1.2. Spring Boot框架出现的背景 由于Spring是一 ...
- Asp.Net 为什么需要异步
之前看过别人提出为什么在本是多线程的Asp.Net下需要异步环境的时候,提出在Asp.Net环境下本身就是多线程,每个请求就是由一个专门IIS线程负责(咱不说Core下无IIS的情况).所以以此推论A ...
- 脱掉Golang的第一层衣裳 golang入坑系列
读前必读,博客园的文章并非最新,想看最新还是建议点击这里.博客园的文章是为了方便不能FQ的同学,同步而来的.不放在博客园,不是不支持国产,而是博客园的排版太难看了,太难看了,太难看了!而且还没有客户端 ...
- 31.Linux-wm9876声卡驱动(移植+测试)
本节学习目的 1)分析Linux中的OSS声卡系统 2)移植wm9876声卡 3)使用madplay应用程序播放mp3 1.声音三要素 采样频率 音频采样率是指录音设备在一秒钟内对声音信号的采样次数, ...
- No bean named 'sqlSessionFactory' is defined
其实程序给出这个错误已经很明确了,说你的sqlSessionFactory是未定义的. 首先你要查看一下自己的web.xml文件是否配置了application*.xml <!--设置sprin ...
- 学python3的书
<Python Cookbook>3rd Edition http://python3-cookbook.readthedocs.io/zh_CN/latest/copyright.htm ...
- 关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
轮播中大多会选择mouseover和mouseout 这个时候是没有任何问题的 但当遇到有css3动画的时候,会发现移入移出过快 动画还没加载完成就需要执行下一个动画,完了动画样式就错乱了. 这时候 ...
- unity3d资源打包总结
http://www.manew.com/blog-33734-12973.html unity 打包的时候会把下面几个文件资源打进apk或者ipa包里面 1. Asset下的所有脚本文件 2. As ...
- ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取
前文索引:ASP.NET Core教程[二]从保存数据看Razor Page的特有属性与服务端验证ASP.NET Core教程[一]关于Razor Page的知识 实体字段属性 再来看看我们的实体类 ...
- python之列表(list)的使用方法介绍
python之列表(list)介绍 在python的使用过程中,我们经常会用到列表,然而经常会遇到疑惑,下面我将详细介绍下列表使用方法. 一.列表 列表经常用到的功能使增.删.改和查功能. 1. 增 ...