Mybatis如何使用動(dòng)態(tài)語句實(shí)現(xiàn)批量刪除(delete結(jié)合foreach)
下面我將演示如何使用動(dòng)態(tài)語句批量刪除數(shù)據(jù)庫數(shù)據(jù)
本人在數(shù)據(jù)庫建了一張emp員工表(表的數(shù)據(jù)自己填充),表的結(jié)構(gòu)如下:

批量刪除的核心代碼為,在實(shí)體映射文件中配置如下的代碼:
<!-- 批量刪除 -->
<delete id="deleteMoreEmp" parameterType="int[]">
<!-- delete from emp where empno in(7789,7790) -->
<!-- forEach : 用來循環(huán) collection : 用來指定循環(huán)的數(shù)據(jù)的類型 可以填的值有:array,list,map item
: 循環(huán)中為每個(gè)循環(huán)的數(shù)據(jù)指定一個(gè)別名 index : 循環(huán)中循環(huán)的下標(biāo) open : 開始 close : 結(jié)束 separator : 數(shù)組中元素之間的分隔符 -->
delete from emp where empno in
<foreach collection="array" item="arr" index="no" open="("
separator="," close=")">
#{arr}
</foreach>
</delete>下面是項(xiàng)目的結(jié)構(gòu)
本人使用的是maven搭建的web項(xiàng)目

IEmpDAO.java為接口提供批量刪除數(shù)據(jù)方法,EmpDAOImpl.java為接口的實(shí)現(xiàn)類,MybatisSqlSessionFactory.java為本人創(chuàng)建的獲取sqlSession的工具類,Emp.java為實(shí)體類,Emp.xml為映射文件,mybatis_cfg.xml為mybatis主配置文件,Test.java為測(cè)試類,pom.xml為maven引入依賴的文件。
1、IEmpDAO.java為接口提供批量刪除數(shù)據(jù)方法
/** * 批量刪除 * * @param arr * @return */ public boolean doRemoveeMore(int[] arr);
2、EmpDAOImpl.java為接口的實(shí)現(xiàn)類
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;
// 可以在同一個(gè)線程范圍內(nèi),共享一個(gè)對(duì)象
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
// 靜態(tài)代碼塊(類加載的時(shí)候執(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();
}
}
// 關(guān)閉連接
public static void closeSqlSession() {
SqlSession sqlSession = threadLocal.get();
if (sqlSession != null) {
// 關(guān)閉session
sqlSession.close();
}
// 同時(shí)將本地線程中置為null(防止用戶再次調(diào)用時(shí)出現(xiàn)空的session)
threadLocal.set(null);
}
}4、Emp.java為實(shí)體類
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)的數(shù)據(jù)的類型 可以填的值有:array,list,map item
: 循環(huán)中為每個(gè)循環(huán)的數(shù)據(jù)指定一個(gè)別名 index : 循環(huán)中循環(huán)的下標(biāo) open : 開始 close : 結(jié)束 separator : 數(shù)組中元素之間的分隔符 -->
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> <!--數(shù)據(jù)源 --> <environments default="myconn"> <environment id="myconn"> <!--事務(wù)管理方式 --> <transactionManager type="JDBC"></transactionManager> <!--數(shù)據(jù)庫連接參數(shù) --> <dataSource type="POOLED"> <!-- type:數(shù)據(jù)源連接的方式 ,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> <!-- 引入實(shí)體映射文件 --> <mappers> <mapper resource="cn/sz/hcq/pojo/Emp.xml" /> </mappers> <!-- 配置的參數(shù) --> </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為測(cè)試類
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("批量刪除的結(jié)果:" + removeeMore);
}
}
完成代碼后,運(yùn)行測(cè)試類就可以完成批量刪除。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot配置文件的語法規(guī)則詳解(properties和yml)
這篇文章主要介紹了Spring?Boot配置文件的語法規(guī)則,主要介紹兩種配置文件的語法和格式,properties和yml,對(duì)于配置文件也有獨(dú)立的文件夾存放,主要用來存放一些需要經(jīng)過變動(dòng)的數(shù)據(jù)(變量值),感興趣的朋友跟隨小編一起看看吧2024-07-07
java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例
這篇文章主要介紹了java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Eclipse 項(xiàng)目出現(xiàn)錯(cuò)誤(紅色嘆號(hào))解決方法
這篇文章主要介紹了Eclipse 項(xiàng)目出現(xiàn)錯(cuò)誤(紅色嘆號(hào))解決方法的相關(guān)資料,需要的朋友可以參考下2017-06-06
詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別
這篇文章主要介紹了詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別,這也是Java面試題目中的???需要的朋友可以參考下2015-11-11
java語言自行實(shí)現(xiàn)ULID過程底層原理詳解
這篇文章主要為大家介紹了java語言自行實(shí)現(xiàn)ULID過程底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
使用Spring Data JPA的坑點(diǎn)記錄總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于使用Spring Data JPA的一些坑點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Java項(xiàng)目如何打包成Jar的實(shí)現(xiàn)步驟
一般情況下我們都是使用Java項(xiàng)目直接部署發(fā)布,有時(shí)需要我們將寫好的項(xiàng)目打成jar包,方便后期調(diào)用,本文主要介紹了Java項(xiàng)目如何打包成Jar,感興趣的可以了解一下2023-11-11

