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();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

投稿不再陪跑!宏智树 AI:期刊论文写作的智能通关秘籍

作为深耕论文写作科普的教育博主&#xff0c;后台每天都被科研人的投稿焦虑刷屏&#xff1a;“选题被说没新意”“文献综述写得像流水账”“格式改了八遍还不达标”“查重过了却栽在 AIGC 检测”…… 其实&#xff0c;写期刊论文不是 “硬熬” 出来的&#xff0c;选对工具就能事…

如何从备份还原 iPhone?

丢失 iPhone 上的重要数据可能会让人焦虑不安&#xff0c;但值得庆幸的是&#xff0c;Apple 提供了多种从备份恢复 iPhone 的方法。无论您是将数据备份到 iCloud还是 iTunes&#xff0c;总有一款适合您。本指南全面介绍了如何从 iCloud 备份和 iTunes 备份恢复 iPhone。让我们逐…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘fastapi’ 问题

摘要 你在使用pip安装/运行fastapi时遇到ModuleNotFoundError: No module named fastapi报错&#xff0c;该问题核心诱因是环境一致性问题&#xff08;pip与python版本错位&#xff0c;占比40%&#xff09; 安装不完整 权限不足 虚拟环境未激活 Python版本不兼容 缓存损坏…

11 亿估值 盒装床垫的跨境 DTC 破局之路

2014 年问世的 Casper&#xff0c;凭借创新泡沫床垫产品与精准的内容营销策略&#xff0c;迅速颠覆传统床垫行业&#xff0c;仅用 5 年时间就实现 11 亿美元估值&#xff0c;堪称跨境 DTC 品牌的标杆案例。起初&#xff0c;几乎没人看好一家线上床垫店能成功 —— 毕竟消费者习…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘rich’ 问题

摘要 你在使用pip安装/运行rich时遇到ModuleNotFoundError: No module named rich报错&#xff0c;该问题核心诱因是环境一致性问题&#xff08;pip与python版本错位&#xff0c;占比45%&#xff09; 安装不完整 权限不足 虚拟环境未激活 Python版本不兼容 缓存损坏&#…

Inteva DELJIT 报文解析:从 EDI 到 JSON 的结构化转换与字段说明

一、背景说明 在汽车行业供应链中&#xff0c;DELJIT&#xff08;Delivery Just In Time&#xff09; 报文用于客户向供应商下发短周期、强约束的交付指令&#xff0c;是 JIT / JIS / 看板&#xff08;KANBAN&#xff09;模式下的核心业务报文。 与 DELFOR&#xff08;预测计…

零基础转网安别乱学!这篇超详细建议从入门到精通,收藏起来少走一年弯路!

在当前就业形势下&#xff0c;不少朋友咨询过龙哥&#xff0c;询问转行能否转行网络安全。网络安全作为一个热门领域&#xff0c;自然也吸引了许多人的目光。本文将就转行网络安全这一话题&#xff0c;提供一些切实可行的建议。 网络安全行业概况 网络安全涵盖了从基础的脚本编…

2026 年 1 月铝镁锰合金瓦厂家推荐排行榜,钛锌瓦/铝镁锰仿古瓦/直立锁边瓦/氟碳工艺瓦,专业屋面系统解决方案与创新工艺深度解析 - 企业推荐官【官方】

2026年1月铝镁锰合金瓦厂家推荐排行榜:钛锌瓦/铝镁锰仿古瓦/直立锁边瓦/氟碳工艺瓦,专业屋面系统解决方案与创新工艺深度解析 在当代建筑领域,金属屋面系统以其卓越的耐久性、丰富的造型可能性和优异的环保性能,已…

【转行网安全攻略】非常详细的零基础路线:从入门到精通,收藏这一篇就够!

在当前就业形势下&#xff0c;不少朋友咨询过龙哥&#xff0c;询问转行能否转行网络安全。网络安全作为一个热门领域&#xff0c;自然也吸引了许多人的目光。本文将就转行网络安全这一话题&#xff0c;提供一些切实可行的建议。 网络安全行业概况 网络安全涵盖了从基础的脚本编…

TDengine R 语言连接器入门指南

本指南帮助 R 语言初学者快速掌握通过 RJDBC 连接 TDengine 时序数据库的全过程&#xff0c;从环境准备到执行第一次查询&#xff0c;让您在最短时间内上手。 1. 前置准备 在开始之前&#xff0c;请确保&#xff1a; ✅ 已安装 R 语言环境&#xff08;推荐 4.3 或更高版本&a…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘gunicorn’ 问题

摘要 你在使用pip安装/运行gunicorn时遇到ModuleNotFoundError: No module named gunicorn报错&#xff0c;该问题核心诱因是环境一致性问题&#xff08;pip与python版本错位&#xff0c;占比40%&#xff09; 安装不完整 权限不足 虚拟环境未激活 Python版本不兼容 缓存损…

2026 年 1 月珍珠棉厂家推荐排行榜,EPE珍珠棉/珍珠棉包装/珍珠棉内衬/防静电珍珠棉/珍珠棉卷材,精选缓冲防护材料优质源头! - 企业推荐官【官方】

2026 年 1 月珍珠棉厂家推荐排行榜:精选 EPE 珍珠棉/珍珠棉包装/珍珠棉内衬/防静电珍珠棉/珍珠棉卷材优质源头 在当今的工业制造与商品流通领域,产品的安全运输与精密防护已成为供应链管理中的核心环节。作为主流的缓…

2026中山网络营销推广:如何用行业解决方案替代硬广,提升营销效果

随着2026中山网络营销推广的不断发展&#xff0c;越来越多的企业意识到&#xff0c;传统的硬广&#xff08;硬性广告&#xff09;已无法满足客户日益增长的需求&#xff0c;且难以有效吸引用户的注意力。相比之下&#xff0c;行业解决方案通过提供深入的行业洞察和具体问题的解…

立结合解剖学知识的潜在空间建模下的群体水平脑结构连接性/文献速递-基于人工智能的医学影像技术

2026.1.19本文提出了一种新颖的属性信息脑连接性&#xff08;ABC&#xff09;模型&#xff0c;通过生成式潜在空间网络模型并整合脑区解剖学属性&#xff0c;估算群体水平脑结构连接性&#xff0c;量化不确定性&#xff0c;并成功应用于阿尔茨海默病&#xff08;AD&#xff09;…

2026 年 1 月礼品盒厂家推荐排行榜,涵盖茶叶/服装/红酒/春节/婚礼/月饼礼品盒,创意定制与精美包装实力之选 - 企业推荐官【官方】

2026年礼品盒厂家实力解析与推荐:洞察茶叶、服装、红酒等场景的创意包装之选 在消费升级与品牌意识日益增强的今天,礼品盒早已超越了简单的容器功能,演变为传递情感、彰显品位、塑造品牌形象的重要载体。无论是承载…

深入学习 Claude Code 的操作,高级教程

目录1.沙盒模式 sandbox2.Headless 模式 (无头模式)3.深度思考模式 ultrathink4.常用的 提示词 、斜杠命令、token 减少5. 快捷键和快速启动6.切换模型 注:本文完整版全文原文:https://www.ccgxk.com/codeother/624.…

Apache NiFi实战:构建非结构化数据流处理管道

Apache NiFi实战&#xff1a;构建非结构化数据流处理管道 关键词&#xff1a;Apache NiFi、非结构化数据、数据流处理、ETL管道、数据集成、实时处理、数据清洗 摘要&#xff1a;随着非结构化数据&#xff08;如日志、文本、图像、音视频&#xff09;在企业数据资产中占比超过8…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘uvicorn’ 问题

摘要 你在使用pip安装/运行uvicorn时遇到ModuleNotFoundError: No module named uvicorn报错&#xff0c;该问题核心诱因是环境一致性问题&#xff08;pip与python版本错位&#xff0c;占比40%&#xff09; 安装不完整 权限不足 虚拟环境未激活 Python版本不兼容 缓存损坏…

别再只盯着模型了:从数据到模型,才是真正的端到端数据科学流水线

别再只盯着模型了&#xff1a;从数据到模型&#xff0c;才是真正的端到端数据科学流水线很多人一聊数据科学&#xff0c;第一反应就是&#xff1a;“用啥模型&#xff1f;XGBoost 还是 Transformer&#xff1f;” “参数怎么调&#xff1f;loss 能不能再降一点&#xff1f;”说…

Unity 底层技术研究文档

1. Unity 脚本运行体系概览 Unity 的 C# 脚本执行体系主要依赖两大技术:Mono/.NET 虚拟机(传统方案) IL2CPP(Unity 自研的 Ahead-Of-Time 编译方案)不同方案在执行原理、性能和平台支持上存在差异。 1.1 Mono/.NE…