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 ...
随机推荐
- RE: Javascript分页处理
背景: 调用PHP后端给的接口,以实现分页的功能.由于我是没造轮子的能力,所以翻了不少技术博客,经过整合才算完成整个分页功能.从一番查阅中,不难看出大概分为两种不同的分页: 一种是纯前端的,就是在一次 ...
- Layui框架+PHP打造个人简易版网盘系统
网盘系统 大家应该都会注册过致命的一些网盘~如百度云.百科介绍:网盘,又称网络U盘.网络硬盘,是由互联网公司推出的在线存储服务,服务器机房为用户划分一定的磁盘空间,为用户免费或收费提供文件的存储. ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- Servlet编程实例2
上次实验中利用HttpServletRespon.sendRedict()方法来实现页面的转跳,而这种重定向请求的方法无法传递缓存的内容. 所以为了做出改进,这次使用RequestDispatcher ...
- 一篇文章让你明白python的装饰器
在看闭包问题之前先来看看关于python中作用域的问题 变量作用域 对于上述代码中出现错误,肯定没什么疑问了,毕竟b并没有定义和赋值,当我们把代码更改如下后: 再看一个例子: 首先这个错误已经非常明显 ...
- 重构手法之Split Temporary Variable(分解临时变量)
返回总目录 本小节目录 Split Temporary Variable(分解临时变量) Remove Assignments to Parameters(移除对参数的赋值) 6.6Split Tem ...
- ecshop添加菜单以及权限分配
增加菜单并添加权限: admin/includes/inc_menu.php 添加 $modules['**_name1']['name2'] = 'your href' admin/includes ...
- SpringAware
哈哈,终于把分布式的课程演讲给混过去了,下面开始随便自己学点东西. 正题:SpringAware--------在实际项目中,用到spring容器的本省功能资源,这是Bean必须意识到Spring容器 ...
- Windows下安装BeautifulSoup
python版本为2.7 1.去官网下载BeautifulSoup4 Beautiful Soup 4.3.2 2.解压文件 将下载得到的压缩包解压到任意文件夹,路径不含中文 3.打开cmd命令提示符 ...
- 匿名HTTP透明HTTP高匿HTTP区别
透明代理的意思是客户端根本不需要知道有代理服务器的存在,但是它传送的仍然是真实的IP.你要想隐藏的话,不要用这个. 普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们 ...