您的位置:首页 > 数据库

mybatis高级版 利用动态sql片段加入 foreach 循环拼接 实现 单表批量查询、批量修改、批量删除、批量添加。

2019-03-21 12:43 796 查看
摘要
mybatis高级版  利用动态sql片段加入 foreach 循环拼接 实现 单表进行批量查询、批量修改、批量删除、批量添加。

第一步建表

以员工表单表为例
create table emp1(
id varchar2(20) primary key,
name varchar2(20)unique not null,
password varchar2(6) check(length(password)=6)not null,
salary number(8,2),
age varchar2(3),
sex varchar2(3) check(sex in('男','女')),
entryday date,
status varchar(2) check(status in('1','2'))
);

--创建 序列
create sequence empid_seq start with 1 increment by 1;

第二步创建库表对应的实体类

package com.entity;
import java.io.Serializable;
import java.util.Date;
//库表  Emp1 对应的实体 类
public class Empl1 implements Serializable {
private String id;
private String name;
private String password;
private double salary;
private String age;
private String sex;
//入职日期
private Date entryday;
private String status;
//有参无参 get/set tostring 方法此处省略
mybatis-config.xml 核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- 读入小配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 开启二级缓存(以及缓存默认打开) -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 给实体类起别名 -->
<typeAliases>
<typeAlias type="com.entity.Empl1" alias="Empl1" />
<typeAlias type="com.entity.Identification" alias="Identification"/>
</typeAliases>
<environments default="oracle">
<environment id="oracle">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>

<!-- 管理mapper文件 -->
<mappers>
<mapper resource="com/empdaotest/Emp1DaoImplTest.xml" />
</mappers>
</configuration>

创建 Dao 对应的接口 及mapper文件处理

一个方法对应一个文件 便于阅读

批量查询处理
对应接口中的方法:
package com.empdaotest;
import com.entity.Empl1;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface Emp1DaoTest {
//对应接口中的方法:
//测试批量查询
public List<Empl1> selects3(@Param("list")List<String> list);
}
对应mapeer文件实现的动态sql 语句
<!--将共有的查询结果进行提取 方便后期使用支架引用-->
<sql id="Empl1_sql3">
id,name,password,salary,age,sex,entryday,status
</sql>

<!-- 测试批量查询  仿照枚举查询 -->
<select id="selects3" resultType="Empl1">
select <include refid="Empl1_sql3"></include> from emp1
where id in
<foreach collection="list" open="(" item="id" separator="," close=")" >
#{id}
</foreach>
</select>

/**
解释说明:collection="list" 表示 传入的集合参数名称为list
item="id" 表示 根据id查询 此处id名称应于表格字段相同
*/

Test测试类

//测试批量查询
@Test
public void testselect3(){

List<String> arrayList = new ArrayList<String>();
arrayList.add("1");
arrayList.add("2");
List<Empl1> list = emp1DaoTest.selects3(arrayList);
for (Empl1 empl1 : list) {
System.out.println(empl1);

}
}
批量删除处理
接口同上
对应接口中的方法:
//根据 id 删除  利用动态sql 批量处理
public void deleteByIdsEmp1Dao1(@Param("list")List<String> list);
对应mapeer文件实现的动态sql 语句

<!-- 根据 id 批量 删除 -->
<delete id="deleteByIdsEmp1Dao1" >
delete  from emp1 where id  in
<foreach collection="list" open="(" item="id" separator="," close=")" >
#{id}
</foreach>
</delete>
批量插入处理
接口同上
对应接口中的方法:
//测试批量插入
public void addEmpl1all(@Param("list")List<Empl1> list);

对应mapeer文件实现的动态sql 语句

<!-- 测试批量插入 item="item" 中的item表示临时的对象名称引用 -->
<insert id="addEmpl1all" parameterType="Empl1" >
begin
<foreach collection="list" item="item" index="index" separator=";">
insert into emp1(id,name,password,salary,age,sex,entryday,status) values
(empid_seq.nextval,
#{item.name},
#{item.password},
#{item.salary},
#{item.age},
#{item.sex},
#{item.entryday},
#{item.status})
</foreach>
;end;
</insert>

Test测试:
//测试批量插入
@Test
public void addEmplistTest(){
List<Empl1> list = new ArrayList<Empl1>();

Empl1 empl1 = new Empl1 ();
String sex1="男";
empl1.setSex (sex1);
empl1.setName ("tttt");
empl1.setPassword ("123456");
empl1.setSalary (22.66);
empl1.setAge ("18");
empl1.setStatus ("2");
Date date = new Date ();
empl1.setEntryday (date);
list.add(empl1);

Empl1 empl2 = new Empl1 ();
String sex2="男";
empl2.setSex (sex2);
empl2.setName ("dd");
empl2.setPassword ("123456");
empl2.setSalary (22.66);
empl2.setAge ("18");
empl2.setStatus ("1");
Date date2 = new Date ();

empl2.setEntryday (date2);
list.add(empl2);

emp1DaoTest.addEmpl1all(list);
sqlSession.commit();
}
批量修改处理
接口同上
对应接口中的方法:
//测试批量修改
public void updateEmpl1all(@Param("list")List<Empl1> list);

对应mapeer文件实现的动态sql 语句

<!-- 测试批量修改  item="emp" 中 emp表示对象形参 -->
<update id="updateEmpl1all" parameterType="Empl1">
begin
<foreach collection="list" item="emp" index="index" separator=";">
update emp1 set
name=#{emp.name},salary=#{emp.salary},age=#{emp.age}
where id=#{emp.id}
</foreach>
;end;
</update>

Test测试:
//测试批量修改
@Test
public void updateAlllTest(){
List<Empl1> list = new ArrayList<Empl1>();
Empl1 empl1 = new Empl1();
empl1.setName("挑花开");
empl1.setAge("10");
empl1.setSalary(2000);
empl1.setId("21");

list.add(empl1);
Empl1 empl2 = new Empl1();
empl2.setName("美人");
empl2.setAge("20");
empl2.setSalary(2000);
empl2.setId("41");
list.add(empl2);
emp1DaoTest.updateEmpl1all(list);
sqlSession.commit();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐