好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mybatis如何使用动态语句实现批量删除(delete结合foreach)

下面我将演示如何使用动态语句批量删除数据库数据

本人在数据库建了一张emp员工表(表的数据自己填充),表的结构如下:

批量删除的核心代码为,在实体映射文件中配置如下的代码:

?

1

2

3

4

5

6

7

8

9

10

11

<!-- 批量删除 -->

     < delete id = "deleteMoreEmp" parameterType = "int[]" >

         <!-- delete from emp where empno in(7789,7790) -->

         <!-- forEach : 用来循环 collection : 用来指定循环的数据的类型 可以填的值有:array,list,map item

             : 循环中为每个循环的数据指定一个别名 index : 循环中循环的下标 open : 开始 close : 结束 separator : 数组中元素之间的分隔符 -->

         delete from emp where empno in

         < foreach collection = "array" item = "arr" index = "no" open = "("

             separator = "," close = ")" >

             #{arr}

         </ foreach >

     </ delete >

下面是项目的结构

本人使用的是maven搭建的web项目

IEmpDAO.java为接口提供批量删除数据方法,EmpDAOImpl.java为接口的实现类,MybatisSqlSessionFactory.java为本人创建的获取sqlSession的工具类,Emp.java为实体类,Emp.xml为映射文件,mybatis_cfg.xml为mybatis主配置文件,Test.java为测试类,pom.xml为maven引入依赖的文件。

1、IEmpDAO.java为接口提供批量删除数据方法

?

1

2

3

4

5

6

7

/**

      * 批量删除

      *

      * @param arr

      * @return

      */

     public boolean doRemoveeMore( int [] arr);

2、EmpDAOImpl.java为接口的实现类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public boolean doRemoveeMore( int [] arr) {

     SqlSession sqlSession = null ;

     try {

         sqlSession = MybatisSqlSessionFactory.getMySqlSession();

         int result = sqlSession.delete( "cn.sz.hcq.pojo.Emp.deleteMoreEmp" ,

                 arr);

         sqlSession测试数据mit();

         return result > 0 ? true : false ;

     } catch (Exception e) {

         e.printStackTrace();

         sqlSession.rollback();

     } finally {

         MybatisSqlSessionFactory.closeSqlSession();

     }

     return false ;

}

3、MybatisSqlSessionFactory.java

为本人创建的获取sqlSession的工具类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

package cn.sz.hcq.factory;

import java.io.IOException;

import java.io.Reader;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

 

public class MybatisSqlSessionFactory {

     // 配置文件

     private static final String RESOURCE = "mybatis_cfg.xml" ;

     private static Reader reader = null ;

     private static SqlSessionFactoryBuilder builder = null ;

     private static SqlSessionFactory factory = null ;

     // 可以在同一个线程范围内,共享一个对象

     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();

 

     // 静态代码块(类加载的时候执行一次)

     static {

         try {

             reader = Resources.getResourceAsReader(RESOURCE);

             builder = new SqlSessionFactoryBuilder();

             factory = builder.build(reader);

         } catch (IOException e) {

             e.printStackTrace();

         }

     }

 

     public static SqlSession getMySqlSession() {

         // 从本地线程中获取session连接

         SqlSession sqlSession = threadLocal.get();

         // 连接为空则创建连接,并将该连接添加到本地线程中去

         if (sqlSession == null ) {

             if (factory == null ) {

                 rebuildFactory();

             }

             sqlSession = factory.openSession();

         }

         threadLocal.set(sqlSession);

         return sqlSession;

     }

 

     // 创建工厂

     public static void rebuildFactory() {

         try {

             reader = Resources.getResourceAsReader(RESOURCE);

             builder = new SqlSessionFactoryBuilder();

             factory = builder.build(reader);

         } catch (IOException e) {

             e.printStackTrace();

         }

     }

 

     // 关闭连接

     public static void closeSqlSession() {

         SqlSession sqlSession = threadLocal.get();

         if (sqlSession != null ) {

             // 关闭session

             sqlSession.close();

         }

         // 同时将本地线程中置为null(防止用户再次调用时出现空的session)

         threadLocal.set( null );

     }

}

4、Emp.java为实体类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

public class Emp implements Serializable {

     private Integer empno;

     private String ename;

     private String job;

     private Integer mgr;

     private Date hiredate;

     private Double sal;

     private Double comm;

     private Integer deptno;

     public Integer getEmpno() {

         return empno;

     }

 

     public void setEmpno(Integer empno) {

         this .empno = empno;

     }

 

     public String getEname() {

         return ename;

     }

 

     public void setEname(String ename) {

         this .ename = ename;

     }

 

     public String getJob() {

         return job;

     }

 

     public void setJob(String job) {

         this .job = job;

     }

 

     public Integer getMgr() {

         return mgr;

     }

 

     public void setMgr(Integer mgr) {

         this .mgr = mgr;

     }

 

     public Date getHiredate() {

         return hiredate;

     }

 

     public void setHiredate(Date hiredate) {

         this .hiredate = hiredate;

     }

 

     public Double getSal() {

         return sal;

     }

 

     public void setSal(Double sal) {

         this .sal = sal;

     }

 

     public Double getComm() {

         return comm;

     }

 

     public void setComm(Double comm) {

         this 测试数据m = comm;

     }

 

     public Integer getDeptno() {

         return deptno;

     }

 

     public void setDeptno(Integer deptno) {

         this .deptno = deptno;

     }

}

5、Emp.xml为映射文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<? xml version = "1.0" encoding = "UTF-8" ?>

  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

< mapper namespace = "cn.sz.hcq.pojo.Emp" >

     <!-- 批量删除 -->

     < delete id = "deleteMoreEmp" parameterType = "int[]" >

         <!-- delete from emp where empno in(7789,7790) -->

         <!-- forEach : 用来循环 collection : 用来指定循环的数据的类型 可以填的值有:array,list,map item

             : 循环中为每个循环的数据指定一个别名 index : 循环中循环的下标 open : 开始 close : 结束 separator : 数组中元素之间的分隔符 -->

         delete from emp where empno in

         < foreach collection = "array" item = "arr" index = "no" open = "("

             separator = "," close = ")" >

             #{arr}

         </ foreach >

     </ delete >

</ mapper >

6、mybatis_cfg.xml为mybatis主配置文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<? 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 >

     <!--数据源 -->

     < environments default = "myconn" >

         < environment id = "myconn" >

             <!--事务管理方式 -->

             < transactionManager type = "JDBC" ></ transactionManager >

             <!--数据库连接参数 -->

             < dataSource type = "POOLED" >

                 <!-- type:数据源连接的方式 ,POOLED:连接池方式, UNPOOLED: 非连接池的方式 ,JNDI:java命名与目录接口方式 -->

                 < property name = "driver" value = "org.gjt.mm.mysql.Driver" ></ property >

                 < property name = "url" value = "jdbc:mysql://localhost:3306/db" ></ property >

                 < property name = "username" value = "root" ></ property >

                 < property name = "password" value = "root" ></ property >

             </ dataSource >

         </ environment >

     </ environments >

 

     <!-- 引入实体映射文件 -->

     < mappers >

         < mapper resource = "cn/sz/hcq/pojo/Emp.xml" />

     </ mappers >

     <!-- 配置的参数 -->

</ configuration >

7、pom.xml为maven引入依赖的文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://HdhCmsTestw3.org/2001/XMLSchema-instance"

     xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >

     < modelVersion >4.0.0</ modelVersion >

     < groupId >cn.sz.hcq.pro</ groupId >

     < artifactId >Mybatis_04</ artifactId >

     < version >0.0.1-SNAPSHOT</ version >

     < packaging >war</ packaging >

     < dependencies >

         <!-- https://mvnrepository测试数据/artifact/org.mybatis/mybatis -->

         < dependency >

             < groupId >org.mybatis</ groupId >

             < artifactId >mybatis</ artifactId >

             < version >3.2.3</ version >

         </ dependency >

         <!-- https://mvnrepository测试数据/artifact/mysql/mysql-connector-java -->

         < dependency >

             < groupId >mysql</ groupId >

             < artifactId >mysql-connector-java</ artifactId >

             < version >5.1.39</ version >

         </ dependency >

     </ dependencies >

</ project >

8、Test.java为测试类

?

1

2

3

4

5

6

7

8

9

public class Test {

     public static void main(String[] args) {

         IEmpDAO empDAO = new EmpDAOImpl();

         System.out.println( "----------批量删除----------" );

         int [] arr = { 7791 , 7792 }; //删除的主键

         boolean removeeMore = empDAO.doRemoveeMore(arr);

         System.out.println( "批量删除的结果:" + removeeMore);

     }

}

完成代码后,运行测试类就可以完成批量删除。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/benxiaohai888/article/details/78564751

查看更多关于Mybatis如何使用动态语句实现批量删除(delete结合foreach)的详细内容...

  阅读:22次