MyBatis进阶:动态SQL与MyBatis Generator插件使用
一.动态SQL动态 SQL 是Mybatis的强大特性之⼀能够完成不同条件下不同的 sql 拼接下面我只介绍比较常用的动态SQL标签 想要了解更多标签可以参考官方文档https://mybatis.net.cn/dynamic-sql.html1.1 if 标签if 标签 是 MyBatis 动态 SQL 最常用的标签作用是根据条件动态拼接 SQL 片段解决「不同条件下执行不同 SQL」的问题比如多条件查询、非空字段更新 / 插入等场景。语法if test条件表达式 需要拼接的 SQL 片段 /if接口定义Integer insertUserByCondition(UserInfo userInfo);Mapper.xml 实现insert idinsertUserByCondition INSERT INTO userinfo ( username, password, age, if testgender ! null gender, /if phone) VALUES ( #{username}, #{age}, if testgender ! null #{gender}, /if #{phone}) /insert使用注解实现不推荐把上面SQL(包括标签),使用script/script标签括起来就可以Insert(script INSERT INTO userinfo (username,password,age, if testgender!nullgender,/if phone) VALUES(#{username},#{age}, if testgender!null#{gender},/if #{phone}) /script) Integer insertUserByCondition(UserInfo userInfo);1.2 trim标签trim 是 MyBatis 中用于修剪 SQL 片段首尾多余字符的标签常配合if 使用解决「动态拼接 SQL 时首尾多出 AND/OR/ 逗号」的问题语法trim prefix前缀 suffix后缀 prefixOverrides要移除的前缀字符 suffixOverrides要移除的后缀字符 动态拼接的 SQL 片段 /trim属性作用示例值prefix给拼接后的 SQL 片段添加前缀比如(或WHEREprefixWHEREsuffix给拼接后的 SQL 片段添加后缀比如)或VALUESsuffix)prefixOverrides移除拼接后 SQL 片段开头的指定字符比如AND/ORprefixOverridesANDsuffixOverrides移除拼接后 SQL 片段结尾的指定字符比如,suffixOverrides,注意它会根据内部动态拼接的 SQL 片段自动决定是否添加前缀 / 后缀以及是否移除首尾多余的字符完全不需要我们手动判断调整 Mapper.xml 的插入语句为insert idinsertUserByCondition INSERT INTO userinfo trim prefix( suffix) suffixOverrides, if testusername !null username, /if if testpassword !null password, /if if testage ! null age, /if if testgender ! null gender, /if if testphone ! null phone, /if /trim VALUES trim prefix( suffix) suffixOverrides, if testusername !null #{username}, /if if testpassword !null #{password}, /if if testage ! null #{age}, /if if testgender ! null #{gender}, /if if testphone ! null #{phone} /if /trim /insert1.3 where标签where 是 MyBatis 为WHERE 子句量身定制 的标签本质是 trim 的「简化版」专门解决「动态查询时 WHERE 子句的拼接问题」比手动写trim 更简洁、语义更清晰。核心语法where if test条件1AND/OR 条件1的SQL片段/if if test条件2AND/OR 条件2的SQL片段/if !-- 更多if条件 -- /where核心作用自动为条件块添加WHERE关键字仅当内部有有效条件时自动剔除条件块开头多余的AND或OR关键字。注意where 标签是 trim perfixwhere perfixOverrides AND | OR 的简化写法规则完全一致。接口定义:ListUserInfo queryByCondition();Mapper.xml 实现select idqueryByCondition resultTypecom.example.demo.model.UserInfo select id, username, age, gender, phone, delete_flag, create_time, update_time from userinfo where if testage ! null and age #{age} /if if testgender ! null and gender #{gender} /if if testdeleteFlag ! null and delete_flag #{deleteFlag} /if /where /select1.4 set 标签set是 MyBatis 提供的动态 SQL 核心标签专用于UPDATE语句的 SET子句动态拼接是trim标签针对更新场景的语法糖简化封装其核心定义可拆解为核心语法update id方法名 parameterType参数类型如实体类全限定名 UPDATE 表名 set !-- 动态更新字段每个字段后可加逗号set 自动处理 -- if test字段名 ! null [and 字段名 ! ] 数据库字段名 #{参数名}, /if !-- 可添加多个 if 标签对应多个更新字段 -- /set WHERE 主键字段 #{主键参数} !-- 必须加防止全表更新 -- /update功能定位解决手动拼接UPDATE语句的SET子句时因字段条件动态变化导致的「末尾多余逗号」「无有效字段时生成空 SET 子句」等 SQL 语法错误问题核心规则仅当内部包含有效更新字段非空的if条件块时才会在拼接结果前添加SET关键字自动剔除拼接结果末尾多余的英文逗号,无有效更新字段时不生成任何SET相关内容避免UPDATE table WHERE ...这类语法错误。注意set 标签也可以使用 trim prefixset suffixOverrides, 代替这两个的功能完全一致接口定义Integer updateUserByCondition(UserInfo userInfo);Mapper.xml 实现update idupdateUserByCondition update userinfo set if testusername ! null username #{username}, /if if testage ! null age #{age}, /if if testdeleteFlag ! null delete_flag #{deleteFlag}, /if /set where id #{id} /update1.5 foreach标签foreach标签是MyBatis框架中最常用的动态 SQL 标签之一核心作用是遍历集合List/Set/ 数组 / Map并根据集合元素动态拼接 SQL 语句比如批量插入、IN 条件查询等。foreach标签的核心属性如下前 4 个是最常用的属性名作用collection绑定方法参数中的集合如ListSetMap或数组对象item遍历时的每一个对象给每一个对象取的别名separator元素之间的分隔符open语句块开头的字符串close语句块结尾得字符串接口定义void deleteByIds(ListInteger ids);Mapper.xml 实现delete iddeleteByIds delete from userinfo where id in foreach collectionids itemid separator, open( close) #{id} /foreach /delete1.6 include 标签include 标签是 MyBatis 中用于复用 SQL 片段的核心标签能有效解决 SQL 代码冗余问题比如多个 SQL 语句共用相同的字段列表、WHERE 条件等提升代码的可维护性。简单来说,include就像编程里的 “复制粘贴”但更优雅 —— 你可以把重复的 SQL 片段定义在sql 标签里然后在需要的地方用include引用它。核心语法1. 定义可复用的sql片段使用 sql 标签sql idallColumn id, username, age, gender, phone, delete_flag, create_time, update_time /sql2. 引用sql片段 使用include 标签select idqueryAllUser resultMapBaseMap select include refidallColumn/include from userinfo /select select idqueryById resultTypecom.example.demo.model.UserInfo select include refidallColumn/include from userinfo where id #{id} /select总结使用流程先通过sql idxxx定义片段再通过include refid xxx引用二. MyBatis GeneratorMyBatis Generator是⼀个为MyBatis框架设计的代码成成⼯具, 它可以根据数据库表结构自动生成相应 的Java 实体类 , Mapper接口 以及SQL映射文件,简化数据访问层的编码工作,使得开发者可以更专注于 业务逻辑的实现. 接下来我们看下,如何使用 MyBatisGenerator来生成代码.2.1 引入插件plugin groupIdorg.mybatis.generator/groupId artifactIdmybatis-generator-maven-plugin/artifactId version1.3.6/version executions execution idGenerate MyBatis Artifacts/id phasedeploy/phase goals goalgenerate/goal /goals /execution /executions configuration !--generator配置⽂件所在位置 -- configurationFilesrc/main/resources/mybatisGenerator/generatorConfig.xml/con figurationFile !-- 允许覆盖⽣成的⽂件, mapxml不会覆盖, 采⽤追加的⽅式-- overwritetrue/overwrite verbosetrue/verbose !--将当前pom的依赖项添加到⽣成器的类路径中-- includeCompileDependenciestrue/includeCompileDependencies /configuration dependencies dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /plugin上面的有些内容属于模板实际需要按情况进行修改比如configurationFile中的路径要和你创建的文件的路径保持一致2.2 添加generatorConfig.xml并修改⽂件路径和上述配置保持⼀致:完善文件内容?xml version1.0 encodingUTF-8? !DOCTYPE generatorConfiguration PUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd !-- 配置⽣成器 -- generatorConfiguration !-- ⼀个数据库⼀个context -- context idMysqlTables targetRuntimeMyBatis3Simple !--禁⽤⾃动⽣成的注释-- commentGenerator property namesuppressDate valuetrue/ property namesuppressAllComments valuetrue / /commentGenerator !--数据库连接信息-- jdbcConnection driverClasscom.mysql.jdbc.Driver connectionURLjdbc:mysql://127.0.0.1:3306/java_blog_spring? serverTimezoneAsia/Shanghaiamp;nullCatalogMeansCurrenttrue userIdroot passwordroot /jdbcConnection !-- ⽣成实体类, 配置路径 -- javaModelGenerator targetPackagecom.example.demo.model targetProjectsrc/main/java property nameenableSubPackages valuefalse/ property nametrimStrings valuetrue/ /javaModelGenerator !-- ⽣成mapxml⽂件 -- sqlMapGenerator targetPackagemapper targetProjectsrc/main/resources property nameenableSubPackages valuefalse / /sqlMapGenerator !-- ⽣成mapxml对应client也就是接⼝mapper -- javaClientGenerator targetPackagecom.example.demo.mapper targetProjectsrc/main/java typeXMLMAPPER property nameenableSubPackages valuefalse / /javaClientGenerator !-- table可以有多个,tableName表⽰要匹配的数据库表 -- table tableNameuser domainObjectNameUserInfo enableSelectByExampletrue enableDeleteByExampletrue enableDeleteByPrimaryKeytrue enableCountByExampletrue enableUpdateByExampletrue2.3 生成文件双击运行即可根据 generatorConfig.xml 中的具体配置 生成一个表 的Java实体类mapper接口mapper接口对应的XML文件
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2432235.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!