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

摘要
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();
	}		


版权声明:本文为qq_44025656原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。