广州地产网站设计,优化设计高中,wordpress老版本号,东莞合一网络科技有限公司文章目录mybatis进阶#xff08;动态sql#xff09;一、if标签二、trim标签三、where标签四、set标签五、foreach标签六、include标签MyBatisGenerator1. 引入插件2. 添加 generatorConfig.xml 并修改3. 生成文件mybatis进阶…文章目录mybatis进阶动态sql一、if标签二、trim标签三、where标签四、set标签五、foreach标签六、include标签MyBatisGenerator1. 引入插件2. 添加 generatorConfig.xml 并修改3. 生成文件mybatis进阶动态sqlMybatis动态sql一、if标签在注册用户的时候分为两种字段必填字段和非必填字段那如果在添加用户的时候有不确定的字段传入程序应该如何实现呢这个时候就需要使用动态标签来判断了比如添加的时候性别gender为非必填字段具体实现如下接口定义:IntegerinsertUserByCondition(UserInfouserInfo);Mapper.xml实现:insertidinsertUserByConditionINSERT INTO userinfo ( username, password, age,iftestgender ! nullgender,/ifphone) VALUES ( #{username}, #{age},iftestgender ! null#{gender},/if#{phone})/insertQ可不可以不进行判断直接把字段设置为null呢?A不可以这种情况下如果gender字段有默认值就会设置为默认值。二、trim标签之前的插入用户功能只是有一个gender字段可能是选填项如果有多个字段一般考虑使用标签结合标签对多个字段都采取动态生成的方式。标签中有如下属性prefix表示整个语句块以 prefix 的值作为前缀suffix表示整个语句块以 suffix 的值作为后缀prefixOverrides表示整个语句块要去除掉的前缀suffixOverrides表示整个语句块要去除掉的后缀调整 Mapper.xml 的插入语句为insertidinsertUserByConditionINSERT INTO userinfotrimprefix(suffix)suffixOverrides,iftestusername !nullusername,/ififtestpassword !nullpassword,/ififtestage ! nullage,/ififtestgender ! nullgender,/ififtestphone ! nullphone,/if/trimVALUEStrimprefix(suffix)suffixOverrides,iftestusername !null#{username},/ififtestpassword !null#{password},/ififtestage ! null#{age},/ififtestgender ! null#{gender},/ififtestphone ! null#{phone}/if/trim/insert在以上sql动态解析时会将第一个部分做如下处理基于prefix配置开始部分加上(基于suffix配置结束部分加上)多个组织的语句都以 , 结尾在最后拼接好的字符串还会以,结尾会基于suffixOverrides配置去掉最后一个,注意if testusername !null中的username是传入对象的属性三、where标签selectidqueryByConditionresultTypecom.example.demo.model.UserInfoselect id, username, age, gender, phone, delete_flag, create_time, update_time from userinfowhereiftestage ! nulland age #{age}/ififtestgender ! nulland gender #{gender}/ififtestdeleteFlag ! nulland delete_flag #{deleteFlag}/if/where/selectwhere只会在子元素有内容的情况下才插入where子句而且会自动去除子句的开头的and或or。四、set标签动态的在SQL语句中插入 set 关键字并会删掉额外的逗号。(用于update语句中)updateidupdateUserByConditionupdate userinfosetiftestusername ! nullusername #{username},/ififtestage ! nullage #{age},/ififtestdeleteFlag ! nulldelete_flag #{deleteFlag},/if/setwhere id #{id}/update五、foreach标签对集合进行遍历时可以使用该标签。标签有如下属性collection绑定方法参数中的集合如 List、Set、Map 或数组对象item遍历时的每一个对象open语句块开头的字符串close语句块结束的字符串separator每次遍历之间间隔的字符串需求根据多个userid删除用户数据接口方法voiddeleteByIds(ListIntegerids);ArticleMapper.xml 中新增删除 sqldeleteiddeleteByIdsdelete from userinfo where id inforeachcollectionidsitemidseparator,open(close)#{id}/foreach/delete六、include标签问题分析在xml映射文件中配置的SQL有时可能会存在很多重复的片段此时就会存在很多冗余的代码我们可以对重复的代码片段进行抽取将其通过sql标签封装到一个SQL片段然后再通过include标签进行引用。sql定义可重用的SQL片段include通过属性refid指定包含的SQL片段sqlidallColumnid, username, age, gender, phone, delete_flag, create_time, update_time/sql通过include标签在原来抽取的地方进行引用。操作如下selectidqueryAllUserresultMapBaseMapselectincluderefidallColumn/includefrom userinfo/selectselectidqueryByIdresultTypecom.example.demo.model.UserInfoselectincluderefidallColumn/includefrom userinfo where id #{id}/selectMyBatisGeneratorMyBatisGenerator是一个为MyBatis框架设计的代码生成工具它可以根据数据库表结构自动生成相应的JavaModelMapper接口以及SQL映射文件简化数据访问层的编码工作使得开发者可以更专注于业务逻辑的实现。1. 引入插件plugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.6/versionexecutionsexecutionidGenerate MyBatis Artifacts/idphasedeploy/phasegoalsgoalgenerate/goal/goals/execution/executionsconfiguration!--generator配置文件所在位置--configurationFilesrc/main/resources/mybatisGenerator/generatorConfig.xml/configurationFile!-- 允许覆盖生成的文件, mapxml不会覆盖, 采用追加的方式--overwritetrue/overwriteverbosetrue/verbose!--将当前pom的依赖项添加到生成器的类路径中--includeCompileDependenciestrue/includeCompileDependencies/configurationdependenciesdependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency/dependencies/plugin2. 添加 generatorConfig.xml 并修改文件路径和上述配置保持一致完善文件内容?xml version1.0 encodingUTF-8?!DOCTYPEgeneratorConfigurationPUBLIC-//mybatis.org//DTD MyBatis Generator Configuration 1.0//ENhttp://mybatis.org/dtd/mybatis-generator-config_1_0.dtd!-- 配置生成器 --generatorConfiguration!-- 一个数据库一个context --contextidMysqlTablestargetRuntimeMyBatis3Simple!--禁用自动生成的注释--commentGeneratorpropertynamesuppressDatevaluetrue/propertynamesuppressAllCommentsvaluetrue//commentGenerator!--数据库连接信息--jdbcConnectiondriverClasscom.mysql.jdbc.DriverconnectionURLjdbc:mysql://127.0.0.1:3306/java_blog_spring?serverTimezoneAsia/Shanghaiamp;nullCatalogMeansCurrenttrueuserIdrootpasswordroot/jdbcConnection!-- 生成实体类, 配置路径 --javaModelGeneratortargetPackagecom.example.demo.modeltargetProjectsrc/main/javapropertynameenableSubPackagesvaluefalse/propertynametrimStringsvaluetrue//javaModelGenerator!-- 生成mapxml文件 --sqlMapGeneratortargetPackagemappertargetProjectsrc/main/resourcespropertynameenableSubPackagesvaluefalse//sqlMapGenerator!-- 生成mapxml对应client也就是接口dao --javaClientGeneratortargetPackagecom.example.demo.mappertargetProjectsrc/main/javatypeXMLMAPPERpropertynameenableSubPackagesvaluefalse//javaClientGenerator!-- table可以有多个,tableName表示要匹配的数据库表 --tabletableNameuserdomainObjectNameUserInfoenableSelectByExampletrueenableDeleteByExampletrueenableDeleteByPrimaryKeytrueenableCountByExampletrueenableUpdateByExampletrue!-- 类的属性是否用数据库中的真实字段名做为属性名, 不指定这个属性会自动转换 _ 为驼峰命名规则--propertynameuseActualColumnNamesvaluefalse/!-- 数据库表主键 --generatedKeycolumnidsqlStatementMysqlidentitytrue//table/context/generatorConfiguration3. 生成文件双击运行就可以了。