MyBatis 增删改查 + 批量删除完整总结(含 @Param 和 foreach) 学习完Mybatis的基本操作流程之后,因为Mybatis本身就是用Java操作数据库的一项技术,我们躲不掉的要学习在Mybatis中怎么对数据库进行增删改查。接下来直接上实战:
一、Mapper 接口(UserMapper.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 package org.example.mapper;import org.example.pojo.User;import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper { List<User> findAll () ; User findById (Integer id) ; int insert (User user) ; int update (User user) ; int deleteById (Integer id) ; int deleteByIds (@Param("ids") List<Integer> ids) ; }
注意 :
返回值类型 int 表示影响的行数,有助于判断操作是否成功。
批量删除的参数用 @Param("ids") 注解,供 XML 中的 foreach 引用。
二、XML 映射文件(UserMapper.xml) 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 <?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 ="org.example.mapper.UserMapper" > <select id ="findAll" resultType ="org.example.pojo.User" > SELECT * FROM user </select > <select id ="findById" resultType ="org.example.pojo.User" > SELECT * FROM user WHERE id = #{id} </select > <insert id ="insert" useGeneratedKeys ="true" keyProperty ="id" > INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert > <update id ="update" > UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update > <delete id ="deleteById" > DELETE FROM user WHERE id = #{id} </delete > <delete id ="deleteByIds" > DELETE FROM user WHERE id IN <foreach collection ="ids" item ="id" open ="(" separator ="," close =")" > #{id} </foreach > </delete > </mapper >
foreach 标签说明
collection="ids":对应接口中 @Param("ids") 的名字。
item="id":循环中每个元素的临时变量名。
open="(" close=")":生成 IN ( ... ) 的括号。
separator=",":多个值之间的逗号。
三、测试类(MyBatisTest.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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 package org.example;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.example.mapper.UserMapper;import org.example.pojo.User;import java.io.InputStream;import java.util.Arrays;import java.util.List;public class MyBatisTest { private static SqlSessionFactory factory; static { try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml" ); factory = new SqlSessionFactoryBuilder ().build(is); } catch (Exception e) { e.printStackTrace(); } } public static void main (String[] args) { testInsert(); testUpdate(); testDeleteById(); testDeleteByIds(); testFindAll(); } private static void testInsert () { try (SqlSession session = factory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = new User (); user.setName("王五" ); user.setAge(28 ); int rows = mapper.insert(user); session.commit(); System.out.println("插入影响行数:" + rows); System.out.println("自动生成的id:" + user.getId()); } } private static void testUpdate () { try (SqlSession session = factory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = new User (); user.setId(1 ); user.setName("张三丰" ); user.setAge(99 ); int rows = mapper.update(user); session.commit(); System.out.println("修改影响行数:" + rows); } } private static void testDeleteById () { try (SqlSession session = factory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); int rows = mapper.deleteById(2 ); session.commit(); System.out.println("单条删除影响行数:" + rows); } } private static void testDeleteByIds () { try (SqlSession session = factory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); List<Integer> idsToDelete = Arrays.asList(1 , 3 ); int rows = mapper.deleteByIds(idsToDelete); session.commit(); System.out.println("批量删除影响行数:" + rows); } } private static void testFindAll () { try (SqlSession session = factory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); List<User> list = mapper.findAll(); System.out.println("当前用户列表:" ); list.forEach(System.out::println); } } }
注意 :
此处的测试类与上次的不同的是,main方法上有一段静态代码块,与第一篇文章的代码功能一样,环境准备,由于在这篇文章中对数据库的操作很多,为了提高性能,只做一次的环境准备。
将三个文件的内容编写好后,运行测试类,运行结果如下:
四、核心知识点回顾 1. 参数传递:@Param
当 Mapper 方法有多个参数,或者参数在 XML 中需要明确命名时,使用 @Param("别名")。
例如:int deleteByIds(@Param("ids") List<Integer> ids);,XML 中用 #{ids} 引用。 这个注解的意思就是给一个装id的盒子命名,提高代码的可读性。
2. 批量操作:<foreach>
遍历集合生成动态 SQL,常用于 IN 子句或批量插入。
属性:collection(集合名)、item(元素变量)、open、close、separator。 这些属性就做一个事,把SQL拼接出来,比如DELETE FROM user WHERE id IN (1, 3, 5)
3. 获取自增主键
<insert useGeneratedKeys="true" keyProperty="实体类属性名">
插入后,原实体对象会自动被赋予生成的主键值。
4. 事务提交
增、删、改必须调用 session.commit() 才会真正写入数据库。
如果忘记提交,数据不会变化,且不会报错。
五、最后的话 关于在Mybatis上怎么对数据库进行增删改查,我们就学到这了,感谢您的查阅!!!