Mybatis如何使用動態(tài)語句實現批量刪除(delete結合foreach)
下面我將演示如何使用動態(tài)語句批量刪除數據庫數據
本人在數據庫建了一張emp員工表(表的數據自己填充),表的結構如下:
批量刪除的核心代碼為,在實體映射文件中配置如下的代碼:
<!-- 批量刪除 --> <delete id="deleteMoreEmp" parameterType="int[]"> <!-- delete from emp where empno in(7789,7790) --> <!-- forEach : 用來循環(huán) collection : 用來指定循環(huán)的數據的類型 可以填的值有:array,list,map item : 循環(huán)中為每個循環(huán)的數據指定一個別名 index : 循環(huán)中循環(huán)的下標 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為本人創(chuàng)建的獲取sqlSession的工具類,Emp.java為實體類,Emp.xml為映射文件,mybatis_cfg.xml為mybatis主配置文件,Test.java為測試類,pom.xml為maven引入依賴的文件。
1、IEmpDAO.java為接口提供批量刪除數據方法
/** * 批量刪除 * * @param arr * @return */ public boolean doRemoveeMore(int[] arr);
2、EmpDAOImpl.java為接口的實現類
public boolean doRemoveeMore(int[] arr) { SqlSession sqlSession = null; try { sqlSession = MybatisSqlSessionFactory.getMySqlSession(); int result = sqlSession.delete("cn.sz.hcq.pojo.Emp.deleteMoreEmp", arr); sqlSession.commit(); return result > 0 ? true : false; } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); } finally { MybatisSqlSessionFactory.closeSqlSession(); } return false; }
3、MybatisSqlSessionFactory.java
為本人創(chuàng)建的獲取sqlSession的工具類
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>(); // 靜態(tài)代碼塊(類加載的時候執(zhí)行一次) 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(); // 連接為空則創(chuàng)建連接,并將該連接添加到本地線程中去 if (sqlSession == null) { if (factory == null) { rebuildFactory(); } sqlSession = factory.openSession(); } threadLocal.set(sqlSession); return sqlSession; } // 創(chuàng)建工廠 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為實體類
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.comm = comm; } public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } }
5、Emp.xml為映射文件
<?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 : 用來循環(huán) collection : 用來指定循環(huán)的數據的類型 可以填的值有:array,list,map item : 循環(huán)中為每個循環(huán)的數據指定一個別名 index : 循環(huán)中循環(huán)的下標 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主配置文件
<?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引入依賴的文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.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.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.3</version> </dependency> <!-- https://mvnrepository.com/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為測試類
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); } }
完成代碼后,運行測試類就可以完成批量刪除。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于rocketmq的有序消費模式和并發(fā)消費模式的區(qū)別說明
這篇文章主要介紹了基于rocketmq的有序消費模式和并發(fā)消費模式的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06