news 2026/9/24 0:41:59

mybatis - 动态语句、批量注册mapper、分页插件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mybatis - 动态语句、批量注册mapper、分页插件

动态语句

pom.xml

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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><parent><groupId>com.english</groupId><artifactId>ssm-spring-part</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>mybatis-dynsql</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- SLF4J API(日志门面) --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><!-- 具体日志实现(如 Logback) --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency><!-- 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId></dependency></dependencies></project>

实体类 Student

packagecom.english.pojo;importlombok.Data;@DatapublicclassStudent{privateIntegerid;privateStringname;privateStringgender;privateIntegerage;privateStringclasses;}

实体类Student对应的mapper接口文件

packagecom.english.mapper;importcom.english.pojo.Student;importorg.apache.ibatis.annotations.Param;importjava.util.List;publicinterfaceStudentMapper{// 根据 姓名、年龄 查询学生信息List<Student>query(@Param("name")Stringname,@Param("age")Integerage);// 根据 学生id 更新学生的数据,要求传入的 name、age不为null的才更新intupdateById(@Param("id")Integerid,@Param("name")Stringname,@Param("age")Integerage);// 如果name不为null,就根据name查询;如果name为null,age不为null,就根据age查询;如果name、age都为null,就查询全部List<Student>queryChoose(@Param("name")Stringname,@Param("age")Integerage);// 根据 id 批量查询List<Student>queryBatch(@Param("ids")List<Integer>ids);// 根据 id 批量删除intdeleteBatch(@Param("ids")List<Integer>ids);// 根据 id 批量插入intinsertBatch(@Param("list")List<Student>list);// 根据 id 批量修改intupdateBatch(@Param("list")List<Student>list);}

然后是StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTO Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.english.mapper.StudentMapper"><!-- if标签的test属性中,能访问实体类的属性,不能访问数据库表的字段; if标签中,">" 用 "&gt;" "<" 用 "&lt" --><!-- List<Student> query(@Param("name") String name, @Param("age") Integer age); --><selectid="query"resultType="student">select * from students<where><iftest="name != null">name = #{name}</if><iftest="age != null and age&gt;20">and age = #{age}</if></where></select><!-- int updateById(Integer id, @Param("name") String name, @Param("age") Integer age); --><updateid="updateById">update students<set><iftest="name != null">name = #{name},<!-- 这里必须有个 逗号,否则就报错 --></if><iftest="age != null">age = #{age}</if></set>where id = #{id}</update><!-- 如果name不为null,就根据name查询;如果name为null,age不为null,就根据age查询;如果name、age都为null,就查询全部 --><!-- List<Student> queryChoose(@Param("name") String name, @Param("age") Integer age); --><selectid="queryChoose"resultType="student">select * from students where<choose><whentest="name != null">name = #{name}</when><whentest="age != null">age = #{age}</when><otherwise>1=1</otherwise></choose></select><!-- 根据 id 批量查询 --><!-- List<Student> queryBatch(@Param("ids") List<Integer> ids); --><selectid="queryBatch"resultType="student">select * from students where id in<!-- 假设要遍历的数据ids = (1, 2, 3, 4) collection:要遍历的数据 open:遍历之前,要追加的字符串,这里是 "(" separator:每次遍历的分隔符号,这里是 "," 如果是最后一次,就不追加 close:遍历之后,要追加的字符串,这里是 ")" item:获取每个遍历项,这里是"1 2 3 4" --><foreachcollection="ids"open="("separator=","close=")"item="id"><!-- 遍历的内容,就是,item属性的值 -->#{id}</foreach></select><!-- 根据 id 批量删除 --><!-- int deleteBatch(@Param("ids") List<Integer> ids); --><deleteid="deleteBatch">delete from students where id in<foreachcollection="ids"open="("separator=","close=")"item="id">#{id}</foreach></delete><!-- 根据 id 批量插入 --><!-- int insertBatch(@Param("list") List<Student> list); --><insertid="insertBatch"><!-- insert into students (id, name, gender, age, class) values (11, "咯咯咯", "男", 8, "高中八班"), (12, "呵呵呵", "男", 110, "高中八班") -->insert into students (id, name, gender, age, class) values<foreachcollection="list"separator=","item="student">(#{student.id}, #{student.name}, #{student.gender}, #{student.age}, #{student.class})</foreach></insert><!-- 根据 id 批量修改 --><!-- int updateBatch(@Param("list") List<Student> list); --><!-- 批量插入的例子本质上是一条SQL语句, 而批量更新,则需要多条SQL语句拼起来,用分号分开,也就是一次性发送多条SQL语句让数据库执行, 需要配置 allowMultiQueries = true 才行 <property name="url" value="jdbc:mysql:///my_study_db?allowMultiQueries=true"/> --><updateid="updateBatch"><!-- update students set name = "改名1", age = 55 WHERE id = 5--><foreachcollection="list"item="stu">update students set name = #{stu.name}, age = #{stu.age} WHERE id = #{id}</foreach></update></mapper>

mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTO Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><!-- 开启mybatis的日志输出,使用system进行控制台输出 --><settingname="logImpl"value="STDOUT_LOGGING"/><!-- 开启,驼峰式自动映射(数据库表中某列是a_col,映射到java中就成了aCol) --><settingname="mapUnderscoreToCamelCase"value="true"/></settings><typeAliases><!-- 方式1:单独定义--><!-- <typeAlias type="com.atguigu.pojo.Employee" alias="ergouzi"/> --><!-- 方式2:批量将包下的类,给与别名,别名就是类的首字母小写 --><packagename="com.english.pojo"/><!-- 在方式2的情况下,如果某个文件需要单独设置别名,将注解@Alias("ergouzi")加到这个类上即可 --></typeAliases><!-- 配置分页插件--><plugins><plugininterceptor="com.github.pagehelper.PageInterceptor"><propertyname="helperDialect"value="mysql"/></plugin></plugins><!-- 配置mybatis的开发环境,使用 default 指定实际运行时使用的环境 --><environmentsdefault="development"><environmentid="development"><!-- transactionManager:配置 Mybatis 的 内置事务管理器,type设置为JDBC,表示,使用MyBatis内置的JDBC事务管理器 --><transactionManagertype="JDBC"></transactionManager><!-- dataSource:配置数据源,type属性设置为POOLED,表示使用连接池 --><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql:///my_study_db?allowMultiQueries=true"/><propertyname="username"value="root"/><propertyname="password"value="root"/></dataSource></environment></environments><!-- mappers:用于配置Mapper映射文件,这里注册了一个位于mappers目录下的EmployeeMapper.xml文件。--><!-- <mappers>--><!-- <mapper resource="mappers/StudentMapper.xml"/>--><!-- </mappers>--><!-- 优化:不需要一个一个把 XxxMapper.xml 在这里注册了 --><mappers><!-- 批量注册mapper.xml 1、要求 Mapper.xml 与 mapper接口名必须相同 2、最终打包的位置要一致 在 resources 目录下创建 mapper接口对应是xml文件时,也创建个com.english.mapper包 就行了, 然后在这个包里面创建Mapper.xml文件 --><packagename="com.english.mapper"/></mappers></configuration>

最后的测试类

importcom.english.mapper.StudentMapper;importcom.english.pojo.Student;importcom.github.pagehelper.PageHelper;importcom.github.pagehelper.PageInfo;importlombok.extern.slf4j.Slf4j;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importjava.io.IOException;importjava.io.InputStream;importjava.util.List;@Slf4jpublicclassMyTest{privateSqlSessionsqlSession;// junit 会在每一个 @Test方法 前,执行 @BeforeEach方法@BeforeEachpublicvoidinit()throwsIOException{InputStreamipt=Resources.getResourceAsStream("mybatis-config.xml");sqlSession=newSqlSessionFactoryBuilder().build(ipt).openSession();}@Testpublicvoidtest_1(){StudentMappermapper=sqlSession.getMapper(StudentMapper.class);List<Student>list=mapper.query(null,88);System.out.println("list= "+list);}@Testpublicvoidtest_2(){StudentMappermapper=sqlSession.getMapper(StudentMapper.class);inta=mapper.updateById(2,"哈哈哈",18);System.out.println("a="+a);}// 使用分页插件@Testpublicvoidtest_3(){StudentMappermapper=sqlSession.getMapper(StudentMapper.class);// 设置分页数据(当前是第几页,每页几条数据)PageHelper.startPage(1,10);List<Student>stuList=mapper.queryChoose(null,null);// 将查询数据封装到一个 PageInfo的分页实体类PageInfo<Student>pageInfo=newPageInfo<>(stuList);// 获取当前页的数据List<Student>list_1=pageInfo.getList();// 获取总页数intpages=pageInfo.getPages();// 获取总条数longtotal=pageInfo.getTotal();intpageNum=pageInfo.getPageNum();intpageSize=pageInfo.getPageSize();System.out.println("list_1= "+list_1);System.out.println("pages= "+pages);System.out.println("total= "+total);System.out.println("pageNum= "+pageNum);System.out.println("pageSize= "+pageSize);}// junit 会在每一个 @Test方法 后,执行 @AfterEach方法@AfterEachpublicvoidclear(){sqlSession.commit();sqlSession.close();}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 1:37:25

2026年职场新宠:AI产品经理!未来五年黄金职业,岗位需求激增!

一、AI产品经理-职业新机会点 近年来&#xff0c;AI 产品的外形与体验正在极速演化&#xff0c;而在 2025 年的全球科技趋势中&#xff0c;一个愈加明显的现象是&#xff1a;人工智能&#xff08;AI&#xff09;正以前所未有的深度和广度融入各行各业。如果你仔细观察这两年的…

作者头像 李华
网站建设 2026/9/21 22:05:09

录入每日三餐饮食,识别热量和营养成分,对比每日推荐摄入量,给出多吃蔬菜/少盐的精准建议。

设计一个 “每日三餐饮食营养分析与建议系统”&#xff0c;利用人工智能方法与技术课程中的知识&#xff0c;实现饮食录入、热量与营养成分识别、与每日推荐摄入量对比&#xff0c;并给出精准的健康建议&#xff08;如“多吃蔬菜”“少盐”&#xff09;。1. 实际应用场景描述现…

作者头像 李华
网站建设 2026/9/20 14:18:38

基于 YOLOv8 的茶叶病害智能识别系统[目标检测完整源码]

基于 YOLOv8 的茶叶病害智能识别系统[目标检测完整源码] 摘要 随着智慧农业与数字化种植的不断推进&#xff0c;传统依赖人工经验的茶叶病害巡检方式已难以满足规模化、精细化管理需求。本文围绕 茶叶病虫害自动识别 这一典型农业视觉场景&#xff0c;介绍了一套基于 YOLOv8 …

作者头像 李华
网站建设 2026/9/22 8:20:27

紫金桥跨平台监控组态软件:工业生产的可视化控制平台

紫金桥跨平台监控组态软件是一款专业的工业自动化软件平台&#xff0c;主要用于实现对工业生产过程的实时监控、数据采集和可视化控制。为企业提供从数据采集到应用开发的全套解决方案。一、软件核心功能1. 实时数据采集与处理 软件支持多种工业通讯协议&#xff0c;可连接PLC、…

作者头像 李华
网站建设 2026/9/21 22:21:47

Windows实用小工具,吾爱出品

今天给大家推荐两款使用率非常高的小软件&#xff0c;这两个小软件大大提高了处理文件的效率&#xff0c;有需要的小伙伴可以下载收藏。 Mp4ToGif 视频转GIF Mp4ToGif软件能把视频中的任意一部分片段&#xff0c;转换成想要的GIF格式。 软件操作方法也简单&#xff0c;选择好视…

作者头像 李华