{"id":1504,"date":"2023-03-25T13:55:26","date_gmt":"2023-03-25T05:55:26","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1504"},"modified":"2023-04-28T20:23:01","modified_gmt":"2023-04-28T12:23:01","slug":"no-need-for-mapper-xml-new-features-of-mybatis-dynamic-sql","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/25\/no-need-for-mapper-xml-new-features-of-mybatis-dynamic-sql\/","title":{"rendered":"\u65e0\u9700mapper.xml\uff0cMyBatis\u65b0\u7279\u6027\u52a8\u6001SQL"},"content":{"rendered":"<p>\u5f53\u6211\u4eec\u4f7f\u7528MyBatis\u7684\u65f6\u5019\uff0c\u9700\u8981\u5728<code>mapper.xml<\/code>\u4e2d\u4e66\u5199\u5927\u91cf\u7684SQL\u8bed\u53e5\u3002\u5f53\u6211\u4eec\u4f7f\u7528MyBatis Generator\uff08MBG\uff09\u4f5c\u4e3a\u4ee3\u7801\u751f\u6210\u5668\u65f6\uff0c\u4e5f\u4f1a\u751f\u6210\u5927\u91cf\u7684<code>mapper.xml<\/code>\u6587\u4ef6\u3002\u5176\u5b9e\u4eceMBG 1.3.6\u7248\u672c\u4ee5\u540e\uff0cMyBatis\u5b98\u65b9\u5df2\u7ecf\u63a8\u8350\u4f7f\u7528Dynamic SQL\uff0c\u4f7f\u7528\u8fd9\u4e00\u65b0\u7279\u6027\u57fa\u672c\u5c31\u4e0d\u7528\u5199<code>mapper.xml<\/code>\u6587\u4ef6\u4e86\uff0c\u4f7f\u7528\u8d77\u6765\u975e\u5e38\u65b9\u4fbf\uff01<\/p>\n<h2>Dynamic SQL\u7b80\u4ecb<\/h2>\n<p><!-- more --><\/p>\n<p>\u5728\u6211\u4eec\u4f7f\u7528Spring\u7684\u65f6\u5019\uff0c\u6709XML\u548cJava\u4e24\u79cd\u914d\u7f6e\u65b9\u5f0f\u3002\u5728\u4f7f\u7528SpringBoot\u65f6\uff0c\u5df2\u7ecf\u63a8\u8350\u4f7f\u7528Java\u914d\u7f6e\uff0c\u57fa\u672c\u4e0d\u7528xml\u914d\u7f6e\u4e86\u3002\u4f7f\u7528Dynamic SQL\u5c31\u597d\u6bd4\u662f\u4f7f\u7528Java\u7684\u65b9\u5f0f\u6765\u64cd\u4f5cMyBatis\u3002Dynamic SQL\u662f\u7528\u4e8e\u751f\u6210\u52a8\u6001SQL\u8bed\u53e5\u7684\u6846\u67b6\uff0c\u63d0\u5021\u4f7f\u7528Java API\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0SQL\u64cd\u4f5c\uff0c\u652f\u6301\u590d\u6742\u67e5\u8be2\u548c\u591a\u8868\u67e5\u8be2\u3002<\/p>\n<p>Dynamic SQL\u5177\u6709\u5982\u4e0b\u7279\u6027\uff1a<\/p>\n<ul>\n<li>\u7c7b\u578b\u5b89\u5168\uff1a\u53ef\u4ee5\u786e\u4fdd\u53c2\u6570\u7c7b\u578b\u548c\u6570\u636e\u5e93\u5b57\u6bb5\u7c7b\u578b\u76f8\u5339\u914d<\/li>\n<li>\u5bcc\u6709\u8868\u73b0\u529b\uff1a\u8bed\u53e5\u7684\u6784\u5efa\u65b9\u5f0f\u53ef\u4ee5\u6e05\u695a\u5730\u4f20\u8fbe\u5176\u542b\u4e49<\/li>\n<li>\u4f7f\u7528\u7075\u6d3b\uff1a\u53ef\u4ee5\u4f7f\u7528and\uff0cor\u548cnested\u6761\u4ef6\u7684\u4efb\u610f\u7ec4\u5408\u6765\u6784\u5efawhere\u5b50\u53e5<\/li>\n<li>\u6269\u5c55\u6027\u5f3a\uff1a\u53ef\u4ee5\u540c\u65f6\u4e3aMyBatis3, Spring JDBC\u548c\u7eafJDBC\u6846\u67b6\u751f\u6210SQL\u8bed\u53e5<\/li>\n<li>\u8f7b\u91cf\u7ea7\uff1a\u53ea\u9700\u6dfb\u52a0\u4e00\u4e2a\u5c0f\u7684\u4f9d\u8d56\u9879\uff0c\u6ca1\u6709\u4f20\u9012\u4f9d\u8d56<\/li>\n<\/ul>\n<h2>\u96c6\u6210Dynamic SQL<\/h2>\n<p>\uff081\uff09\u5728<code>pom.xml<\/code>\u4e2d\u6dfb\u52a0\u5982\u4e0b\u4f9d\u8d56\uff0c\u5bf9\u6bd4\u4e4b\u524d\u4f7f\u7528MBG\uff0c\u4ec5\u4ec5\u591a\u6dfb\u52a0\u4e86MyBatis\u7684\u52a8\u6001SQL\u4f9d\u8d56<\/p>\n<pre><code class=\"language-xml\">&lt;dependencies&gt;\n    &lt;!--SpringBoot\u6574\u5408MyBatis--&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.mybatis.spring.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-spring-boot-starter&lt;\/artifactId&gt;\n        &lt;version&gt;2.1.3&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!--MyBatis\u5206\u9875\u63d2\u4ef6--&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.github.pagehelper&lt;\/groupId&gt;\n        &lt;artifactId&gt;pagehelper-spring-boot-starter&lt;\/artifactId&gt;\n        &lt;version&gt;1.3.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!--\u96c6\u6210druid\u8fde\u63a5\u6c60--&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n        &lt;artifactId&gt;druid-spring-boot-starter&lt;\/artifactId&gt;\n        &lt;version&gt;1.1.10&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- MyBatis \u751f\u6210\u5668 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.mybatis.generator&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-generator-core&lt;\/artifactId&gt;\n        &lt;version&gt;1.4.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- MyBatis \u52a8\u6001SQL\u652f\u6301 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.mybatis.dynamic-sql&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-dynamic-sql&lt;\/artifactId&gt;\n        &lt;version&gt;1.2.1&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!--Mysql\u6570\u636e\u5e93\u9a71\u52a8--&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;mysql&lt;\/groupId&gt;\n        &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n        &lt;version&gt;8.0.15&lt;\/version&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/code><\/pre>\n<p>\uff082\uff09\u5728<code>application.yml<\/code>\u4e2d\u5bf9\u6570\u636e\u6e90\u548cMyBatis\u7684<code>mapper.xml<\/code>\u6587\u4ef6\u8def\u5f84\u8fdb\u884c\u914d\u7f6e\uff0c\u53ea\u9700\u914d\u7f6e\u81ea\u5b9a\u4e49mapper.xml\u8def\u5f84\u5373\u53ef<\/p>\n<pre><code class=\"language-yml\">spring:\n  datasource:\n    url: jdbc:mysql:\/\/localhost:3306\/mall?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia\/Shanghai\n    username: root\n    password: root\n\nmybatis:\n  mapper-locations:\n    - classpath:dao\/*.xml<\/code><\/pre>\n<p>\uff083\uff09\u6dfb\u52a0Java\u914d\u7f6e\uff0c\u7528\u4e8e\u626b\u63cfMapper\u63a5\u53e3\u8def\u5f84\uff0cMBG\u751f\u6210\u7684\u653e\u5728mapper\u5305\u4e0b\uff0c\u81ea\u5b9a\u4e49\u7684\u653e\u5728dao\u5305\u4e0b<\/p>\n<pre><code class=\"language-java\">\/**\n * MyBatis\u914d\u7f6e\u7c7b\n *\/\n@Configuration\n@MapperScan({&quot;cn.appblog.mall.tiny.mbg.mapper&quot;, &quot;cn.appblog.mall.tiny.dao&quot;})\npublic class MyBatisConfig {\n}<\/code><\/pre>\n<h2>\u4f7f\u7528\u4ee3\u7801\u751f\u6210\u5668<\/h2>\n<p>\uff081\uff09\u5728\u4f7f\u7528MBG\u751f\u6210\u4ee3\u7801\u524d\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u5bf9\u5176\u8fdb\u884c\u4e00\u4e9b\u914d\u7f6e\uff0c\u9996\u5148\u5728<code>generator.properties<\/code>\u6587\u4ef6\u4e2d\u914d\u7f6e\u597d\u6570\u636e\u5e93\u8fde\u63a5\u4fe1\u606f<\/p>\n<pre><code>jdbc.driverClass=com.mysql.cj.jdbc.Driver\njdbc.connectionURL=jdbc:mysql:\/\/localhost:3306\/mall?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia\/Shanghai\njdbc.userId=root\njdbc.password=root<\/code><\/pre>\n<p>\uff082\uff09\u7136\u540e\u5728<code>generatorConfig.xml<\/code>\u6587\u4ef6\u4e2d\u5bf9MBG\u8fdb\u884c\u914d\u7f6e\uff0c\u914d\u7f6e\u5c5e\u6027\u8bf4\u660e\u76f4\u63a5\u53c2\u8003\u6ce8\u91ca\u5373\u53ef<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;!DOCTYPE generatorConfiguration\n        PUBLIC &quot;-\/\/mybatis.org\/\/DTD MyBatis Generator Configuration 1.0\/\/EN&quot;\n        &quot;http:\/\/mybatis.org\/dtd\/mybatis-generator-config_1_0.dtd&quot;&gt;\n\n&lt;generatorConfiguration&gt;\n    &lt;properties resource=&quot;generator.properties&quot;\/&gt;\n    &lt;context id=&quot;MySqlContext&quot; targetRuntime=&quot;MyBatis3DynamicSQL&quot;&gt;\n        &lt;property name=&quot;beginningDelimiter&quot; value=&quot;`&quot;\/&gt;\n        &lt;property name=&quot;endingDelimiter&quot; value=&quot;`&quot;\/&gt;\n        &lt;property name=&quot;javaFileEncoding&quot; value=&quot;UTF-8&quot;\/&gt;\n        &lt;!-- \u4e3a\u6a21\u578b\u751f\u6210\u5e8f\u5217\u5316\u65b9\u6cd5--&gt;\n        &lt;plugin type=&quot;org.mybatis.generator.plugins.SerializablePlugin&quot;\/&gt;\n        &lt;!-- \u4e3a\u751f\u6210\u7684Java\u6a21\u578b\u521b\u5efa\u4e00\u4e2atoString\u65b9\u6cd5 --&gt;\n        &lt;plugin type=&quot;org.mybatis.generator.plugins.ToStringPlugin&quot;\/&gt;\n        &lt;!--\u53ef\u4ee5\u81ea\u5b9a\u4e49\u751f\u6210model\u7684\u4ee3\u7801\u6ce8\u91ca--&gt;\n        &lt;commentGenerator type=&quot;cn.appblog.mall.tiny.mbg.CommentGenerator&quot;&gt;\n            &lt;!-- \u662f\u5426\u53bb\u9664\u81ea\u52a8\u751f\u6210\u7684\u6ce8\u91ca true\uff1a\u662f \uff1afalse:\u5426 --&gt;\n            &lt;property name=&quot;suppressAllComments&quot; value=&quot;true&quot;\/&gt;\n            &lt;property name=&quot;suppressDate&quot; value=&quot;true&quot;\/&gt;\n            &lt;property name=&quot;addRemarkComments&quot; value=&quot;true&quot;\/&gt;\n        &lt;\/commentGenerator&gt;\n        &lt;!--\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5--&gt;\n        &lt;jdbcConnection driverClass=&quot;${jdbc.driverClass}&quot;\n                        connectionURL=&quot;${jdbc.connectionURL}&quot;\n                        userId=&quot;${jdbc.userId}&quot;\n                        password=&quot;${jdbc.password}&quot;&gt;\n            &lt;!--\u89e3\u51b3mysql\u9a71\u52a8\u5347\u7ea7\u52308.0\u540e\u4e0d\u751f\u6210\u6307\u5b9a\u6570\u636e\u5e93\u4ee3\u7801\u7684\u95ee\u9898--&gt;\n            &lt;property name=&quot;nullCatalogMeansCurrent&quot; value=&quot;true&quot; \/&gt;\n        &lt;\/jdbcConnection&gt;\n        &lt;!--\u6307\u5b9a\u751f\u6210model\u7684\u8def\u5f84--&gt;\n        &lt;javaModelGenerator targetPackage=&quot;cn.appblog.mall.tiny.mbg.model&quot; targetProject=&quot;mall-tiny-dynamic-sql\\src\\main\\java&quot;\/&gt;\n        &lt;!--\u6307\u5b9a\u751f\u6210mapper\u63a5\u53e3\u7684\u7684\u8def\u5f84--&gt;\n        &lt;javaClientGenerator type=&quot;XMLMAPPER&quot; targetPackage=&quot;cn.appblog.mall.tiny.mbg.mapper&quot;\n                             targetProject=&quot;mall-tiny-dynamic-sql\\src\\main\\java&quot;\/&gt;\n        &lt;!--\u751f\u6210\u5168\u90e8\u8868tableName\u8bbe\u4e3a%--&gt;\n        &lt;table tableName=&quot;ums_admin&quot;&gt;\n            &lt;generatedKey column=&quot;id&quot; sqlStatement=&quot;MySql&quot; identity=&quot;true&quot;\/&gt;\n        &lt;\/table&gt;\n        &lt;table tableName=&quot;ums_role&quot;&gt;\n            &lt;generatedKey column=&quot;id&quot; sqlStatement=&quot;MySql&quot; identity=&quot;true&quot;\/&gt;\n        &lt;\/table&gt;\n        &lt;table tableName=&quot;ums_admin_role_relation&quot;&gt;\n            &lt;generatedKey column=&quot;id&quot; sqlStatement=&quot;MySql&quot; identity=&quot;true&quot;\/&gt;\n        &lt;\/table&gt;\n    &lt;\/context&gt;\n&lt;\/generatorConfiguration&gt;<\/code><\/pre>\n<p>\uff083\uff09\u4e0e\u4e4b\u524d\u4f7f\u7528MBG\u6709\u6240\u4e0d\u540c\uff0c<code>targetRuntime<\/code>\u9700\u8981\u6539\u4e3a<code>MyBatis3DynamicSql<\/code>\uff0c\u7528\u4e8e\u914d\u7f6e\u751f\u6210<code>mapper.xml<\/code>\u8def\u5f84\u7684<code>sqlMapGenerator<\/code>\u6807\u7b7e\u4e5f\u4e0d\u9700\u8981\u914d\u7f6e\u4e86<\/p>\n<p>\uff084\uff09\u4e4b\u524d\u4f7f\u7528MBG\u65f6\u81ea\u5b9a\u4e49\u4e86\u5b9e\u4f53\u7c7b\u6ce8\u89e3\u7684\u751f\u6210\uff0c\u5199\u4e86\u4e2a\u7c7b<code>CommentGenerator<\/code>\u7ee7\u627f<code>DefaultCommentGenerator<\/code>\uff0c\u5728<code>addFieldComment<\/code>\u65b9\u6cd5\u4e2d\u5c06<code>Swagger<\/code>\u6ce8\u89e3\u5199\u5165\u5230\u4e86\u5b9e\u4f53\u7c7b\u7684\u5c5e\u6027\u4e0a<\/p>\n<pre><code class=\"language-java\">\/**\n * \u81ea\u5b9a\u4e49\u6ce8\u91ca\u751f\u6210\u5668\n *\/\npublic class CommentGenerator extends DefaultCommentGenerator {\n    \/**\n     * \u7ed9\u5b57\u6bb5\u6dfb\u52a0\u6ce8\u91ca\n     *\/\n    @Override\n    public void addFieldComment(Field field, IntrospectedTable introspectedTable,\n                                IntrospectedColumn introspectedColumn) {\n        String remarks = introspectedColumn.getRemarks();\n        \/\/\u6839\u636e\u53c2\u6570\u548c\u5907\u6ce8\u4fe1\u606f\u5224\u65ad\u662f\u5426\u6dfb\u52a0\u5907\u6ce8\u4fe1\u606f\n        if (addRemarkComments&amp;&amp;StringUtility.stringHasValue(remarks)) {\n            \/\/\u6570\u636e\u5e93\u4e2d\u7279\u6b8a\u5b57\u7b26\u9700\u8981\u8f6c\u4e49\n            if (remarks.contains(&quot;\\&quot;&quot;)) {\n                remarks = remarks.replace(&quot;\\&quot;&quot;, &quot;&#039;&quot;);\n            }\n            \/\/\u7ed9model\u7684\u5b57\u6bb5\u6dfb\u52a0swagger\u6ce8\u89e3\n            field.addJavaDocLine(&quot;@ApiModelProperty(value = \\&quot;&quot; + remarks + &quot;\\&quot;)&quot;);\n        }\n    }\n}<\/code><\/pre>\n<p>\uff085\uff09\u5728\u4f7f\u7528Dynamic SQL\u7684\u65f6\u5019\uff0c\u8fd9\u79cd\u65b9\u6cd5\u5df2\u7ecf\u65e0\u7528\uff0c\u9700\u8981\u5728<code>addFieldAnnotation<\/code>\u4e2d\u5c06Swagger\u6ce8\u89e3\u5199\u5165\u5230\u4e86\u5b9e\u4f53\u7c7b\u7684\u5c5e\u6027\u4e0a<\/p>\n<pre><code class=\"language-java\">\/**\n * \u81ea\u5b9a\u4e49\u6ce8\u91ca\u751f\u6210\u5668\n *\/\npublic class CommentGenerator extends DefaultCommentGenerator {\n\n    @Override\n    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set&lt;FullyQualifiedJavaType&gt; imports) {\n        if (!addRemarkComments || CollUtil.isEmpty(imports)) return;\n        long count = imports.stream()\n                .filter(item -&gt; API_MODEL_PROPERTY_FULL_CLASS_NAME.equals(item.getFullyQualifiedName()))\n                .count();\n        if (count &lt;= 0L) {\n            return;\n        }\n        String remarks = introspectedColumn.getRemarks();\n        \/\/\u6839\u636e\u53c2\u6570\u548c\u5907\u6ce8\u4fe1\u606f\u5224\u65ad\u662f\u5426\u6dfb\u52a0\u5907\u6ce8\u4fe1\u606f\n        if (StringUtility.stringHasValue(remarks)) {\n            \/\/\u6570\u636e\u5e93\u4e2d\u7279\u6b8a\u5b57\u7b26\u9700\u8981\u8f6c\u4e49\n            if (remarks.contains(&quot;\\&quot;&quot;)) {\n                remarks = remarks.replace(&quot;\\&quot;&quot;, &quot;&#039;&quot;);\n            }\n            \/\/\u7ed9model\u7684\u5b57\u6bb5\u6dfb\u52a0swagger\u6ce8\u89e3\n            field.addJavaDocLine(&quot;@ApiModelProperty(value = \\&quot;&quot; + remarks + &quot;\\&quot;)&quot;);\n        }\n    }\n}<\/code><\/pre>\n<p>\uff086\uff09\u4e00\u5207\u51c6\u5907\u5c31\u7eea\uff0c\u6267\u884cGenerator\u7c7b\u7684main\u65b9\u6cd5\uff0c\u751f\u6210\u4ee3\u7801\u7ed3\u6784\u4fe1\u606f\u5982\u4e0b\uff0c\u53ef\u4ee5\u53d1\u73b0\u5df2\u7ecf\u4e0d\u518d\u751f\u6210<code>mapper.xml<\/code>\u6587\u4ef6\u548cExample\u7c7b\uff0c\u53d6\u800c\u4ee3\u4e4b\u7684\u662f\u751f\u6210\u4e86<code>DynamicSqlSupport<\/code>\u7c7b<\/p>\n<h2>\u5b9e\u73b0\u57fa\u672c\u7684CRUD\u64cd\u4f5c<\/h2>\n<p>\uff081\uff09\u67e5\u770b\u4e0bMBG\u751f\u6210\u7684Mapper\u63a5\u53e3\uff0c\u6bd4\u4e4b\u524d\u4f7f\u7528MBG\u65f6\u589e\u52a0\u4e86\u5f88\u591a\u65b9\u6cd5\uff0c\u5e76\u4e14\u6709\u4e86\u4e00\u4e9b\u9ed8\u8ba4\u7684\u65b9\u6cd5\u5b9e\u73b0\uff0c\u53ef\u89c1\u4e4b\u524d\u5728<code>mapper.xml<\/code>\u4e2d\u7684\u5b9e\u73b0\u90fd\u5df2\u7ecf\u8f6c\u79fb\u5230Mapper\u63a5\u53e3\u4e2d\u53bb\u4e86\uff0c\u5355\u8868CRUD\u76f4\u63a5\u8c03\u7528\u5bf9\u5e94\u65b9\u6cd5\u5373\u53ef<\/p>\n<pre><code class=\"language-java\">@Mapper\npublic interface UmsAdminMapper {\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    BasicColumn[] selectList = BasicColumn.columnList(id, username, password, icon, email, nickName, note, createTime, loginTime, status);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    @SelectProvider(type=SqlProviderAdapter.class, method=&quot;select&quot;)\n    long count(SelectStatementProvider selectStatement);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    @DeleteProvider(type=SqlProviderAdapter.class, method=&quot;delete&quot;)\n    int delete(DeleteStatementProvider deleteStatement);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    @InsertProvider(type=SqlProviderAdapter.class, method=&quot;insert&quot;)\n    @SelectKey(statement=&quot;SELECT LAST_INSERT_ID()&quot;, keyProperty=&quot;record.id&quot;, before=false, resultType=Long.class)\n    int insert(InsertStatementProvider&lt;UmsAdmin&gt; insertStatement);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    @SelectProvider(type=SqlProviderAdapter.class, method=&quot;select&quot;)\n    @ResultMap(&quot;UmsAdminResult&quot;)\n    Optional&lt;UmsAdmin&gt; selectOne(SelectStatementProvider selectStatement);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    @SelectProvider(type=SqlProviderAdapter.class, method=&quot;select&quot;)\n    @Results(id=&quot;UmsAdminResult&quot;, value = {\n        @Result(column=&quot;id&quot;, property=&quot;id&quot;, jdbcType=JdbcType.BIGINT, id=true),\n        @Result(column=&quot;username&quot;, property=&quot;username&quot;, jdbcType=JdbcType.VARCHAR),\n        @Result(column=&quot;password&quot;, property=&quot;password&quot;, jdbcType=JdbcType.VARCHAR),\n        @Result(column=&quot;icon&quot;, property=&quot;icon&quot;, jdbcType=JdbcType.VARCHAR),\n        @Result(column=&quot;email&quot;, property=&quot;email&quot;, jdbcType=JdbcType.VARCHAR),\n        @Result(column=&quot;nick_name&quot;, property=&quot;nickName&quot;, jdbcType=JdbcType.VARCHAR),\n        @Result(column=&quot;note&quot;, property=&quot;note&quot;, jdbcType=JdbcType.VARCHAR),\n        @Result(column=&quot;create_time&quot;, property=&quot;createTime&quot;, jdbcType=JdbcType.TIMESTAMP),\n        @Result(column=&quot;login_time&quot;, property=&quot;loginTime&quot;, jdbcType=JdbcType.TIMESTAMP),\n        @Result(column=&quot;status&quot;, property=&quot;status&quot;, jdbcType=JdbcType.INTEGER)\n    })\n    List&lt;UmsAdmin&gt; selectMany(SelectStatementProvider selectStatement);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    @UpdateProvider(type=SqlProviderAdapter.class, method=&quot;update&quot;)\n    int update(UpdateStatementProvider updateStatement);\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default long count(CountDSLCompleter completer) {\n        return MyBatis3Utils.countFrom(this::count, umsAdmin, completer);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int delete(DeleteDSLCompleter completer) {\n        return MyBatis3Utils.deleteFrom(this::delete, umsAdmin, completer);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int deleteByPrimaryKey(Long id_) {\n        return delete(c -&gt; \n            c.where(id, isEqualTo(id_))\n        );\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int insert(UmsAdmin record) {\n        return MyBatis3Utils.insert(this::insert, record, umsAdmin, c -&gt;\n            c.map(username).toProperty(&quot;username&quot;)\n            .map(password).toProperty(&quot;password&quot;)\n            .map(icon).toProperty(&quot;icon&quot;)\n            .map(email).toProperty(&quot;email&quot;)\n            .map(nickName).toProperty(&quot;nickName&quot;)\n            .map(note).toProperty(&quot;note&quot;)\n            .map(createTime).toProperty(&quot;createTime&quot;)\n            .map(loginTime).toProperty(&quot;loginTime&quot;)\n            .map(status).toProperty(&quot;status&quot;)\n        );\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int insertSelective(UmsAdmin record) {\n        return MyBatis3Utils.insert(this::insert, record, umsAdmin, c -&gt;\n            c.map(username).toPropertyWhenPresent(&quot;username&quot;, record::getUsername)\n            .map(password).toPropertyWhenPresent(&quot;password&quot;, record::getPassword)\n            .map(icon).toPropertyWhenPresent(&quot;icon&quot;, record::getIcon)\n            .map(email).toPropertyWhenPresent(&quot;email&quot;, record::getEmail)\n            .map(nickName).toPropertyWhenPresent(&quot;nickName&quot;, record::getNickName)\n            .map(note).toPropertyWhenPresent(&quot;note&quot;, record::getNote)\n            .map(createTime).toPropertyWhenPresent(&quot;createTime&quot;, record::getCreateTime)\n            .map(loginTime).toPropertyWhenPresent(&quot;loginTime&quot;, record::getLoginTime)\n            .map(status).toPropertyWhenPresent(&quot;status&quot;, record::getStatus)\n        );\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default Optional&lt;UmsAdmin&gt; selectOne(SelectDSLCompleter completer) {\n        return MyBatis3Utils.selectOne(this::selectOne, selectList, umsAdmin, completer);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default List&lt;UmsAdmin&gt; select(SelectDSLCompleter completer) {\n        return MyBatis3Utils.selectList(this::selectMany, selectList, umsAdmin, completer);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default List&lt;UmsAdmin&gt; selectDistinct(SelectDSLCompleter completer) {\n        return MyBatis3Utils.selectDistinct(this::selectMany, selectList, umsAdmin, completer);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default Optional&lt;UmsAdmin&gt; selectByPrimaryKey(Long id_) {\n        return selectOne(c -&gt;\n            c.where(id, isEqualTo(id_))\n        );\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int update(UpdateDSLCompleter completer) {\n        return MyBatis3Utils.update(this::update, umsAdmin, completer);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    static UpdateDSL&lt;UpdateModel&gt; updateAllColumns(UmsAdmin record, UpdateDSL&lt;UpdateModel&gt; dsl) {\n        return dsl.set(username).equalTo(record::getUsername)\n                .set(password).equalTo(record::getPassword)\n                .set(icon).equalTo(record::getIcon)\n                .set(email).equalTo(record::getEmail)\n                .set(nickName).equalTo(record::getNickName)\n                .set(note).equalTo(record::getNote)\n                .set(createTime).equalTo(record::getCreateTime)\n                .set(loginTime).equalTo(record::getLoginTime)\n                .set(status).equalTo(record::getStatus);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    static UpdateDSL&lt;UpdateModel&gt; updateSelectiveColumns(UmsAdmin record, UpdateDSL&lt;UpdateModel&gt; dsl) {\n        return dsl.set(username).equalToWhenPresent(record::getUsername)\n                .set(password).equalToWhenPresent(record::getPassword)\n                .set(icon).equalToWhenPresent(record::getIcon)\n                .set(email).equalToWhenPresent(record::getEmail)\n                .set(nickName).equalToWhenPresent(record::getNickName)\n                .set(note).equalToWhenPresent(record::getNote)\n                .set(createTime).equalToWhenPresent(record::getCreateTime)\n                .set(loginTime).equalToWhenPresent(record::getLoginTime)\n                .set(status).equalToWhenPresent(record::getStatus);\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int updateByPrimaryKey(UmsAdmin record) {\n        return update(c -&gt;\n            c.set(username).equalTo(record::getUsername)\n            .set(password).equalTo(record::getPassword)\n            .set(icon).equalTo(record::getIcon)\n            .set(email).equalTo(record::getEmail)\n            .set(nickName).equalTo(record::getNickName)\n            .set(note).equalTo(record::getNote)\n            .set(createTime).equalTo(record::getCreateTime)\n            .set(loginTime).equalTo(record::getLoginTime)\n            .set(status).equalTo(record::getStatus)\n            .where(id, isEqualTo(record::getId))\n        );\n    }\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    default int updateByPrimaryKeySelective(UmsAdmin record) {\n        return update(c -&gt;\n            c.set(username).equalToWhenPresent(record::getUsername)\n            .set(password).equalToWhenPresent(record::getPassword)\n            .set(icon).equalToWhenPresent(record::getIcon)\n            .set(email).equalToWhenPresent(record::getEmail)\n            .set(nickName).equalToWhenPresent(record::getNickName)\n            .set(note).equalToWhenPresent(record::getNote)\n            .set(createTime).equalToWhenPresent(record::getCreateTime)\n            .set(loginTime).equalToWhenPresent(record::getLoginTime)\n            .set(status).equalToWhenPresent(record::getStatus)\n            .where(id, isEqualTo(record::getId))\n        );\n    }\n}<\/code><\/pre>\n<p>\uff082\uff09\u751f\u6210\u4ee3\u7801\u4e2d\u6709\u4e00\u4e9b<code>DynamicSqlSupport<\/code>\u7c7b\uff0c\u6bd4\u5982<code>UmsAdminDynamicSqlSupport<\/code>\uff0c\u4e3b\u8981\u662f\u628a\u6570\u636e\u5e93\u8868\u548c\u5b57\u6bb5\u62bd\u8c61\u6210\u4e86<code>SqlTable<\/code>\u548c<code>SqlColumn<\/code>\u5bf9\u8c61\uff0c\u4f30\u8ba1\u662f\u4e3a\u4e86\u9632\u6b62\u6211\u4eec\u786c\u7f16\u7801<\/p>\n<pre><code class=\"language-java\">public final class UmsAdminDynamicSqlSupport {\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    public static final UmsAdmin umsAdmin = new UmsAdmin();\n\n    public static final SqlColumn&lt;Long&gt; id = umsAdmin.id;\n\n    public static final SqlColumn&lt;String&gt; username = umsAdmin.username;\n\n    public static final SqlColumn&lt;String&gt; password = umsAdmin.password;\n\n    public static final SqlColumn&lt;String&gt; icon = umsAdmin.icon;\n\n    public static final SqlColumn&lt;String&gt; email = umsAdmin.email;\n\n    public static final SqlColumn&lt;String&gt; nickName = umsAdmin.nickName;\n\n    public static final SqlColumn&lt;String&gt; note = umsAdmin.note;\n\n    public static final SqlColumn&lt;Date&gt; createTime = umsAdmin.createTime;\n\n    public static final SqlColumn&lt;Date&gt; loginTime = umsAdmin.loginTime;\n\n    public static final SqlColumn&lt;Integer&gt; status = umsAdmin.status;\n\n    @Generated(&quot;org.mybatis.generator.api.MyBatisGenerator&quot;)\n    public static final class UmsAdmin extends SqlTable {\n        public final SqlColumn&lt;Long&gt; id = column(&quot;id&quot;, JDBCType.BIGINT);\n\n        public final SqlColumn&lt;String&gt; username = column(&quot;username&quot;, JDBCType.VARCHAR);\n\n        public final SqlColumn&lt;String&gt; password = column(&quot;password&quot;, JDBCType.VARCHAR);\n\n        public final SqlColumn&lt;String&gt; icon = column(&quot;icon&quot;, JDBCType.VARCHAR);\n\n        public final SqlColumn&lt;String&gt; email = column(&quot;email&quot;, JDBCType.VARCHAR);\n\n        public final SqlColumn&lt;String&gt; nickName = column(&quot;nick_name&quot;, JDBCType.VARCHAR);\n\n        public final SqlColumn&lt;String&gt; note = column(&quot;note&quot;, JDBCType.VARCHAR);\n\n        public final SqlColumn&lt;Date&gt; createTime = column(&quot;create_time&quot;, JDBCType.TIMESTAMP);\n\n        public final SqlColumn&lt;Date&gt; loginTime = column(&quot;login_time&quot;, JDBCType.TIMESTAMP);\n\n        public final SqlColumn&lt;Integer&gt; status = column(&quot;status&quot;, JDBCType.INTEGER);\n\n        public UmsAdmin() {\n            super(&quot;ums_admin&quot;);\n        }\n    }\n}<\/code><\/pre>\n<p>\uff083\uff09\u5229\u7528\u597dMBG\u751f\u6210\u7684\u4ee3\u7801\u5373\u53ef\u5b8c\u6210\u5355\u8868\u7684CRUD\u64cd\u4f5c\uff0c\u6bd4\u5982\u4e0b\u9762\u6700\u5e38\u89c1\u7684\u64cd\u4f5c<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Autowired\n    private UmsAdminMapper adminMapper;\n\n    @Override\n    public void create(UmsAdmin entity) {\n        adminMapper.insert(entity);\n    }\n\n    @Override\n    public void update(UmsAdmin entity) {\n        adminMapper.updateByPrimaryKeySelective(entity);\n    }\n\n    @Override\n    public void delete(Long id) {\n        adminMapper.deleteByPrimaryKey(id);\n    }\n\n    @Override\n    public UmsAdmin select(Long id) {\n        Optional&lt;UmsAdmin&gt; optionalEntity = adminMapper.selectByPrimaryKey(id);\n        return optionalEntity.orElse(null);\n    }\n\n    @Override\n    public List&lt;UmsAdmin&gt; listAll(Integer pageNum, Integer pageSize) {\n        PageHelper.startPage(pageNum, pageSize);\n        return adminMapper.select(SelectDSLCompleter.allRows());\n    }\n}<\/code><\/pre>\n<h2>\u8fdb\u9636\u4f7f\u7528<\/h2>\n<p>\u60f3\u8981\u7528\u597dDynamic SQL\uff0c\u4e0a\u9762\u7684\u57fa\u7840\u64cd\u4f5c\u662f\u4e0d\u591f\u7684\uff0c\u8fd8\u9700\u8981\u4e00\u4e9b\u8fdb\u9636\u7684\u4f7f\u7528\u6280\u5de7\u3002<\/p>\n<h3>SqlBuilder<\/h3>\n<p>SqlBuilder\u662f\u4e00\u4e2a\u975e\u5e38\u6709\u7528\u7684\u7c7b\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u7075\u6d3b\u5730\u6784\u5efaSQL\u8bed\u53e5\u7684\u6761\u4ef6\uff0c\u4e00\u4e9b\u5e38\u7528\u7684\u6761\u4ef6\u6784\u5efa\u65b9\u6cd5\u5982\u4e0b\u3002<\/p>\n<p>\u6761\u4ef6    \u4f8b\u5b50    \u5bf9\u5e94SQL<br \/>\nBetween    where(foo, isBetween(x).and(y))    where foo between ? and ?<br \/>\nEquals    where(foo, isEqualTo(x))    where foo = ?<br \/>\nGreater Than    where(foo, isGreaterThan(x))    where foo &gt; ?<br \/>\nIn    where(foo, isIn(x, y))    where foo in (?,?)<br \/>\nLike    where(foo, isLike(x))    where foo like ?<br \/>\nNot Equals    where(foo, isNotEqualTo(x))    where foo &lt;&gt; ?<br \/>\nNull    where(foo, isNull())    where foo is null<br \/>\nPresent Equals    where(foo, isEqualToWhenPresent(x))    where foo = ? (will render if x is non-null)<\/p>\n<h3>StatementProvider<\/h3>\n<p>\u56de\u60f3\u4e00\u4e0b\u4e4b\u524d\u6211\u4eec\u5728<code>mapper.xml<\/code>\u4e2d\u5b9a\u4e49select\u6807\u7b7e\u7684\u65b9\u5f0f\uff0c\u5404\u4e2aselect\u6807\u7b7e\u76f8\u5f53\u4e8eStatement\u3002\u800c\u8fd9\u91cc\u7684<code>StatementProvider<\/code>\u597d\u6bd4\u662fStatement\u4e2d\u53c2\u6570\u548cSQL\u8bed\u53e5\u7684\u5c01\u88c5\uff0c\u65b9\u4fbf\u4ee5Java\u7684\u65b9\u5f0f\u521b\u5efaStatement\u3002<\/p>\n<h3>\u6761\u4ef6\u67e5\u8be2<\/h3>\n<p>\u4f7f\u7528SqlBuilder\u7c7b\u6784\u5efa<code>StatementProvider<\/code>\uff0c\u7136\u540e\u8c03\u7528Mapper\u63a5\u53e3\u4e2d\u7684\u65b9\u6cd5\u5373\u53ef\u3002<\/p>\n<p>\uff081\uff09\u8fd9\u91cc\u4ee5\u6309\u7528\u6237\u540d\u548c\u72b6\u6001\u67e5\u8be2\u540e\u53f0\u7528\u6237\u5e76\u6309\u521b\u5efa\u65f6\u95f4\u964d\u5e8f\u6392\u5217\u4e3a\u4f8b\uff0cSQL\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sql\">SELECT\n id,\n username,\n PASSWORD,\n icon,\n email,\n nick_name,\n note,\n create_time,\n login_time,\nSTATUS \nFROM\n ums_admin \nWHERE\n ( username = &#039;joe&#039; AND STATUS IN ( 0, 1 ) ) \nORDER BY\n create_time DESC;<\/code><\/pre>\n<p>\uff082\uff09\u4f7f\u7528Dynamic SQL\u5bf9\u5e94\u7684Java\u4ee3\u7801\u5b9e\u73b0\u5982\u4e0b\uff0c\u4f7f\u7528SqlBuilder\u7684select\u65b9\u6cd5\u53ef\u4ee5\u6307\u5b9a\u67e5\u8be2\u5217\uff0c\u4f7f\u7528from\u65b9\u6cd5\u53ef\u4ee5\u6307\u5b9a\u67e5\u8be2\u8868\uff0c\u4f7f\u7528where\u65b9\u6cd5\u53ef\u4ee5\u6784\u5efa\u67e5\u8be2\u6761\u4ef6\uff0c\u4f7f\u7528orderBy\u65b9\u6cd5\u53ef\u4ee5\u6307\u5b9a\u6392\u5e8f\u3002<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Override\n    public List&lt;UmsAdmin&gt; list(Integer pageNum, Integer pageSize, String username, List&lt;Integer&gt; statusList) {\n        PageHelper.startPage(pageNum, pageSize);\n        SelectStatementProvider selectStatement = SqlBuilder.select(UmsAdminMapper.selectList)\n                .from(UmsAdminDynamicSqlSupport.umsAdmin)\n                .where(UmsAdminDynamicSqlSupport.username, isEqualToWhenPresent(username))\n                .and(UmsAdminDynamicSqlSupport.status, isIn(statusList))\n                .orderBy(UmsAdminDynamicSqlSupport.createTime.descending())\n                .build()\n                .render(RenderingStrategies.MYBATIS3);\n        return adminMapper.selectMany(selectStatement);\n    }\n}<\/code><\/pre>\n<h3>Lambda\u6761\u4ef6\u67e5\u8be2<\/h3>\n<p>\u4f7f\u7528Lambda\u8868\u8fbe\u5f0f\u5b9e\u73b0\u5355\u8868\u6761\u4ef6\u67e5\u8be2\u66f4\u52a0\u7b80\u5355\uff0c\u5b9e\u73b0\u4e0a\u9762\u7684\u6761\u4ef6\u67e5\u8be2\uff0c\u5bf9\u5e94Java\u4ee3\u7801\u5b9e\u73b0\u5982\u4e0b\u3002<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Override\n    public List&lt;UmsAdmin&gt; lambdaList(Integer pageNum, Integer pageSize, String username, List&lt;Integer&gt; statusList) {\n        PageHelper.startPage(pageNum, pageSize);\n        List&lt;UmsAdmin&gt; list = adminMapper.select(c -&gt; c.where(UmsAdminDynamicSqlSupport.username, isEqualToWhenPresent(username))\n                .and(UmsAdminDynamicSqlSupport.status, isIn(statusList))\n                .orderBy(UmsAdminDynamicSqlSupport.createTime.descending()));\n        return list;\n    }\n}<\/code><\/pre>\n<h3>\u5b50\u67e5\u8be2<\/h3>\n<p>\u4e4b\u524d\u4f7f\u7528MBG\u9700\u8981\u5728<code>mapper.xml<\/code>\u4e2d\u624b\u5199SQL\u624d\u80fd\u5b9e\u73b0\u5b50\u67e5\u8be2\uff0c\u4f7f\u7528Dynamic SQL\u53ef\u4ee5\u76f4\u63a5\u5728Java\u4ee3\u7801\u4e2d\u5b9e\u73b0\u3002<\/p>\n<p>\uff081\uff09\u8fd9\u91cc\u4ee5\u6309\u89d2\u8272ID\u67e5\u8be2\u540e\u53f0\u7528\u6237\u4e3a\u4f8b\uff0cSQL\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sql\">SELECT\n *\nFROM\n ums_admin\nWHERE\n id IN ( SELECT admin_id FROM ums_admin_role_relation WHERE role_id = 1 )<\/code><\/pre>\n<p>\uff082\uff09\u4f7f\u7528Dynamic SQL\u5bf9\u5e94\u7684Java\u4ee3\u7801\u5b9e\u73b0\u5982\u4e0b\uff0c\u53ef\u4ee5\u53d1\u73b0SqlBuilder\u7684\u6761\u4ef6\u6784\u9020\u65b9\u6cd5<code>isIn<\/code>\u4e2d\u8fd8\u53ef\u4ee5\u5d4c\u5957SqlBuilder\u7684\u67e5\u8be2<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Override\n    public List&lt;UmsAdmin&gt; subList(Long roleId) {\n        SelectStatementProvider selectStatement = SqlBuilder.select(UmsAdminMapper.selectList)\n                .from(UmsAdminDynamicSqlSupport.umsAdmin)\n                .where(UmsAdminDynamicSqlSupport.id, isIn(SqlBuilder.select(UmsAdminRoleRelationDynamicSqlSupport.adminId)\n                        .from(UmsAdminRoleRelationDynamicSqlSupport.umsAdminRoleRelation)\n                        .where(UmsAdminRoleRelationDynamicSqlSupport.roleId, isEqualTo(roleId))))\n                .build()\n                .render(RenderingStrategies.MYBATIS3);\n        return adminMapper.selectMany(selectStatement);\n    }\n}<\/code><\/pre>\n<h3>Group\u548cJoin\u67e5\u8be2<\/h3>\n<p>\u6d89\u53ca\u5230\u591a\u8868\u67e5\u8be2\uff0c\u4e4b\u524d\u4f7f\u7528MBG\u7684\u65f6\u5019\u57fa\u672c\u53ea\u80fd\u5728<code>mapper.xml<\/code>\u4e2d\u624b\u5199SQL\u5b9e\u73b0\uff0c\u4f7f\u7528Dynamic SQL\u53ef\u4ee5\u652f\u6301\u591a\u8868\u67e5\u8be2\u3002<\/p>\n<p>\uff081\uff09\u8fd9\u91cc\u4ee5\u6309\u89d2\u8272\u7edf\u8ba1\u540e\u53f0\u7528\u6237\u6570\u91cf\u4e3a\u4f8b\uff0cSQL\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sql\">SELECT\n ur.id AS roleId,\n ur.NAME AS roleName,\n count( ua.id ) AS count \nFROM\n ums_role ur\n LEFT JOIN ums_admin_role_relation uarr ON ur.id = uarr.role_id\n LEFT JOIN ums_admin ua ON uarr.admin_id = ua.id \nGROUP BY\n ur.id;<\/code><\/pre>\n<p>\uff082\uff09\u5148\u5728Dao\u4e2d\u6dfb\u52a0\u4e00\u4e2a<code>groupList<\/code>\u65b9\u6cd5\uff0c\u7136\u540e\u4f7f\u7528<code>@Results<\/code>\u6ce8\u89e3\u5b9a\u4e49\u597dresultMap\uff1b<\/p>\n<pre><code class=\"language-java\">public interface UmsAdminDao {\n    @SelectProvider(type = SqlProviderAdapter.class, method = &quot;select&quot;)\n    @Results(id = &quot;RoleStatResult&quot;, value = {\n            @Result(column = &quot;roleId&quot;, property = &quot;roleId&quot;, jdbcType = JdbcType.BIGINT, id = true),\n            @Result(column = &quot;roleName&quot;, property = &quot;roleName&quot;, jdbcType = JdbcType.VARCHAR),\n            @Result(column = &quot;count&quot;, property = &quot;count&quot;, jdbcType = JdbcType.INTEGER)\n    })\n    List&lt;RoleStatDto&gt; groupList(SelectStatementProvider selectStatement);\n}<\/code><\/pre>\n<p>\uff083\uff09\u7136\u540e\u5728Service\u4e2d\u8c03\u7528groupList\u65b9\u6cd5\u4f20\u5165StatementProvider\u5373\u53ef\uff0c\u5bf9\u5e94\u7684Java\u4ee3\u7801\u5b9e\u73b0\u5982\u4e0b\u3002<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Override\n    public List&lt;RoleStatDto&gt; groupList() {\n        SelectStatementProvider selectStatement = SqlBuilder.select(UmsRoleDynamicSqlSupport.id.as(&quot;roleId&quot;), UmsRoleDynamicSqlSupport.name.as(&quot;roleName&quot;), count(UmsAdminDynamicSqlSupport.id).as(&quot;count&quot;))\n                .from(UmsRoleDynamicSqlSupport.umsRole)\n                .leftJoin(UmsAdminRoleRelationDynamicSqlSupport.umsAdminRoleRelation)\n                .on(UmsRoleDynamicSqlSupport.id, equalTo(UmsAdminRoleRelationDynamicSqlSupport.roleId))\n                .leftJoin(UmsAdminDynamicSqlSupport.umsAdmin)\n                .on(UmsAdminRoleRelationDynamicSqlSupport.adminId, equalTo(UmsAdminDynamicSqlSupport.id))\n                .groupBy(UmsRoleDynamicSqlSupport.id)\n                .build()\n                .render(RenderingStrategies.MYBATIS3);\n        return adminDao.groupList(selectStatement);\n    }\n}<\/code><\/pre>\n<h3>\u6761\u4ef6\u5220\u9664<\/h3>\n<p>\u4f7f\u7528Dynamic SQL\u5b9e\u73b0\u6761\u4ef6\u5220\u9664\uff0c\u76f4\u63a5\u8c03\u7528Mapper\u63a5\u53e3\u4e2d\u751f\u6210\u597d\u7684delete\u65b9\u6cd5\u5373\u53ef\u3002<\/p>\n<p>\uff081\uff09\u8fd9\u91cc\u4ee5\u6309\u7528\u6237\u540d\u5220\u9664\u540e\u53f0\u7528\u6237\u4e3a\u4f8b\uff0cSQL\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sql\">DELETE \nFROM\n ums_admin \nWHERE\n username = &#039;andy&#039;;<\/code><\/pre>\n<p>\uff082\uff09\u4f7f\u7528Dynamic SQL\u5bf9\u5e94Java\u4e2d\u7684\u5b9e\u73b0\u5982\u4e0b<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Override\n    public void deleteByUsername(String username) {\n        DeleteStatementProvider deleteStatement = SqlBuilder.deleteFrom(UmsAdminDynamicSqlSupport.umsAdmin)\n                .where(UmsAdminDynamicSqlSupport.username, isEqualTo(username))\n                .build()\n                .render(RenderingStrategies.MYBATIS3);\n        adminMapper.delete(deleteStatement);\n    }\n}<\/code><\/pre>\n<h3>\u6761\u4ef6\u4fee\u6539<\/h3>\n<p>\u4f7f\u7528Dynamic SQL\u5b9e\u73b0\u6761\u4ef6\u4fee\u6539\uff0c\u76f4\u63a5\u8c03\u7528Mapper\u63a5\u53e3\u4e2d\u751f\u6210\u597d\u7684update\u65b9\u6cd5\u5373\u53ef\u3002<\/p>\n<p>\uff081\uff09\u8fd9\u91cc\u4ee5\u6309\u6307\u5b9aID\u4fee\u6539\u540e\u53f0\u7528\u6237\u7684\u72b6\u6001\u4e3a\u4f8b\uff0cSQL\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sql\">UPDATE ums_admin \nSET STATUS = 1 \nWHERE\n id IN ( 1, 2 );<\/code><\/pre>\n<p>\uff082\uff09\u4f7f\u7528Dynamic SQL\u5bf9\u5e94Java\u4e2d\u7684\u5b9e\u73b0\u5982\u4e0b<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {\n    @Override\n    public void updateByIds(List&lt;Long&gt; ids, Integer status) {\n        UpdateStatementProvider updateStatement = SqlBuilder.update(UmsAdminDynamicSqlSupport.umsAdmin)\n                .set(UmsAdminDynamicSqlSupport.status).equalTo(status)\n                .where(UmsAdminDynamicSqlSupport.id, isIn(ids))\n                .build()\n                .render(RenderingStrategies.MYBATIS3);\n        adminMapper.update(updateStatement);\n    }\n}<\/code><\/pre>\n<h3>\u4e00\u5bf9\u591a\u67e5\u8be2<\/h3>\n<blockquote>\n<p>\u4f7f\u7528Dynamic SQL\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u5bf9\u591a\u67e5\u8be2\uff0c\u53ea\u662f\u7531\u4e8eJava\u6ce8\u89e3\u65e0\u6cd5\u5b9e\u73b0\u5faa\u73af\u5f15\u7528\uff0c\u6240\u4ee5\u4e00\u5bf9\u591a\u7684resultMap\u53ea\u80fd\u5728<code>mapper.xml<\/code>\u6765\u914d\u7f6e\uff0c\u8fd9\u53ef\u80fd\u662f\u552f\u4e00\u9700\u8981\u4f7f\u7528<code>mapper.xml<\/code>\u7684\u5730\u65b9\u3002<\/p>\n<\/blockquote>\n<p>\uff081\uff09\u8fd9\u91cc\u4ee5\u6309ID\u67e5\u8be2\u540e\u53f0\u7528\u6237\u4fe1\u606f\uff08\u5305\u542b\u5bf9\u5e94\u89d2\u8272\u5217\u8868\uff09\u4e3a\u4f8b\uff0cSQL\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sql\">SELECT\n ua.*,\n ur.id AS role_id,\n ur.NAME AS role_name,\n ur.description AS role_description,\n ur.create_time AS role_create_time,\n ur.STATUS AS role_status,\n ur.sort AS role_sort \nFROM\n ums_admin ua\n LEFT JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_id\n LEFT JOIN ums_role ur ON uarr.role_id = ur.id \nWHERE\n ua.id = 1<\/code><\/pre>\n<p>\uff082\uff09\u7136\u540e\u5728Dao\u63a5\u53e3\u4e2d\u6dfb\u52a0<code>selectWithRoleList<\/code>\u65b9\u6cd5\uff0c\u8fd9\u91cc\u4f7f\u7528<code>@ResultMap<\/code>\u6ce8\u89e3\u5f15\u7528<code>mapper.xml<\/code>\u4e2d\u5b9a\u4e49\u7684resultMap<\/p>\n<pre><code class=\"language-java\">public interface UmsAdminDao {\n\n    @SelectProvider(type = SqlProviderAdapter.class, method = &quot;select&quot;)\n    @ResultMap(&quot;AdminRoleResult&quot;)\n    AdminRoleDto selectWithRoleList(SelectStatementProvider selectStatement);\n}<\/code><\/pre>\n<p>\uff083\uff09\u5728<code>mapper.xml<\/code>\u4e2d\u6dfb\u52a0\u540d\u79f0\u4e3a<code>AdminRoleResult<\/code>\u7684resultMap\uff0c\u8fd9\u91cc\u6709\u4e2a\u5c0f\u6280\u5de7\uff0c\u53ef\u4ee5\u76f4\u63a5\u5f15\u7528\u5728Mapper\u63a5\u53e3\u4e2d\u5b9a\u4e49\u597d\u7684resultMap<\/p>\n<pre><code class=\"language-xml\">&lt;resultMap id=&quot;AdminRoleResult&quot; type=&quot;cn.appblog.mall.tiny.domain.AdminRoleDto&quot;\n           extends=&quot;cn.appblog.mall.tiny.mbg.mapper.UmsAdminMapper.UmsAdminResult&quot;&gt;\n    &lt;collection property=&quot;roleList&quot; resultMap=&quot;cn.appblog.mall.tiny.mbg.mapper.UmsRoleMapper.UmsRoleResult&quot; columnPrefix=&quot;role_&quot;&gt;\n    &lt;\/collection&gt;\n&lt;\/resultMap&gt;<\/code><\/pre>\n<p>\uff084\uff09\u7136\u540e\u5728Service\u5b9e\u73b0\u7c7b\u4e2d\u8c03\u7528\u5373\u53ef\uff0c\u4e3a\u4e86\u65b9\u4fbf\u7ed3\u679c\u96c6\u6620\u5c04\u7ed9\u67e5\u8be2\u5217\u53d6\u4e86\u522b\u540d<\/p>\n<pre><code class=\"language-java\">\/**\n * \u540e\u53f0\u7528\u6237\u7ba1\u7406Service\u5b9e\u73b0\u7c7b\n *\/\n@Service\npublic class UmsAdminServiceImpl implements UmsAdminService {   \n    @Override\n    public AdminRoleDto selectWithRoleList(Long id) {\n        List&lt;BasicColumn&gt; columnList = new ArrayList&lt;&gt;(CollUtil.toList(UmsAdminMapper.selectList));\n        columnList.add(UmsRoleDynamicSqlSupport.id.as(&quot;role_id&quot;));\n        columnList.add(UmsRoleDynamicSqlSupport.name.as(&quot;role_name&quot;));\n        columnList.add(UmsRoleDynamicSqlSupport.description.as(&quot;role_description&quot;));\n        columnList.add(UmsRoleDynamicSqlSupport.createTime.as(&quot;role_create_time&quot;));\n        columnList.add(UmsRoleDynamicSqlSupport.status.as(&quot;role_status&quot;));\n        columnList.add(UmsRoleDynamicSqlSupport.sort.as(&quot;role_sort&quot;));\n        SelectStatementProvider selectStatement = SqlBuilder.select(columnList)\n                .from(UmsAdminDynamicSqlSupport.umsAdmin)\n                .leftJoin(UmsAdminRoleRelationDynamicSqlSupport.umsAdminRoleRelation)\n                .on(UmsAdminDynamicSqlSupport.id, equalTo(UmsAdminRoleRelationDynamicSqlSupport.adminId))\n                .leftJoin(UmsRoleDynamicSqlSupport.umsRole)\n                .on(UmsAdminRoleRelationDynamicSqlSupport.roleId, equalTo(UmsRoleDynamicSqlSupport.id))\n                .where(UmsAdminDynamicSqlSupport.id, isEqualTo(id))\n                .build()\n                .render(RenderingStrategies.MYBATIS3);\n        return adminDao.selectWithRoleList(selectStatement);\n    }\n}<\/code><\/pre>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u5f53\u6211\u4eec\u4f7f\u7528MyBatis\u5b98\u65b9\u4ee3\u7801\u751f\u6210\u5668MBG\u65f6\uff0c\u914d\u7f6e\u7684targetRuntime\u51b3\u5b9a\u4e86\u4f7f\u7528\u5b83\u7684\u4f7f\u7528\u65b9\u5f0f\u3002Dynamic SQL\u66f4\u503e\u5411\u4e8e\u4f7f\u7528Java API\u6765\u5b9e\u73b0SQL\u64cd\u4f5c\uff0c\u4f20\u7edf\u7684\u65b9\u5f0f\u66f4\u503e\u5411\u4e8e\u5728mapper.xml\u4e2d\u624b\u5199SQL\u6765\u5b9e\u73b0SQL\u64cd\u4f5c\u3002\u867d\u7136MyBatis\u5b98\u65b9\u63a8\u8350\u4f7f\u7528Dynamic SQL\uff0c\u4f46\u9009\u62e9\u90a3\u79cd\u65b9\u5f0f\u5168\u770b\u4e2a\u4eba\u4e60\u60ef\u4e86\uff01<\/p>\n<p>\u5b98\u65b9\u6587\u6863\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/mybatis.org\/mybatis-dynamic-sql\/docs\/introduction.html\">https:\/\/mybatis.org\/mybatis-dynamic-sql\/docs\/introduction.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f53\u6211\u4eec\u4f7f\u7528MyBatis\u7684\u65f6\u5019\uff0c\u9700\u8981\u5728mapper.xml\u4e2d\u4e66\u5199\u5927\u91cf\u7684SQL\u8bed\u53e5\u3002\u5f53\u6211\u4eec\u4f7f\u7528MyBatis G [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-1504","post","type-post","status-publish","format-standard","hentry","category-mybatis"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1504"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1504\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}