MyBatis
1、快速入门
MyBatis中文手册官网MyBatis中文网
1.1、创建数据表添加数据
create table user(
id int auto_increment primary key comment '主键id',
name varchar(20) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别(1:男, 2:女)',
phone char(11) comment '手机号'
) comment '用户基本信息表';
insert into user values (null '糖锅', 20, '1', '12011011934'),
(null '糖解', 19, '2', '12011564514'),
(null '糖魅', 27, '2', '19631011934'),
(null '糖仁', 32, '1', '19018451934');
1.2、创建模块,导入坐标
1、新建一个项目,项目名字随意
2、鼠标右击项目,选择新建模块
3、设置模块信息
5、在pom.xml中添加如下配置信息
<dependencies>
<!--MyBatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--MySQL的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--junit 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--添加slf4j日志api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-parent</artifactId>
<version>1.7.20</version>
</dependency>
<!--添加logback-classic依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--添加logback-core依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
1.3、编写MyBatis核心配置文件,替换连接信息,解决代码中硬编码问题
1、鼠标右击resources新建File文件,文件名字为mybatis-config.xml
2、在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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库信息,根据自己情况配置-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--mybatis为连接的数据库名-->
<property name="url" value="jdbc:mysql:///test?useSSL=false"/>
<!--填写数据库用户名-->
<property name="username" value="root"/>
<!--填写数据库密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载mapper的映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
1.4、编写SQL映射文件,统一管理SQL语句,解决硬编码问题
1、鼠标右击resources新建File文件,文件名字为UserMapper.xml
2、在UserMapper.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">
<!--
namespace:名称空间
-->
<mapper namespace="test">
<select id="selectAll" resultType="com.tg.pojo.User">
select * from user;
</select>
</mapper>
1.5、日志文件配置(看个人情况)
这里我简单配置一个日志文件
1、鼠标右击resources新建File文件,文件名字为logback.xml
2、根据自己情况配置自己的日志文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>C:/code/itheima-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
具体步骤:
1、定义POJO类
鼠标右击java,创建包com.tg.pojo,在包下创建类User
public class User {
private int id;
private String name;
private int age;
private int gender;
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", phone='" + phone + '\'' +
'}';
}
}
在java中创建类MyBatisTest1类进行如下操作
-
加载核心配置文件,获取SqlSessionFactory对象
-
获取SqlSession对象,执行SQL语句
-
释放资源
/**
* MyBatis测试类
*/
public class MyBatisTest1 {
public static void main(String[] args) throws IOException {
//加载MyBatis核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象,用它来执行Sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行Sql语句
List<Object> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
//释放资源
sqlSession.close();
}
}
2、Mapper代理开发
2.1、目的
解决原生方式中的硬编码问题
简化后期SQL
2.2、具体步骤
1、定义与SQL映射文件同名的Mapper接口,并将Mapper接口和SQL映射文件放置在同一目录下
-
鼠标右击java,创建包com.tg.mapper,在包中创建接口UserMapper
-
鼠标右击resources,创建文件夹com/tg/mapper,将UserMapper.xml转移到该文件夹中
- 修改UserMapper.xml中的namespace=“com.tg.mapper.UserMapper”
- 修改mabatis-config.xml中的mapper映射为resource=“com/tg/mapper/UserMapper.xml”
2、在Mapper接口中定义方法,方法名就是SQL映射文件中Sql语句的id,并保持参数类型和返回值类型一致
public interface UserMapper {
List<User> selectAll();
}
4、编码
在java中创建类MyBatisTest2
-
通过SqlSession对象的gerMapper方法获取Mapper接口的代理对象
-
调用对应的方法完成Sql的执行
如果Mapper接口名称和SQL映射文件名称相同,并在统一目录下,则可以使用包扫描的方式简化SQL映射文件加载
上述红色信息意思就是,可以在mabatis-config.xml使用**< package name=“com.tg.mapper”/>代替< mapper resource=“com/tg/mapper/UserMapper.xml”/>**
代码示例:
/**
* MyBatis测试类
*/
public class MyBatisTest2 {
public static void main(String[] args) throws IOException {
//加载MyBatis核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象,用它来执行Sql
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println(users);
//释放资源
sqlSession.close();
}
}
3、MyBatis核心配置文件详解
3.1、MyBatis核心配置文件的顶层结构
配置各个标签时,需要遵守前后顺序
示例,我们在MyBatis的配置文件中添加别名配置
<typeAliases>
<package name="com.tg.pojo"/>
</typeAliases>
当我们添加此配置之后我们可以在Sql映射文件中简写刚才数据查询的返回值为user或者User
当然我们还可以配置多个数据源
示例:
<!--环境配置,可根据需要配置多个,通过对应的default属性切换不同的environment-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库信息,根据自己情况配置-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
4、MyBatis文件完成增删改查
4.1、环境准备
建立数据库表tb_brand
CREATE TABLE tb_brand (
id int NOT NULL AUTO_INCREMENT COMMENT 'id主键',
brand_name varchar(20) DEFAULT NULL COMMENT '品牌名称',
company_name varchar(20) DEFAULT NULL COMMENT '企业名称',
ordered int DEFAULT NULL COMMENT '排序字段',
escription varchar(200) DEFAULT NULL COMMENT '描述信息',
status int DEFAULT NULL COMMENT '状态:0-禁用、1-启用',
PRIMARY KEY (`id`)
) COMMENT '品牌信息表';
创建实体类
public class Brand {
private Integer id;
private String brandName;
private String companyName;
private Integer ordered;
private String description;
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "Brand{" +
"id=" + id +
", brandName='" + brandName + '\'' +
", companyName='" + companyName + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
创建测试类com.tg.test.BrandTest
安装MyBatisX插件
具体步骤:依次点击File>>Settings>>plugins>>搜索MybatisX>>INSTALL>>重启IDEA就欧克啦
4.2、需要完成的功能
4.2.1、查询
查询所有数据
-
编写接口方法:Mapper接口
参数:无
结果:List< Brand>
public interface BrandMapper {
List<Brand> selectAll();
}
- 编写SQL语句:SQL映射文件
<?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">
<!--
namespace:名称空间
-->
<mapper namespace="com.tg.mapper.BrandMapper">
<select id="selectAll" resultType="brand">
select *
from tb_brand;
</select>
</mapper>
- 执行测试方法
public class BrandTest {
@Test
public void testBrandSelectAll() throws IOException {
//获取SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//基于SqlSessionFactory对象获取SqlSession对象
SqlSession ss = ssf.openSession();
//基于SqlSession对象获取Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
//执行SQL
List<Brand> list = mapper.selectAll();
for (Brand brand : list) {
System.out.println(brand);
}
//释放资源
ss.close();
}
}
当我们执行完成后会发现一些小问题
怎么会有null值呢?!
原来是因为我们数据库表的字段名和实体类的属性名不一样造成的,那有什么解决办法吗,🤭嘿嘿,当然是有的:
起别名,重新书写SQL映射文件中的查询语句
select id, brand_name as brandName, company_name as companyName, ordered, description, status
from tb_brand;
或者书写一个sql片段
不过上述两种方式不是很灵活的感觉,所以我们经常使用的是resultMap来解决此类问题
其中resultMap标签中的id可以是任意名字,type是返回值类型,resultMap标签中的result标签 column是数据库表中的字段名,property是实体类中的属性名,记得还要把select标签中原来的resultType换成resultMap并且赋值,其值为resultMap标签中的id名。
查看
-
编写接口方法:Mapper接口
参数:id
结果:brand
Brand selectById(int id);
- 编写SQL语句:SQL映射文件
<!--paramaterType可以省略不写-->
<select id="selectById" parameterType="int" resultMap="brandResultMap">
select
*
from tb_brand
where id = #{id};
<!--
参数占位符
1、#{}:会被替换成?,防止sql注入
2、${}:存在注入问题
-->
</select>
在进行sql语句编写的过程中我们会遇到一些特殊字符比如”<“,这时候我们需要进行特殊字符处理,保证程序能够成功运行。
特殊字符处理:
转义字符:例如小于符号写成<
CDATA区:小于符号可以写成
select *
form table1
where id
<![CDATA[
<
]]>#{id};
- 执行方法
public class BrandTest1 {
@Test
public void testSelectDescription() throws IOException {
//创建SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//基于SqlSessionFactory对象创建SqlSession对象
SqlSession ss = ssf.openSession();
//基于SqlSession对象创建Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
//执行sql
Brand brand = mapper.selectById(1);
System.out.println(brand);
//释放资源
ss.close();
}
}
条件查询
1、所条件查询
-
编写接口方法:Mapper接口
参数:所有查询条件
结果:List< Brand>
//第一种方式
//List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName,@Param("brandName")String brandName);
//第二种方式
//List<Brand> selectByCondition(Brand brand);
//第三种方式
List<Brand> selectByCondition(Map map);
- 编写SQL语句:SQL映射文件
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
where
status = #{status}
and company_name like #{companyName}
and brand_name like #{brandName};
</select>
- 执行方法,测试
public class BrandTest2 {
@Test
public void testSelectByCondition() throws IOException {
//接受参数
int status = 1;
String companyName = "华锅";
String brandName = "华";
//参数处理
companyName = "%" + companyName + "%";
brandName = "%" + brandName + "%";
//创建Brand对象
// Brand brand = new Brand();
// brand.setStatus(status);
// brand.setBrandName(brandName);
// brand.setCompanyName(companyName);
//创建Map集合
Map map = new HashMap();
map.put("status", status);
map.put("companyName", companyName);
map.put("brandName", brandName);
//创建SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//根据SqlSessionFactory对象创建SqlSession对象
SqlSession ss = ssf.openSession();
//根据SqlSession对象创建Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
//查询
//List<Brand> brands = mapper.selectByCondition(status, companyName, brandName);
//List<Brand> brands = mapper.selectByCondition(brand);
List<Brand> brands = mapper.selectByCondition(map);
for (Brand br : brands) {
System.out.println(br);
}
//释放资源
ss.close();
}
}
2、动态条件查询
SQL语句会随着用户的输入或者外部条件的变化而变化,我们称之为动态SQL
MyBatis对动态SQL有很强大的支撑
- if
- choose(when, otherwise)
- trim(where, set)
- foreach
示例:我们修改上面多条件查询中的SQL映射文件就可以实现动态多条件查询了
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
<where>
<if test="status != null">
and status = #{status}
</if>
<if test="companyName != null and companyName != '' ">
and company_name like #{companyName}
</if>
<if test="brandName != null and brandName != '' ">
and brand_name like #{brandName}
</if>
</where>
</select>
单条件的动态条件查询:
choose(when, otherwise):选择,类似于java中的switch语言
<select id="selectBySingle" resultMap="brandResultMap">
select *
from tb_brand
<where>
<choose>
<when test="status != null">
status = #{status}
</when>
<when test="companyName != null and companyName != '' ">
company_name like #{companyName}
</when>
<when test="brandName != null and brandName != '' ">
brand_name like #{brandName}
</when>
</choose>
</where>
</select>
4.2.2、添加
-
编写接口方法:Mapper接口
参数:除了id以外的所有数据
结果:void
void insertNOId(Brand brand);
- 编写SQL语句:SQL映射文件
<insert id="insertNOId">
insert into tb_brand(brand_name, company_name, ordered, description, status)
values(#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>
- 执行测试
@Test
public void testInsertNoId() throws IOException {
//接受参数
int status = 1;
int ordered = 7;
String companyName = "糖魅集团";
String brandName = "小魅手机";
String description = "小魅手机就是牛皮";
//创建Brand对象
Brand brand = new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setDescription(description);
brand.setOrdered(ordered);
//创建SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//根据SqlSessionFactory对象创建SqlSession对象
SqlSession ss = ssf.openSession(true);//true:自动提交事务
//根据SqlSession对象创建Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
mapper.insertNOId(brand);
//提交事务:若没有设置opensession方法中的参数为true则需要手动提交事务
//ss.commit();
//释放资源
ss.close();
}
此时我们如果想要在添加数据的同时获取其id可以完成吗?当我们在mapper.insertNoid(brand)下边紧接着执行System.out.println(brand.getId())时,我们发现运行结果是null。
当我们想要实现主键返回时,我们只需要稍微修改一下我们的SQL映射文件即可:
<insert id="insertNOId" useGeneratedKeys="true" keyProperty="id">
添加上**useGeneratedKeys=“true” keyProperty=“id”**即可。
4.2.3、修改
修改全部字段
-
编写接口方法:Mapper接口
参数:所有参数
结果:int影响的行数
int updateAll(Brand brand);
- 编写SQL方法:SQL映射文件
<update id="updateAll">
update tb_brand
set
brand_name = #{brandName},
company_name = #{companyName},
ordered = #{ordered},
description = #{description},
status = #{status}
where id = #{id};
</update>
- 执行方法测试
@Test
public void testUpdateAll() throws IOException {
//接受参数
int id = 4;
int status = 1;
int ordered = 89;
String companyName = "糖魅集团";
String brandName = "小魅手机";
String description = "小魅手机就是牛皮,哦嚯嚯嚯";
//创建Brand对象
Brand brand = new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setDescription(description);
brand.setOrdered(ordered);
brand.setId(id);
//创建SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//根据SqlSessionFactory对象创建SqlSession对象
SqlSession ss = ssf.openSession(true);
//根据SqlSession对象创建Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
mapper.updateAll(brand);
//释放资源
ss.close();
}
修改动态字段
只需要修改SQL映射文件即可
<update id="updateAll">
update tb_brand
<set>
<if test="companyName != null and companyName != '' ">
company_name = #{companyName},
</if>
<if test="brandName != null and brandName != '' ">
brand_name = #{brandName},
</if>
<if test="ordered != null">
ordered = #{ordered},
</if>
<if test="description != null and description != '' ">
description = #{description},
</if>
<if test="status != null">
status = #{status}
</if>
</set>
where id = #{id};
</update>
4.2.4、删除
删除一个
-
编写接口方法:Mapper接口
参数:id
返回值:void
void delById(int id);
- 编写SQL语句:SQL映射文件
<delete id="delById">
delete
from tb_brand
where id = #{id};
</delete>
- 执行测试方法
@Test
public void testDeleteById() throws IOException {
//接受参数
int id = 6;
//创建SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//根据SqlSessionFactory对象创建SqlSession对象
SqlSession ss = ssf.openSession(true);
//根据SqlSession对象创建Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
mapper.delById(id);
//释放资源
ss.close();
}
批量删除
-
编写接口方法
参数:id数组
返回值:void
/**
*此时mapper配置文件中
*<foreach collection="ids" item="id" separator="," open="(" close=")">
* #{id}
* </foreach>
* collection可以等于ids
*
* 若是delByIds(int[] ids)
* 此时
* <foreach collection="array" item="id" separator="," open="(" close=")">
* #{id}
* </foreach>
* collection要写等于array
*/
void delByIds(@Param("ids") int ids);
- 编写SQL映射文件
<delete id="delByIds">
delete from tb_brand
where in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
rceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//根据SqlSessionFactory对象创建SqlSession对象
SqlSession ss = ssf.openSession(true);
//根据SqlSession对象创建Mapper代理对象
BrandMapper mapper = ss.getMapper(BrandMapper.class);
mapper.delById(id);
//释放资源
ss.close();
}
批量删除
-
编写接口方法
参数:id数组
返回值:void
/**
*此时mapper配置文件中
*<foreach collection="ids" item="id" separator="," open="(" close=")">
* #{id}
* </foreach>
* collection可以等于ids
*
* 若是delByIds(int[] ids)
* 此时
* <foreach collection="array" item="id" separator="," open="(" close=")">
* #{id}
* </foreach>
* collection要写等于array
*/
void delByIds(@Param("ids") int ids);
- 编写SQL映射文件
<delete id="delByIds">
delete from tb_brand
where in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>