MyBatis
MyBatis简介
MyBatis是一个优秀的持久层框架,它对jdbc操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
持久层:1.负责将数据到保存到数据库的那一层代码
2.JavaEE三层架构:表现层、业务层、持久层
框架:1.框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
2.在框架的基础之上构建编写更加高效、规范、通用、可拓展
MyBatis入门
1.建立一个数据库,在其中创建一张表并填入数据
2.使用IDEA创建一个maven项目
3.导入依赖jar包(pom.xml)
<?xml version="1.0" encoding="UTF-8"?> <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>org.example</groupId> <artifactId>mybatis</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!-- mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- 添加slf4j日志api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- 添加logback-classic依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> <!-- 添加logback-core依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.11</version> </dependency> </dependencies> </project>
4.创建一个User类
package com.yezi.pojo; public class User { private String id; private String username; private String password; private String gender; private String addr; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + ", gender='" + gender + '\'' + ", addr='" + addr + '\'' + '}'; } }
5.编写mapper映射文件(编写SQL)(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="com.yezi.mapper.UserMapper"> <!-- <mapper namespace="test">--> <select id="selectAll" resultType="com.yezi.pojo.User"> select * from tb_user; </select> <select id="selectById" resultType="com.yezi.pojo.User"> select * from tb_user where id = #{id}; </select> </mapper>
6.连接数据库信息
<?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> <typeAliases> <package name="com.yezi.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!-- 数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db1?characterEncoding=UTF-8&useSSL=false"/> <property name="username" value="root"/> <property name="password" value="123456789"/> </dataSource> </environment> </environments> <mappers> <!-- <mapper resource="com/yezi/mapper/BrandMapper.xml"></mapper>--> <package name="com.yezi.mapper"/> </mappers> </configuration>
7.测试类
package com.yezi; import com.yezi.pojo.User; 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 java.io.IOException; import java.io.InputStream; import java.util.List; public class MyBatisDemo { public static void main(String[] args) throws IOException { //1.加载mybatis的核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.获取SqlSession对象,用它来执行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //3.执行sql // List<User> users = sqlSession.selectList("test.selectAll"); List<User> users = sqlSession.selectList("test.selectAll"); System.out.println(users); //4.释放资源 sqlSession.close(); } }
Mapper代理:
目的:1.解决原生方式中的硬编码
2.简化后期执行SQL
MyBatis案例
环境准备:
1.建立一个数据库表tb_brand(数据库db1中)
DROP TABLE IF EXISTS tb_brand; CREATE TABLE tb_brand ( id INT PRIMARY KEY auto_increment, brand_name VARCHAR (20), company_name VARCHAR (20), ordered INT, description VARCHAR (100), STATUS INT ); INSERT INTO tb_brand ( brand_name, company_name, ordered, description, STATUS ) VALUE ( '三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0 ), ( '华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1 ), ( '小米', '小米科技有限公司', 50, 'are you ok', 1 ); SELECT * FROM tb_brand;
2.建立实体类Brand
package com.yezi.pojo; public class Brand { private Integer id; //品牌名称 private String brandName; //企业名称 private String companyName; //排序字段 private Integer ordered; //描述状态 private String description; ////状态 :0:禁用 1:启用 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 + '}'; } }
3.测试用例MyBatisTest
package com.yezi.test; public class MyBatisTest { }
*4.安装MyBatisX插件
MyBatisX主要作用:
- 自动生成代码功能,包含自动生成数据库实体和XML配置文件,根据Mapper的接口方法名自动生成xml配置
- Mapper接口与xml自动跳转功能
1.查询
(1)查询所有&结果映射
BrandMapper接口:
package com.yezi.mapper; import com.yezi.pojo.Brand; import java.util.List; public interface BrandMapper { // 查询所有 List<Brand> selectAll(); }
编写全局配置文件
<?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.yezi.mapper.BrandMapper"> <!-- 数据库表的字段名称 和 实体类的属性名称 不一样,则不能自动封装数据 *起别名:对不一样的列名起别名,让别名和实体类的属性名一样 *缺点:每次查询都要定义一次别名 *sql片段 缺点:不灵活 *resultMap: 1.定义<resultMap>标签 2.使用resultMap属性替换 resultType属性 --> <resultMap id="brandResultMap" type="brand"> <!-- id:完成主键字段的映射 column:表的列名 property:实体类的属性名 result:完成一般字段的映射 column:表的列名 property:实体类的属性名 --> <result column="brand_name" property="brandName"></result> <result column="company_name" property="companyName"></result> </resultMap> </mapper>
测试类
@Test public void testSelectAll() throws IOException { //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 //List<Brand> brands = brandMapper. List<Brand> brands = brandMapper.selectAll(); System.out.println(brands); //释放资源 sqlSession.close(); }
(2)查看详情
BrandMapper接口:
package com.yezi.mapper; import com.yezi.pojo.Brand; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface BrandMapper { //查看详情 Brand selectById(int id); }
编写全局配置文件:
<?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.yezi.mapper.BrandMapper"> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select> <!-- <sql id="brand_column">--> <!-- id, brand_name brandName, company_name companyName, ordered, description, STATUS--> <!-- </sql>--> <!-- <select id="selectAll" resultType="brand">--> <!-- select <include refid="brand_column"/>--> <!-- from tb_brand;--> <!-- </select>--> <!-- <select id="selectAll" resultType="brand">--> <!-- select id, brand_name brandName, company_name companyName, ordered, description, STATUS--> <!-- from tb_brand;--> <!-- </select>--> <!-- * 参数占位符: 1.#{}:会将其替换为?,防止SQL注入 2.${}: 拼sql 会存在SQL注入问题 3.使用时间: * 参数传递的时候:#{id} * 表名或者列名不固定的情况下:${}会存在SQL注入问题 *参数类型:parameterType:可以省略 *特殊字符处理: 1.转义字符 2.CDATA区 (<select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id <![CDATA[ > ]]> #{id}; </select>) --> </mapper>
测试类
package com.yezi.test; import com.yezi.mapper.BrandMapper; import com.yezi.pojo.Brand; 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.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyBatisTest { @Test public void testSelectById() throws IOException { //接收参数 int id = 1; //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 Brand brand = brandMapper.selectById(id); System.out.println(brand); //释放资源 sqlSession.close(); } }
(3)条件查询
BrandMapper接口:
package com.yezi.mapper; import com.yezi.pojo.Brand; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface BrandMapper { /** * 条件查询 * * 参数接收 * 1.散装参数:如果方法中有多个参数需要使用@Param("SQL参数占位符名称") * 2.对象参数:对象的属性名称要和参数占位符名称一致 * 3。map集合参数 * @Param status * @Param companyName * @Param brandName * @return */ // 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); }
编写全局配置文件:
<?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.yezi.mapper.BrandMapper"> <select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id = #{id}; </select> <!--条件查询--> <!-- <select id="selectByCondition" resultMap="brandResultMap">--> <!-- select *--> <!-- from tb_brand--> <!-- where--> <!-- status = #{status}--> <!-- and company_name like #{companyName}--> <!-- and brand_name like #{brandName}--> <!-- </select>--> </mapper>
测试类
package com.yezi.test; import com.yezi.mapper.BrandMapper; import com.yezi.pojo.Brand; 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.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyBatisTest {
@Test
public void testSelectByCondition() throws IOException {
//接收参数
int status = 1;
String companyName = "华为";
String brandName = "华为";
//处理参数
companyName = "%" + companyName + "%";
brandName = "%" + brandName + "%";
//封装对象
Brand brand = new Brand();
brand.setStatus(status);
brand.setCompanyName(companyName);
brand.setBrandName(brandName);
//获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//执行方法
// List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
List<Brand> brands = brandMapper.selectByCondition(brand);
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
(4)动态条件查询
BrandMapper接口:
package com.yezi.mapper; import com.yezi.pojo.Brand; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface BrandMapper { //多条件查询 List<Brand> selectByCondition(Map map);
// 单条件动态查询
List<Brand> selectByConditionSingle(Brand brand);
}
编写全局配置文件:
<?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.yezi.mapper.BrandMapper">
<!-- 多条件动态条件查询
* if:条件判断
* test:逻辑表达式
* 问题:
* 恒等式
* <where> 替换 where 关键字
-->
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand /*where 1=1*/ <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>
<!-- 单条件动态条件查询-->
<select id="selectByConditionSingle" 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>
</mapper>
测试类
package com.yezi.test; import com.yezi.mapper.BrandMapper; import com.yezi.pojo.Brand; 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.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyBatisTest { @Test public void testSelectByCondition() throws IOException { //接收参数 int status = 1; String companyName = "华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //封装对象 // Brand brand = new Brand(); // brand.setStatus(status); // brand.setCompanyName(companyName); // brand.setBrandName(brandName); Map map = new HashMap(); // map.put("status",status); map.put("companyName", companyName); // map.put("brandName",brandName); //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 // List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName); // List<Brand> brands = brandMapper.selectByCondition(brand); List<Brand> brands = brandMapper.selectByCondition(map); System.out.println(brands); //释放资源 sqlSession.close(); }
@Test
public void testSelectByConditionSingle() throws IOException {
//接收参数
int status = 1;
String companyName = "华为";
String brandName = "华为";
//处理参数
companyName = "%" + companyName + "%";
brandName = "%" + brandName + "%";
//封装对象
Brand brand = new Brand();
// brand.setStatus(status);
// brand.setCompanyName(companyName);
// brand.setBrandName(brandName);
//获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//执行方法
List<Brand> brands = brandMapper.selectByConditionSingle(brand);
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
2.添加&修改功能
BrandMapper接口:
package com.yezi.mapper; import com.yezi.pojo.Brand; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface BrandMapper { //添加 void add(Brand brand); //修改 int update(Brand brand); }
编写全局配置文件:
<?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.yezi.mapper.BrandMapper"> <!-- 添加--> <insert id="add" useGeneratedKeys="true" keyProperty="id"> insert into tb_brand (brand_name, company_name, ordered, description, STATUS) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status}); </insert> <!-- mybatis会将数组参数,封装为一个Map集合 *默认:array= 数组 *使用@param注解改变map集合的默认key的名称 --> <!--修改--> <update id="update"> update tb_brand <set> <if test="brandName != null and brandName != ''"> brand_name = #{brandName}, </if> <if test="companyName != null and companyName != ''"> company_name = #{companyName}, </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> </mapper>
测试类
package com.yezi.test; import com.yezi.mapper.BrandMapper; import com.yezi.pojo.Brand; 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.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyBatisTest { @Test public void testAdd2() throws IOException { //接收参数 int status = 1; String companyName = "oppo手机"; String brandName = "oppo"; String description = "oppo记录美好生活"; int ordered = 100; //封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName); brand.setDescription(description); brand.setOrdered(ordered); //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 brandMapper.add(brand); Integer id = brand.getId(); System.out.println(id); //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); } @Test public void testUpdate() throws IOException { //接收参数 int status = 1; String companyName = "oppo手机"; String brandName = "oppo"; String description = "oppo手机,oppo记录美好生活"; int ordered = 200; int id = 8; //封装对象 Brand brand = new Brand(); brand.setStatus(status); // brand.setCompanyName(companyName); // brand.setBrandName(brandName); // brand.setDescription(description); // brand.setOrdered(ordered); brand.setId(id); //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 int count = brandMapper.update(brand); System.out.println(count); //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); } }
3.删除功能
BrandMapper接口:
package com.yezi.mapper; import com.yezi.pojo.Brand; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface BrandMapper { //根据id删除 void deleteById(int id); //批量删除 void deleteByIds(@Param("ids") int[] ids); }
编写全局配置文件:
<?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.yezi.mapper.BrandMapper"> <delete id="deleteById"> delete from tb_brand where id = #{id} </delete> <delete id="deleteByIds"> delete from tb_brand where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete> </mapper>
测试类
package com.yezi.test; import com.yezi.mapper.BrandMapper; import com.yezi.pojo.Brand; 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.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyBatisTest { @Test public void testDeleteById() throws IOException { //接收参数 int id = 8; //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 brandMapper.deleteById(id); //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); } @Test public void testDeleteByIds() throws IOException { //接收参数 int[] ids = {7,9,10}; //获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //执行方法 brandMapper.deleteByIds(ids); //提交事务 sqlSession.commit(); //释放资源 sqlSession.close(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异