{"id":39850,"date":"2023-12-20T16:31:54","date_gmt":"2023-02-19T02:46:26","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/"},"modified":"2024-05-04T14:28:59","modified_gmt":"2024-05-04T06:28:59","slug":"mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/","title":{"rendered":"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5"},"content":{"rendered":"<p>\u4e0b\u9762\u5c06\u4ecb\u7ecdmybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8be5\u9879\u76ee\u4e8e2015\u5e7411\u6708\u53d1\u5e03\u4e861.0.0\u7248\u672c\uff0c\u968f\u540e\u4e8e2016\u5e744\u670819\u65e5\u53d1\u5e03\u4e861.1\u7248\u672c\u3002<\/p>\n<p>\u5728\u4f7f\u7528Spring Boot\u4e0a\u7684MyBatis\u65f6\uff0c\u5f00\u53d1\u8005\u9700\u8981\u81ea\u884c\u5b9a\u4e49SqlSessionFactoryBean\u548cSqlSessionTemplate\u7684Bean\u5b9a\u4e49\uff0c\u8fd9\u4e9b\u90fd\u662f\u7531mybatis-spring\u63d0\u4f9b\u7684\u3002\u4f46\u662f\uff0c\u968f\u7740mybatis-spring-boot-starter\u7684\u51fa\u73b0\uff0c\u8fd9\u4e9bBean\u5b9a\u4e49\u5c06\u901a\u8fc7\u81ea\u52a8\u914d\u7f6e\u6765\u89e3\u51b3\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5c06\u4f7f\u7528mybatis-spring-boot-starter\u6765\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684CLI\uff08\u547d\u4ee4\u884c\u754c\u9762\uff09\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<blockquote><p>\u6ce8\u610f\uff1a<\/p>\n<p>2019\/7\/16: \u8ffd\u8bb0<br \/>\n\u5df2\u6dfb\u52a0\u4e86\u6307\u5411\u4f7f\u7528JDK 13\u5f15\u5165\u7684Text Blocks\u8fdb\u884c\u6f14\u793a\u7684\u94fe\u63a5\uff08\u76ee\u524d\u4e3a\u9884\u89c8\u7248\uff09\u3002<\/p>\n<p>2019\/7\/15: \u8ffd\u8bb0<br \/>\n\u7531\u4e8e\u57282019\u5e747\u670815\u65e5\u53d1\u5e03\u4e86\u7248\u672c2.1.0\uff0c\u56e0\u6b64\u5c06\u5185\u5bb9\u6539\u4e3a\u57fa\u4e8e2.1\u3002<\/p>\n<p>2019\/5\/7: \u8ffd\u8bb0<br \/>\n\u5df2\u6dfb\u52a0\u4e86mybatis-spring-boot-starter 2.0\u66f4\u6539\u7684\u94fe\u63a5\u3002\u6b64\u5916\uff0c\u8fd8\u6dfb\u52a0\u4e86\u5173\u4e8e\u57282.0.1\u4e0a\u4f7f\u7528mybatis.type-aliases-package\u65f6\u53ef\u80fd\u53d1\u751f\u7684\u6545\u969c\u7684\u8bf4\u660e\uff08\u94fe\u63a5\u5230\u8bf4\u660e\uff09\u3002<\/p>\n<p>2019\/5\/3: \u8ffd\u8bb0<br \/>\n\u7531\u4e8e\u57282019\u5e741\u670822\u65e5\u53d1\u5e03\u4e86\u7248\u672c2.0.0\uff08\u7248\u672c2.0.1\u57282019\u5e744\u6708\u53d1\u5e03\uff09\uff0c\u56e0\u6b64\u5c06\u5185\u5bb9\u6539\u4e3a\u57fa\u4e8e2.0\u3002<\/p>\n<p>2017\/4\/10: \u8ffd\u8bb0<br \/>\n\u7531\u4e8e\u57282017\u5e744\u670810\u65e5\u53d1\u5e03\u4e86\u7248\u672c1.3.0\uff0c\u56e0\u6b64\u5c06\u5185\u5bb9\u6539\u4e3a\u57fa\u4e8e1.3\u3002<\/p>\n<p>2017\/1\/4: \u8ffd\u8bb0<br \/>\n\u7531\u4e8e\u57282017\u5e741\u67082\u65e5\u53d1\u5e03\u4e86\u7248\u672c1.2.0\uff0c\u56e0\u6b64\u5c06\u5185\u5bb9\u6539\u4e3a\u57fa\u4e8e1.2\u3002\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u4f7f\u7528\u7248\u672c1.2\uff0c\u5219\u9700\u8981\u5728Spring Boot 1.4\u53ca\u4ee5\u540e\uff08\u51c6\u786e\u5730\u8bf4\u662f\u5728Spring Framework 4.3\u53ca\u4ee5\u4e0a\uff09\u4e0a\u8fd0\u884c\u3002\uff082017\/1\/4\uff09<\/p><\/blockquote>\n<p>\u53e6\u5916\uff0c\u5173\u4e8e\u4e3b\u8981\/\u6b21\u8981\u7248\u672c\u5347\u7ea7\u7684\u66f4\u6539\u5185\u5bb9\uff0c\u8bf7\u53c2\u9605\u4ee5\u4e0b\u5e16\u5b50\u6c47\u603b\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mybatis-spring-boot-starter 2.1\u306e\u5909\u66f4\u70b9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mybatis-spring-boot-starter 2.0\u306e\u5909\u66f4\u70b9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mybatis-spring-boot-starter 1.3\u306e\u5909\u66f4\u70b9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mybatis-spring-boot-starter 1.2\u306e\u5909\u66f4\u70b9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">mybatis-spring-boot-starter 1.1\u306e\u5909\u66f4\u70b9<\/ul>\n<h1>\u9a8c\u8bc1\u7248\u672c<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MyBatis Spring Boot Starter 2.1.0<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MyBatis 3.5.2<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MyBatis Spring 2.0.2<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Spring Boot 2.1.6.RELEASE<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Spring Framework 5.1.8.RELEASE<\/ul>\n<h1>\u9a8c\u8bc1\u7801<\/h1>\n<h2>\u7edd\u5bf9\u662f\u4e00\u4e2a\u5f88\u53d7\u6b22\u8fce\u7684\u7f16\u7a0b\u8bed\u8a00\u3002<\/h2>\n<ul class=\"post-ul\">https:\/\/github.com\/kazuki43zoo\/qiita-materials\/tree\/master\/mybatis-spring-boot\/mybatis-demo<\/ul>\n<h2>Text Blocks \u7248\u672c (JDK 13)<\/h2>\n<p>\u6211\u4f7f\u7528JDK 13\u65e9\u671f\u8bbf\u95ee\u7248\u672c\u53d1\u5e03\u4e86\u4e00\u4e2a\u4f7f\u7528Text Blocks\u7684Mapper\u65b9\u6cd5\u6f14\u793a\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u5c06\u5176\u653e\u5728GitHub\u4e0a\u516c\u5f00\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/github.com\/kazuki43zoo\/mybatis-demo-with-jdk13<\/ul>\n<h2>\u534e\u4e3d\u7684\u7248\u672c<\/h2>\n<p>\u6211\u57282016\u5e747\u670813\u65e5\u53d1\u5e03\u4e86\u4e00\u4e2a\u5173\u4e8e\u5982\u4f55\u5728Groovy\u4e2d\u521b\u5efaMapper\u63a5\u53e3\u7684\u65b9\u6cd5\u7684\u5e16\u5b50\uff08&#8221;\u4f7f\u7528Groovy\u521b\u5efaMyBatis\u7684Mapper\uff08\u63d0\u9ad8SQL\u7684\u53ef\u8bfb\u6027\uff01\uff09&#8221;\uff09\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/github.com\/kazuki43zoo\/qiita-materials\/tree\/groovy-with-mybatis-spring-boot-2.0\/mybatis-spring-boot\/mybatis-demo<\/ul>\n<h2>Kotlin\u7248\u672c<\/h2>\n<p>\u6211\u57282016\u5e748\u67083\u65e5\u53d1\u5e03\u4e86\u4e00\u4e2a\u5173\u4e8e\u5982\u4f55\u5728Kotlin\u4e0a\u4f7f\u7528MyBatis\uff08mybatis-spring-boot-starter\uff09\u7684\u5e16\u5b50\uff08&#8221;\u5728Kotlin\u4e2d\u4f7f\u7528mybatis-spring-boot-starter&#8221;\uff09\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/github.com\/kazuki43zoo\/qiita-materials\/tree\/master\/mybatis-spring-boot\/mybatis-kotlin-demo<\/ul>\n<h1>\u7eaf\u6b63\u7684\u7b80\u6613\u6837\u672c<\/h1>\n<p>\u7531\u4e8eMyBatis Spring Boot\u63d0\u4f9b\u4e86\u4e00\u4e9b\u7b80\u5355\u7684\u793a\u4f8b\uff0c\u6211\u5efa\u8bae\u60a8\u4e00\u5e76\u53c2\u8003\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/github.com\/mybatis\/spring-boot-starter\/tree\/master\/mybatis-spring-boot-samples<\/ul>\n<h1>\u521b\u5efa\u5f00\u53d1\u9879\u76ee<\/h1>\n<p>Spring Boot\u63d0\u4f9b\u4e86\u4e00\u4e2a\u540d\u4e3a\u201cSPRING INITIALIZR\u201d\u7684Web\u670d\u52a1\uff0c\u7528\u4e8e\u751f\u6210\u9488\u5bf9Spring Boot\u7684\u5f00\u53d1\u9879\u76ee\u3002\u672c\u6b21\u6211\u4eec\u5c06\u4f7f\u7528\u8fd9\u4e2aWeb\u670d\u52a1\u6765\u521b\u5efa\u5f00\u53d1\u9879\u76ee\u3002<br \/>\nSPRING INITIALIZR\u652f\u6301Maven\u548cGradle\u9879\u76ee\uff0c\u4f46\u672c\u6587\u5c06\u521b\u5efa\u4e00\u4e2aMaven\u9879\u76ee\u3002\u5728\u5411\u5bfc\u4e2d\u8f93\u5165\u4ee5\u4e0b\u503c\u5e76\u70b9\u51fb\u201cGenerate Project\u201d\u6309\u94ae\uff0c\u5373\u53ef\u4e0b\u8f7dMaven\u9879\u76ee\u3002<\/p>\n<div>\n<div class=\"post-table\">\u5165\u529b\u9805\u76ee\u5024\u5099\u8003ProjectMaven Project\u203b\u30c7\u30d5\u30a9\u30eb\u30c8LanguageJava\u203b\u30c7\u30d5\u30a9\u30eb\u30c8Spring Boot2.1.6\u203b\u30c7\u30d5\u30a9\u30eb\u30c8Groupcom.example\u203b\u30c7\u30d5\u30a9\u30eb\u30c8Artifactmybatis-demo\u203b\u30c7\u30d5\u30a9\u30eb\u30c8(demo)\u304b\u3089\u5909\u66f4DependenciesMyBatis, H2<\/div>\n<\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3cd737434c4406c85ddc\/25-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u89e3\u538b\u7f29\u4e0b\u8f7d\u7684Zip\u6587\u4ef6\u540e\uff0c\u53ef\u4ee5\u751f\u6210\u5982\u4e0b\u7684\u9879\u76ee\u76ee\u5f55\u7ed3\u6784\u3002<\/p>\n<pre class=\"post-pre\"><code>.\r\n\u251c\u2500\u2500 HELP.md\r\n\u251c\u2500\u2500 mvnw\r\n\u251c\u2500\u2500 mvnw.cmd\r\n\u251c\u2500\u2500 pom.xml\r\n\u2514\u2500\u2500 src\r\n    \u251c\u2500\u2500 main\r\n    \u2502\u00a0\u00a0 \u251c\u2500\u2500 java\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 com\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 example\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 mybatisdemo\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2514\u2500\u2500 MybatisDemoApplication.java\r\n    \u2502\u00a0\u00a0 \u2514\u2500\u2500 resources\r\n    \u2502\u00a0\u00a0     \u2514\u2500\u2500 application.properties\r\n    \u2514\u2500\u2500 test\r\n        \u2514\u2500\u2500 java\r\n            \u2514\u2500\u2500 com\r\n                \u2514\u2500\u2500 example\r\n                    \u2514\u2500\u2500 mybatisdemo\r\n                        \u2514\u2500\u2500 MybatisDemoApplicationTests.java\r\n\r\n<\/code><\/pre>\n<blockquote><p>\u6ce8\u610f\uff1a<\/p>\n<p>\u53ea\u8981\u60a8\u7684\u73af\u5883\u652f\u6301curl\u548ctar\u547d\u4ee4\uff0c\u60a8\u53ef\u4ee5\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u6765\u521b\u5efa\u5f00\u53d1\u9879\u76ee\u3002<\/p>\n<p>$ curl -s https:\/\/start.spring.io\/starter.tgz \\<br \/>\n-d name=mybatis-demo \\<br \/>\n-d artifactId=mybatis-demo \\<br \/>\n-d dependencies=mybatis,h2 \\<br \/>\n-d baseDir=mybatis-demo \\<br \/>\n| tar -xzvf &#8211;<\/p><\/blockquote>\n<p>\u6211\u5c06\u5c1d\u8bd5\u5c06\u5df2\u521b\u5efa\u7684\u5f00\u53d1\u9879\u76ee\u4f5c\u4e3aSpring Boot\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code>$ .\/mvnw spring-boot:run\r\n[INFO] Scanning for projects...\r\n[INFO] \r\n[INFO] ----------------------&lt; com.example:mybatis-demo &gt;----------------------\r\n[INFO] Building mybatis-demo 0.0.1-SNAPSHOT\r\n[INFO] --------------------------------[ jar ]---------------------------------\r\n[INFO] \r\n[INFO] &gt;&gt;&gt; spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) &gt; test-compile @ mybatis-demo &gt;&gt;&gt;\r\n[INFO] \r\n[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ mybatis-demo ---\r\n[INFO] Using 'UTF-8' encoding to copy filtered resources.\r\n[INFO] Copying 1 resource\r\n[INFO] Copying 0 resource\r\n[INFO] \r\n[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mybatis-demo ---\r\n[INFO] Nothing to compile - all classes are up to date\r\n[INFO] \r\n[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ mybatis-demo ---\r\n[INFO] Using 'UTF-8' encoding to copy filtered resources.\r\n[INFO] skip non existing resourceDirectory \/private\/tmp\/mybatis-demo\/src\/test\/resources\r\n[INFO] \r\n[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ mybatis-demo ---\r\n[INFO] Nothing to compile - all classes are up to date\r\n[INFO] \r\n[INFO] &lt;&lt;&lt; spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) &lt; test-compile @ mybatis-demo &lt;&lt;&lt;\r\n[INFO] \r\n[INFO] \r\n[INFO] --- spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) @ mybatis-demo ---\r\n\r\n  .   ____          _            __ _ _\r\n \/\\\\ \/ ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\\r\n( ( )\\___ | '_ | '_| | '_ \\\/ _` | \\ \\ \\ \\\r\n \\\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )\r\n  '  |____| .__|_| |_|_| |_\\__, | \/ \/ \/ \/\r\n =========|_|==============|___\/=\/_\/_\/_\/\r\n :: Spring Boot ::        (v2.1.6.RELEASE)\r\n\r\n2019-07-15 17:25:33.712  INFO 55692 --- [           main] c.e.mybatisdemo.MybatisDemoApplication   : Starting MybatisDemoApplication on shimizukazutakanoMacBook-puro.local with PID 55692 (\/private\/tmp\/mybatis-demo\/target\/classes started by shimizukazuki in \/private\/tmp\/mybatis-demo)\r\n2019-07-15 17:25:33.714  INFO 55692 --- [           main] c.e.mybatisdemo.MybatisDemoApplication   : No active profile set, falling back to default profiles: default\r\n2019-07-15 17:25:34.049  WARN 55692 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.example.mybatisdemo]' package. Please check your configuration.\r\n2019-07-15 17:25:34.579  INFO 55692 --- [           main] c.e.mybatisdemo.MybatisDemoApplication   : Started MybatisDemoApplication in 1.121 seconds (JVM running for 4.19)\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  3.064 s\r\n[INFO] Finished at: 2019-07-15T17:25:34+09:00\r\n[INFO] ------------------------------------------------------------------------\r\n<\/code><\/pre>\n<p>\u66ab\u6642\u78ba\u8a8d\u6c92\u6709\u932f\u8aa4\uff0c\u6240\u4ee5\u6211\u5011\u7e7c\u7e8c\u5f80\u524d\u8d70\u5427\u3002<\/p>\n<h1>\u786e\u8ba4mybatis-spring-boot-starter<\/h1>\n<p>\u5982\u679c\u5728\u5411\u5bfc\u4e2d\u9009\u62e9&#8221;MyBatis&#8221;\uff0c\u5219\u5c06\u6dfb\u52a0\u4e0eSpring Boot\u7248\u672c\u517c\u5bb9\u7684mybatis-spring-boot-starter\u4f5c\u4e3a\u4f9d\u8d56\u9879\u3002\u7531\u4e8e\u672c\u6b21\u9009\u62e9\u4e86Spring Boot 2.1.6\uff0c\u56e0\u6b64\u5c06\u6dfb\u52a0mybatis-spring-boot-starter 2.1.0\u3002\uff08\u53e6\u5916\uff0c\u5982\u679c\u9009\u62e9\u4e86Spring Boot 1.5\u7cfb\u5217\uff0c\u5219\u5c06\u6dfb\u52a0mybatis-spring-boot-starter 1.3.4\uff09<\/p>\n<pre class=\"post-pre\"><code><span class=\"nt\">&lt;dependency&gt;<\/span>\r\n    <span class=\"nt\">&lt;groupId&gt;<\/span>org.mybatis.spring.boot<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n    <span class=\"nt\">&lt;artifactId&gt;<\/span>mybatis-spring-boot-starter<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n    <span class=\"nt\">&lt;version&gt;<\/span>2.1.0<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n<\/code><\/pre>\n<p>mybatis-spring-boot-starter 2.1.0\u5c06\u4f1a\u81ea\u52a8\u4e3a\u60a8\u6dfb\u52a0\u4ee5\u4e0b\u76f8\u5173\u9879\u3002<\/p>\n<pre class=\"post-pre\"><code>$ .\/mvnw dependency:tree\r\n...\r\n[INFO] +- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:2.1.0:compile\r\n[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.1.6.RELEASE:compile\r\n[INFO] |  |  +- org.springframework.boot:spring-boot:jar:2.1.6.RELEASE:compile\r\n[INFO] |  |  |  \\- org.springframework:spring-context:jar:5.1.8.RELEASE:compile\r\n[INFO] |  |  |     +- org.springframework:spring-aop:jar:5.1.8.RELEASE:compile\r\n[INFO] |  |  |     \\- org.springframework:spring-expression:jar:5.1.8.RELEASE:compile\r\n[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.1.6.RELEASE:compile\r\n[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.1.6.RELEASE:compile\r\n[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile\r\n[INFO] |  |  |  |  \\- ch.qos.logback:logback-core:jar:1.2.3:compile\r\n[INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.11.2:compile\r\n[INFO] |  |  |  |  \\- org.apache.logging.log4j:log4j-api:jar:2.11.2:compile\r\n[INFO] |  |  |  \\- org.slf4j:jul-to-slf4j:jar:1.7.26:compile\r\n[INFO] |  |  +- javax.annotation:javax.annotation-api:jar:1.3.2:compile\r\n[INFO] |  |  \\- org.yaml:snakeyaml:jar:1.23:runtime\r\n[INFO] |  +- org.springframework.boot:spring-boot-starter-jdbc:jar:2.1.6.RELEASE:compile\r\n[INFO] |  |  +- com.zaxxer:HikariCP:jar:3.2.0:compile\r\n[INFO] |  |  \\- org.springframework:spring-jdbc:jar:5.1.8.RELEASE:compile\r\n[INFO] |  |     +- org.springframework:spring-beans:jar:5.1.8.RELEASE:compile\r\n[INFO] |  |     \\- org.springframework:spring-tx:jar:5.1.8.RELEASE:compile\r\n[INFO] |  +- org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:2.1.0:compile\r\n[INFO] |  +- org.mybatis:mybatis:jar:3.5.2:compile\r\n[INFO] |  \\- org.mybatis:mybatis-spring:jar:2.0.2:compile\r\n...\r\n<\/code><\/pre>\n<h1>\u521b\u5efa\u57df\u5bf9\u8c61<\/h1>\n<p>\u8fd9\u6b21\u6211\u4eec\u5c06\u628aTodo\u7c7b\u4f5c\u4e3a\u57df\u5bf9\u8c61\u6765\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo.domain<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Todo<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">title<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">details<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">finished<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"c1\">\/\/ ... setter and getter<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<blockquote><p>\u6ce8\u610f\uff1a<br \/>\n\u60a8\u53ef\u4ee5\u4f7f\u7528IDE\u7684\u529f\u80fd\u751f\u6210setter\u548cgetter\uff0c\u4f46\u4f7f\u7528Lombok\u53ef\u4ee5\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\uff01<\/p><\/blockquote>\n<h1>\u521b\u5efaMapper\u63a5\u53e3<\/h1>\n<p>\u6211\u5c06\u521b\u5efa\u4e00\u4e2a\u63d0\u4f9b\u5bf9Todo\u8fdb\u884cCRUD\u64cd\u4f5c\u7684Mapper\u63a5\u53e3\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo.mapper<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.example.mybatisdemo.domain.Todo<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Insert<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Mapper<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Options<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Select<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Mapper<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">TodoMapper<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Insert<\/span><span class=\"o\">(<\/span><span class=\"s\">\"INSERT INTO todo (title, details, finished) VALUES (#{title}, #{details}, #{finished})\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nd\">@Options<\/span><span class=\"o\">(<\/span><span class=\"n\">useGeneratedKeys<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">,<\/span> <span class=\"n\">keyProperty<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"id\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kt\">void<\/span> <span class=\"nf\">insert<\/span><span class=\"o\">(<\/span><span class=\"nc\">Todo<\/span> <span class=\"n\">todo<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"nd\">@Select<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SELECT id, title, details, finished FROM todo WHERE id = #{id}\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nc\">Todo<\/span> <span class=\"nf\">select<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"o\">);<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<blockquote><p>\u6ce8\u610f\uff1a<br \/>\n\u5982\u679c\u5e0c\u671b\u5c06SQL\u5199\u5165XML\u6587\u4ef6\u4e2d\uff0c\u53ef\u4ee5\u521b\u5efa\u5982\u4e0b\u7684Mapper\u63a5\u53e3\u548cXML\u6587\u4ef6\u3002<\/p>\n<p>src\/main\/java\/com\/example\/mybatisdemo\/mapper\/TodoMapper.java<br \/>\n@Mapper<br \/>\npublic interface TodoMapper {<br \/>\nvoid insert(Todo todo);<br \/>\nTodo select(int id);<br \/>\n}<\/p>\n<p>src\/main\/resources\/com\/example\/mybatisdemo\/mapper\/TodoMapper.xml<br \/>\n<!--?xml version=\"1.0\" encoding=\"UTF-8\" ?--><\/p>\n<p>INSERT INTO todo (title, details, finished) VALUES (#{title}, #{details}, #{finished})<\/p>\n<p><select>SELECT id, title, details, finished FROM todo WHERE id = #{id}<\/select><\/p><\/blockquote>\n<h1>\u521b\u5efatodo\u8868<\/h1>\n<p>\u5728H2\u5d4c\u5165\u5f0f\u6570\u636e\u5e93\u4e2d\u521b\u5efatodo\u8868\u3002\u5982\u679c\u4f7f\u7528Spring Boot\u7684\u81ea\u52a8\u914d\u7f6e\u521b\u5efa\u7684DataSource\uff0c\u53ef\u4ee5\u5c06schema.sql\u548cdata.sql\u6587\u4ef6\u653e\u7f6e\u5728\u7c7b\u8def\u5f84\u4e0b\uff0cSpring Boot\u542f\u52a8\u65f6\u5c06\u8bfb\u53d6\u8fd9\u4e9b\u6587\u4ef6\u5e76\u6267\u884cSQL\u8bed\u53e5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">todo<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"n\">id<\/span> <span class=\"k\">IDENTITY<\/span>\r\n    <span class=\"p\">,<\/span><span class=\"n\">title<\/span> <span class=\"nb\">TEXT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\r\n    <span class=\"p\">,<\/span><span class=\"n\">details<\/span> <span class=\"nb\">TEXT<\/span>\r\n    <span class=\"p\">,<\/span><span class=\"n\">finished<\/span> <span class=\"nb\">BOOLEAN<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\r\n<span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<h1>\u4fee\u6539MybatisDemoApplication\u5e76\u542f\u52a8Spring Boot\u5e94\u7528\u7a0b\u5e8f<\/h1>\n<p>\u4fee\u6539MybatisDemoApplication\uff0c\u901a\u8fc7Mapper\u63a5\u53e3\u8bbf\u95ee\u6570\u636e\u5e93\u3002<\/p>\n<ul class=\"post-ul\">\u4fee\u6b63\u524d<\/ul>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.SpringApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplication<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">MybatisDemoApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\u4fee\u6b63\u5f8c<\/ul>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.example.mybatisdemo.domain.Todo<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.example.mybatisdemo.mapper.TodoMapper<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.CommandLineRunner<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.SpringApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.transaction.annotation.Transactional<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplication<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">CommandLineRunner<\/span> <span class=\"o\">{<\/span> <span class=\"c1\">\/\/ CommandLineRunner\u3092\u5b9f\u88c5\u3059\u308b<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">MybatisDemoApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">TodoMapper<\/span> <span class=\"n\">todoMapper<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">MybatisDemoApplication<\/span><span class=\"o\">(<\/span><span class=\"nc\">TodoMapper<\/span> <span class=\"n\">todoMapper<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">todoMapper<\/span> <span class=\"o\">=<\/span> <span class=\"n\">todoMapper<\/span><span class=\"o\">;<\/span> <span class=\"c1\">\/\/ Mapper\u3092\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u3059\u308b<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/ Spring Boot\u8d77\u52d5\u6642\u306bCommandLineRunner#run\u30e1\u30bd\u30c3\u30c9\u304c\u547c\u3073\u51fa\u3055\u308c\u308b<\/span>\r\n    <span class=\"nd\">@Transactional<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">...<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span> \r\n        <span class=\"nc\">Todo<\/span> <span class=\"n\">newTodo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Todo<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">setTitle<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u98f2\u307f\u4f1a\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">setDetails<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u9280\u5ea7 19:00\"<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"n\">todoMapper<\/span><span class=\"o\">.<\/span><span class=\"na\">insert<\/span><span class=\"o\">(<\/span><span class=\"n\">newTodo<\/span><span class=\"o\">);<\/span> <span class=\"c1\">\/\/ \u65b0\u3057\u3044Todo\u3092\u30a4\u30f3\u30b5\u30fc\u30c8\u3059\u308b<\/span>\r\n\r\n        <span class=\"nc\">Todo<\/span> <span class=\"n\">loadedTodo<\/span> <span class=\"o\">=<\/span> <span class=\"n\">todoMapper<\/span><span class=\"o\">.<\/span><span class=\"na\">select<\/span><span class=\"o\">(<\/span><span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getId<\/span><span class=\"o\">());<\/span> <span class=\"c1\">\/\/ \u30a4\u30f3\u30b5\u30fc\u30c8\u3057\u305fTodo\u3092\u53d6\u5f97\u3057\u3066\u6a19\u6e96\u51fa\u529b\u3059\u308b<\/span>\r\n        <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ID       : \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">loadedTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getId<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"TITLE    : \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">loadedTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getTitle<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"DETAILS  : \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">loadedTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getDetails<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"FINISHED : \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">loadedTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">isFinished<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u4f60\u4fee\u6539\u4e86MybatisDemoApplication\u4e4b\u540e\uff0c\u5b83\u5c06\u4f5c\u4e3a\u4e00\u4e2aSpring Boot\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code>$ .\/mvnw spring-boot:run\r\n...\r\n[INFO] --- spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) @ mybatis-demo ---\r\n\r\n  .   ____          _            __ _ _\r\n \/\\\\ \/ ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\\r\n( ( )\\___ | '_ | '_| | '_ \\\/ _` | \\ \\ \\ \\\r\n \\\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )\r\n  '  |____| .__|_| |_|_| |_\\__, | \/ \/ \/ \/\r\n =========|_|==============|___\/=\/_\/_\/_\/\r\n :: Spring Boot ::        (v2.1.6.RELEASE)\r\n\r\n2019-07-15 17:35:04.734  INFO 55816 --- [           main] c.e.mybatisdemo.MybatisDemoApplication   : Starting MybatisDemoApplication on shimizukazutakanoMacBook-puro.local with PID 55816 (\/private\/tmp\/mybatis-demo\/target\/classes started by shimizukazuki in \/private\/tmp\/mybatis-demo)\r\n2019-07-15 17:35:04.736  INFO 55816 --- [           main] c.e.mybatisdemo.MybatisDemoApplication   : No active profile set, falling back to default profiles: default\r\n2019-07-15 17:35:05.561  INFO 55816 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...\r\n2019-07-15 17:35:05.820  INFO 55816 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.\r\n2019-07-15 17:35:06.176  INFO 55816 --- [           main] c.e.mybatisdemo.MybatisDemoApplication   : Started MybatisDemoApplication in 1.746 seconds (JVM running for 5.696)\r\nID       : 1\r\nTITLE    : \u98f2\u307f\u4f1a\r\nDETAILS  : \u9280\u5ea7 19:00\r\nFINISHED : false\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  4.341 s\r\n[INFO] Finished at: 2019-07-15T17:35:06+09:00\r\n[INFO] ------------------------------------------------------------------------\r\n2019-07-15 17:35:06.266  INFO 55816 --- [       Thread-3] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...\r\n2019-07-15 17:35:06.270  INFO 55816 --- [       Thread-3] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.\r\n...\r\n<\/code><\/pre>\n<p>\u5df2\u8f93\u51fa\u6807\u51c6\u8f93\u51fa\u4e2d\u63d2\u5165\u7684Todo\u72b6\u6001\u3002<\/p>\n<p>\u987a\u4fbf\u63d0\u4e00\u53e5\uff0c\u5f00\u53d1\u9879\u76ee\u5c06\u4f1a\u5904\u4e8e\u4ee5\u4e0b\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n.\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 mvnw\r\n\u251c\u2500\u2500 mvnw.cmd\r\n\u251c\u2500\u2500 pom.xml\r\n\u2514\u2500\u2500 src\r\n    \u251c\u2500\u2500 main\r\n    \u2502\u00a0\u00a0 \u251c\u2500\u2500 java\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 com\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 example\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 mybatisdemo\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u251c\u2500\u2500 MybatisDemoApplication.java \/\/ \u4fee\u6b63\u3057\u305f\u30d5\u30a1\u30a4\u30eb\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u251c\u2500\u2500 domain\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u2514\u2500\u2500 Todo.java \/\/ \u8ffd\u52a0\u3057\u305f\u30d5\u30a1\u30a4\u30eb\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2514\u2500\u2500 mapper\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0                 \u2514\u2500\u2500 TodoMapper.java \/\/ \u8ffd\u52a0\u3057\u305f\u30d5\u30a1\u30a4\u30eb\r\n    \u2502\u00a0\u00a0 \u2514\u2500\u2500 resources\r\n    \u2502\u00a0\u00a0     \u251c\u2500\u2500 application.properties\r\n    \u2502\u00a0\u00a0     \u251c\u2500\u2500 com\r\n    \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 example\r\n    \u2502\u00a0\u00a0  \u00a0\u00a0 \u2502       \u2514\u2500\u2500 mybatisdemo\r\n    \u2502\u00a0\u00a0     \u2502\u00a0\u00a0         \u2514\u2500\u2500 mapper\r\n    \u2502\u00a0\u00a0     \u2502\u00a0\u00a0             \u2514\u2500\u2500 TodoMapper.xml \/\/ \u8ffd\u52a0\u3057\u305f\u30d5\u30a1\u30a4\u30eb(SQL\u3092XML\u306b\u8a18\u8ff0\u3059\u308b\u5834\u5408\u306e\u307f)\r\n    \u2502\u00a0\u00a0     \u2514\u2500\u2500 schema.sql \/\/ \u8ffd\u52a0\u3057\u305f\u30d5\u30a1\u30a4\u30eb\r\n    \u2514\u2500\u2500 test\r\n        \u2514\u2500\u2500 java\r\n            \u2514\u2500\u2500 com\r\n                \u2514\u2500\u2500 example\r\n                    \u2514\u2500\u2500 mybatisdemo\r\n                        \u2514\u2500\u2500 MybatisDemoApplicationTests.java\r\n<\/code><\/pre>\n<h1>\u5728JUnit\u4e0a\u8fd0\u884cMybatisDemoApplication\u3002<\/h1>\n<p>\u4e0b\u8f7d\u7684\u5f00\u53d1\u9879\u76ee\u4e2d\u5305\u542b\u4e86\u7528\u4e8eJUnit\u7684\u6d4b\u8bd5\u7528\u4f8b\u7c7b(MybatisDemoApplicationTests)\u3002<\/p>\n<pre class=\"post-pre\"><code>$ .\/mvnw test\r\n...\r\n2019-07-15 17:36:55.348  INFO 55839 --- [           main] c.e.m.MybatisDemoApplicationTests        : Started MybatisDemoApplicationTests in 1.4 seconds (JVM running for 2.08)\r\nID       : 1\r\nTITLE    : \u98f2\u307f\u4f1a\r\nDETAILS  : \u9280\u5ea7 19:00\r\nFINISHED : false\r\n[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.125 s - in com.example.mybatisdemo.MybatisDemoApplicationTests\r\n2019-07-15 17:36:55.688  INFO 55839 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...\r\n2019-07-15 17:36:55.690  INFO 55839 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.\r\n[INFO] \r\n[INFO] Results:\r\n[INFO] \r\n[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0\r\n[INFO] \r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  5.304 s\r\n[INFO] Finished at: 2019-07-15T17:36:56+09:00\r\n[INFO] ------------------------------------------------------------------------\r\n<\/code><\/pre>\n<p>\u6d4b\u8bd5\u4f3c\u4e4e\u662f\u6210\u529f\u7684\uff0c\u4f46\u5728\u4e0b\u8f7d\u72b6\u6001\u4e0b\u6ca1\u6709\u5bf9\u6d4b\u8bd5\u7ed3\u679c\u8fdb\u884c\u65ad\u8a00\u3002<br \/>\n\u65e2\u7136\u5982\u6b64\uff0c\u6211\u5c06\u4fee\u6539MybatisDemoApplicationTests\uff0c\u4ee5\u4fbf\u5bf9\u6d4b\u8bd5\u7ed3\u679c\u8fdb\u884c\u65ad\u8a00\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.ClassRule<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.Test<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.runner.RunWith<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.test.context.SpringBootTest<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.test.rule.OutputCapture<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.test.context.junit4.SpringRunner<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">hamcrest<\/span><span class=\"o\">.<\/span><span class=\"na\">Matchers<\/span><span class=\"o\">.<\/span><span class=\"na\">containsString<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@RunWith<\/span><span class=\"o\">(<\/span><span class=\"nc\">SpringRunner<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n<span class=\"nd\">@SpringBootTest<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplicationTests<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@ClassRule<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"nc\">OutputCapture<\/span> <span class=\"n\">out<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">OutputCapture<\/span><span class=\"o\">();<\/span> <span class=\"c1\">\/\/ System.out\u306e\u5185\u5bb9\u3092\u30ad\u30e3\u30d7\u30c1\u30e3\u3059\u308b<\/span>\r\n\r\n    <span class=\"nd\">@Test<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">contextLoads<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/ System.out\u3057\u305f\u5185\u5bb9\u3092\u691c\u8a3c\u3059\u308b<\/span>\r\n        <span class=\"n\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">expect<\/span><span class=\"o\">(<\/span><span class=\"n\">containsString<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ID       : 1\"<\/span><span class=\"o\">));<\/span>\r\n        <span class=\"n\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">expect<\/span><span class=\"o\">(<\/span><span class=\"n\">containsString<\/span><span class=\"o\">(<\/span><span class=\"s\">\"TITLE    : \u98f2\u307f\u4f1a\"<\/span><span class=\"o\">));<\/span>\r\n        <span class=\"n\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">expect<\/span><span class=\"o\">(<\/span><span class=\"n\">containsString<\/span><span class=\"o\">(<\/span><span class=\"s\">\"DETAILS  : \u9280\u5ea7 19:00\"<\/span><span class=\"o\">));<\/span>\r\n        <span class=\"n\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">expect<\/span><span class=\"o\">(<\/span><span class=\"n\">containsString<\/span><span class=\"o\">(<\/span><span class=\"s\">\"FINISHED : false\"<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u518d\u6b21\u6267\u884c\u6d4b\u8bd5\u65f6\uff0c\u53ef\u4ee5\u9a8c\u8bc1\u6807\u51c6\u8f93\u51fa\u7684\u5185\u5bb9\u662f\u5426\u6b63\u786e\u3002<\/p>\n<h1>Mapper\u63a5\u53e3\u7684\u626b\u63cf\u673a\u5236<\/h1>\n<p>\u4f3c\u4e4e\u6211\u53ef\u4ee5\u4f7f\u7528MyBatis\u6765\u8bbf\u95ee\u6570\u636e\u5e93\uff0c\u4f46\u662f\u6211\u4e0d\u77e5\u9053Mapper\u63a5\u53e3\u662f\u5982\u4f55\u88ab\u626b\u63cf\u7684\uff1f<br \/>\n\u5982\u679c\u53ea\u4f7f\u7528mybatis-spring\u7684\u529f\u80fd\uff0c\u9700\u8981\u4f7f\u7528@MapperScan\u6307\u5b9a\u8981\u626b\u63cf\u7684\u57fa\u7840\u5305\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f7f\u7528mybatis-spring-boot-starter\uff0c\u8be5Spring Boot\u5e94\u7528\u7a0b\u5e8f\uff08MybatisDemoApplication\uff09\u6240\u5728\u7684\u5305\uff08com.example\uff09\u4e0b\u7684\u63a5\u53e3\u5c06\u4f5c\u4e3aMapper\u63a5\u53e3\u8fdb\u884c\u626b\u63cf\uff0c\u5e76\u4e14\u8be5\u63a5\u53e3\u4e0a\u8fd8\u8981\u6807\u6709@org.apache.ibatis.annotations.Mapper\uff08\u8fd9\u662f\u5728mybatis 3.4\u4e2d\u6dfb\u52a0\u7684\u6ce8\u89e3\uff09\u3002<\/p>\n<blockquote><p>\u6ce8\u610f\uff1a<br \/>\n\u5728mybatis-spring-boot-starter 1.0\u7cfb\u4e2d\uff0cSpring Boot\u5e94\u7528\u7a0b\u5e8f(MybatisDemoApplication)\u4e2d\u7684\u6240\u6709\u4f4d\u4e8ecom.example\u5305\u4e0b\u7684\u63a5\u53e3\u90fd\u88ab\u626b\u63cf\u4e3aMapper\u63a5\u53e3\u3002<br \/>\n\u5c3d\u7ba1\u8fd9\u4e2a\u673a\u5236\u5f88\u65b9\u4fbf\uff0c\u4f46\u4e5f\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5373\u672a\u7ecf\u610f\u7684\u63a5\u53e3\u4f1a\u88ab\u626b\u63cf\u4e3aMapper\u63a5\u53e3\u5e76\u6ce8\u518c\u5230DI\u5bb9\u5668\u4e2d\u3002@Mapper\u6ce8\u89e3\u662f\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u800c\u6dfb\u52a0\u7684\u6807\u8bb0\u6ce8\u89e3\u3002<\/p><\/blockquote>\n<p>\u5982\u679c\u5728Mapper\u63a5\u53e3\u4e0a\u672a\u6dfb\u52a0@Mapper\u6ce8\u91ca\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528@MapperScan\u6765\u663e\u5f0f\u6307\u5b9a\u8981\u626b\u63cf\u7684\u57fa\u7840\u5305\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@MapperScan<\/span><span class=\"o\">(<\/span><span class=\"s\">\"com.example.mybatisdemo.mapper\"<\/span><span class=\"o\">)<\/span> <span class=\"c1\">\/\/ \u30b9\u30ad\u30e3\u30f3\u3059\u308b\u30d9\u30fc\u30b9\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u660e\u793a\u7684\u306b\u6307\u5b9a\u3059\u308b<\/span>\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplication<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"c1\">\/\/ ...<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u4f7f\u7528\u7c7b\u578b\u522b\u540d\u3002<\/h1>\n<p>\u5728\u5c06SQL\u7f16\u5199\u4e3aXML\u65f6\uff0c\u6211\u8ba4\u4e3a\u6709\u65f6\u5019\u60f3\u8981\u5728parameterType\u548cresultType\u5c5e\u6027\u4e2d\u6307\u5b9a\u4e00\u4e2a\u7b80\u5355\u7684\u7c7b\u540d\uff08\u522b\u540d\uff09\uff0c\u800c\u4e0d\u662f\u7c7b\u7684\u5b8c\u6574\u7c7b\u540d\uff08FQCN\uff09\u3002<\/p>\n<p>\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\uff0c\u60a8\u53ea\u9700\u8981\u5728applicaion.properties\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u4e49\u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.type-aliases-package<\/span><span class=\"p\">=<\/span><span class=\"s\">com.example.mybatisdemo.domain<\/span>\r\n<\/code><\/pre>\n<p>\u5bf9\u4e8e\u591a\u4e2a\u57fa\u672c\u5305\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u9017\u53f7\u8fdb\u884c\u5206\u9694\u8fdb\u884c\u6307\u5b9a\u3002\u4ece2.0.1\u7248\u672c\u5f00\u59cb\uff0c\u652f\u6301\u901a\u914d\u7b26\uff08\u4f8b\u5982\uff1acom.example.**.domain\uff09\u8fdb\u884c\u6307\u5b9a\uff08mybatis-spring2.0.1\u7248\u672c\u53ca\u4ee5\u4e0a\u53ef\u7528\uff0c\u4f46\u63a8\u8350\u4f7f\u75282.0.2\u7248\u672c\u53ca\u4ee5\u4e0a\uff09\u3002<\/p>\n<blockquote><p>\u91cd\u8981\u4e8b\u9879\uff1a<br \/>\n\u636e\u62a5\u9053\uff0c\u4f7f\u75282.0.1\u7248\u672c\u7684mybatis.type-aliases-package\u65f6\uff0c\u5c06\u5728\u7279\u5b9a\u6761\u4ef6\u4e0b\u53d1\u751f\u9519\u8bef\u3002\u6709\u5173\u9519\u8bef\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605mybatis-spring-boot-starter 2.0\u7684\u53d8\u66f4\u5185\u5bb9\u3002<\/p>\n<p>2019\/7\/15 \u66f4\u65b0\uff1a<br \/>\n\u8be5\u95ee\u9898\u57282.1.0\u7248\u672c\u4e2d\u5df2\u7ecf\u89e3\u51b3\u3002<\/p><\/blockquote>\n<p>\u65b0\u589e\u4e86\u4e00\u4e2a\u5c5e\u6027\uff0c\u7528\u4e8e\u6307\u5b9a\u6ce8\u518c\u7c7b\u578b\u522b\u540d\u7684\u7c7b\u6240\u5c5e\u7684\u7236\u7c7b\u3002\u8fd9\u662f\u5bf9mybatis-spring\u4e2d\u539f\u6709\u652f\u6301\u673a\u5236\u7684\u6539\u8fdb\uff0c\u4f7f\u5176\u53ef\u4ee5\u5728Spring Boot\u7684\u914d\u7f6e\u5c5e\u6027\u4e2d\u8fdb\u884c\u6307\u5b9a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.type-aliases-super-type<\/span><span class=\"p\">=<\/span><span class=\"s\">com.example.mybatisdemo.TypeAliasTarget<\/span>\r\n<\/code><\/pre>\n<h1>\u5e94\u7528\u7c7b\u578b\u5904\u7406\u7a0b\u5e8f<\/h1>\n<p>\u5982\u679c\u60a8\u5e0c\u671b\u6dfb\u52a0MyBatis\u9ed8\u8ba4\u672a\u63d0\u4f9b\u7684\u7c7b\u578b\u5904\u7406\u5668\uff0c\u6216\u8005\u8986\u76d6\u9ed8\u8ba4\u5e94\u7528\u7684\u7c7b\u578b\u5904\u7406\u5668\uff0c\u60a8\u53ea\u9700\u5728applicaion.properties\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u4e49\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.type-handlers-package<\/span><span class=\"p\">=<\/span><span class=\"s\">com.example.mybatisdemo.typehandler<\/span>\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u4f7f\u7528\u9017\u53f7\u5206\u9694\u591a\u4e2a\u57fa\u672c\u5305\u6765\u6307\u5b9a\u3002\u4ece2.0.1\u7248\u672c\u5f00\u59cb\uff0c\u53ef\u4ee5\u4f7f\u7528\u901a\u914d\u7b26\uff08\u4f8b\u5982\uff1acom.example.**.typehandler\uff09\u3002\u53ef\u4ee5\u4f7f\u7528mybatis-spring 2.0.1+\u7248\u672c\uff0c\u4f46\u63a8\u8350\u4f7f\u75282.0.2+\u7248\u672c\u3002<\/p>\n<p>\u81ea2.1.0\u7248\u672c\u8d77\uff0c\u53ef\u4ee5\u68c0\u6d4b\u5e76\u5e94\u7528\u5df2\u6ce8\u518c\u5230DI\u5bb9\u5668\u4e2d\u7684TypeHandler\u5230MyBatis\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplication<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nc\">MyTypeHandler<\/span> <span class=\"nf\">myTypeHandler<\/span><span class=\"o\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">MyTypeHandler<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u8981\u5c06\u591a\u4e2aTypeHandler\u5e94\u7528\u4e8eMyBatis\uff0c\u53ea\u9700\u5206\u522b\u5b9a\u4e49\u6bcf\u4e2aBean\u3002<\/p>\n<h1>\u66f4\u6539SqlSession\u7684\u6267\u884c\u6a21\u5f0f<\/h1>\n<p>\u9ed8\u8ba4\u7684\u8fd0\u884c\u6a21\u5f0f\u662fMyBatis\u914d\u7f6e\u7684\u8bbe\u7f6e\u503c\uff08\u9ed8\u8ba4\u4e3a\u7b80\u5355\u6a21\u5f0f\uff09\uff0c\u4f46\u6839\u636e\u5e94\u7528\u7a0b\u5e8f\u7684\u7c7b\u578b\u548c\u8981\u6c42\uff0c\u53ef\u80fd\u5e0c\u671b\u66f4\u6539\u8fd0\u884c\u6a21\u5f0f\u3002<br \/>\n\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u53ea\u9700\u5728applicaion.properties\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u4e49\u5373\u53ef\u3002\u5f53\u7136\uff0c\u4e5f\u53ef\u4ee5\u66f4\u6539MyBatis\u914d\u7f6e\u7684\u8bbe\u7f6e\u503c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.executor-type<\/span><span class=\"p\">=<\/span><span class=\"s\">BATCH<\/span>\r\n<\/code><\/pre>\n<h1>\u663e\u5f0f\u5730\u52a0\u8f7dMapper XML\u6587\u4ef6<\/h1>\n<p>\u5982\u679c\u4e0d\u901a\u8fc7Mapper\u63a5\u53e3\u76f4\u63a5\u4f7f\u7528SqlSession(SqlSessionTemplate)\u6765\u6267\u884cSQL\uff0c\u5219\u9700\u8981\u660e\u786e\u5730\u8bfb\u53d6\u5b9a\u4e49\u4e86SQL\u7684Mapper XML\u6587\u4ef6\u3002<br \/>\n\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u53ea\u9700\u8981\u5411applicaion.properties\u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u4e49\u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.mapper-locations<\/span><span class=\"p\">=<\/span><span class=\"s\">classpath*:\/mybatis\/sqls\/**\/*.xml<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u4e2d\u56fd\uff0c\u60a8\u8fd8\u53ef\u4ee5\u4f7f\u7528\u9017\u53f7\u5206\u9694\u7b26\u6307\u5b9a\u591a\u4e2a\u4f4d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"err\">mybatis.mapper-locations[0]=classpath*:\/mybatis\/sqls\/aaa\/**\/*.xml<\/span>\r\n<span class=\"err\">mybatis.mapper-locations[1]=classpath*:\/mybatis\/sqls\/bbb\/**\/*.xml<\/span>\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u4ee5\u8fd9\u79cd\u65b9\u5f0f\u6307\u5b9a\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5982\u679c\u4f7f\u7528yaml\u6587\u4ef6\u800c\u4e0d\u662fproperties\u6587\u4ef6\uff0c\u53ef\u4ee5<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">mybatis<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">mapper-locations<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">classpath*:\/mybatis\/sqls\/aaa\/**\/*.xml<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">classpath*:\/mybatis\/sqls\/bbb\/**\/*.xml<\/span>\r\n<\/code><\/pre>\n<p>\u4e5f\u53ef\u4ee5\u8868\u8fbe\u4e3a\u8fd9\u6837\u7684\u53e5\u5b50\u3002<\/p>\n<h1>MyBatis\u7684\u914d\u7f6e<\/h1>\n<p>\u57281.0\u7248\u672c\u4e2d\uff0c\u5982\u679c\u60f3\u8981\u81ea\u5b9a\u4e49MyBatis\u7684\u884c\u4e3a\uff0c\u9700\u8981\u5728MyBatis\u914d\u7f6e\u6587\u4ef6\u7684\u6807\u7b7e\u4e2d\u6dfb\u52a0\u8bbe\u7f6e\u3002\u4f46\u4ece1.1\u7248\u672c\u5f00\u59cb\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728application.properties\u4e2d\u8fdb\u884c\u8bbe\u7f6e\u3002\u6b64\u5916\uff0c\u4ece1.3\u7248\u672c\uff08\u57281.2.1\u7248\u672c\u4e2d\u4e5f\u5df2\u7ecf\u6dfb\u52a0\uff09\u5f00\u59cb\uff0c\u589e\u52a0\u4e86ConfigurationCustomizer\u63a5\u53e3\uff0c\u53ef\u4ee5\u5b8c\u5168\u81ea\u5b9a\u4e49MyBatis\u7684\u914d\u7f6e\u3002<\/p>\n<h2>MyBatis\u914d\u7f6e\u6587\u4ef6\u7684\u4f7f\u7528\u793a\u4f8b<\/h2>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.config-location<\/span><span class=\"p\">=<\/span><span class=\"s\">classpath:\/mybatis\/mybatis-config.xml<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;<\/span>\r\n<span class=\"cp\">&lt;!DOCTYPE configuration\r\n    PUBLIC \"-\/\/mybatis.org\/\/DTD Config 3.0\/\/EN\"\r\n    \"http:\/\/mybatis.org\/dtd\/mybatis-3-config.dtd\"&gt;<\/span>\r\n<span class=\"nt\">&lt;configuration&gt;<\/span>\r\n    <span class=\"nt\">&lt;settings&gt;<\/span>\r\n        <span class=\"nt\">&lt;setting<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"mapUnderscoreToCamelCase\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"true\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;setting<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"defaultFetchSize\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"100\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;setting<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"defaultStatementTimeout\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"30\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/settings&gt;<\/span>\r\n<span class=\"nt\">&lt;\/configuration&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u7136\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u9664\u4e86\u4e4b\u5916\u7684\u6807\u8bb0\u3002<br \/>\n\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0cMyBatis\u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u68c0\u67e5MyBatis\u914d\u7f6e\u6587\u4ef6\u662f\u5426\u5b58\u5728\u7684\u673a\u5236\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u7981\u7528\u7684\u3002\u5982\u679c\u60a8\u5e0c\u671b\u542f\u7528\u8be5\u673a\u5236\uff0c\u8bf7\u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u4e49\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.check-config-location<\/span><span class=\"p\">=<\/span><span class=\"s\">true<\/span>\r\n<\/code><\/pre>\n<h2>application.properties\u7684\u793a\u4f8b\u914d\u7f6e\u503c<\/h2>\n<p>\u60a8\u4e5f\u53ef\u4ee5\u53ea\u4f7f\u7528application.properties\u800c\u4e0d\u4f7f\u7528MyBatis\u914d\u7f6e\u6587\u4ef6\u6765\u8fdb\u884c\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.configuration.map-underscore-to-camel-case<\/span><span class=\"p\">=<\/span><span class=\"s\">true<\/span>\r\n<span class=\"py\">mybatis.configuration.default-fetch-size<\/span><span class=\"p\">=<\/span><span class=\"s\">100<\/span>\r\n<span class=\"py\">mybatis.configuration.default-statement-timeout<\/span><span class=\"p\">=<\/span><span class=\"s\">30<\/span>\r\n<\/code><\/pre>\n<p>\u53e6\u5916\uff0c\u4e0d\u53ef\u4ee5\u540c\u65f6\u6307\u5b9amybatis.configuration.xxxx\u548cmybatis.config-location\uff0c\u5982\u679c\u6307\u5b9a\u4f1a\u51fa\u9519\u3002<\/p>\n<blockquote><p>\u6ce8\u610f\uff1a<br \/>\n\u5728\u7248\u672c1.1.1\u4e4b\u524d\uff0cIDE\u65e0\u6cd5\u81ea\u52a8\u5b8c\u6210mybatis.configuration\u4e0b\u7684\u5c5e\u6027\uff0c\u4f46\u5728\u7248\u672c1.2\u4e2d\u5df2\u89e3\u51b3\u3002\uff08\u7136\u800c&#8230;\u4f3c\u4e4e\u5b58\u5728\u76f8\u540c\u7684\u5c5e\u6027\u952e\u91cd\u590d\u7684\u95ee\u9898\uff09<\/p>\n<p>\u8865\u5145\u4e8e2017\u5e741\u67088\u65e5\uff1a<br \/>\n\u8f93\u5165\u81ea\u52a8\u5b8c\u6210\u65f6\u5c5e\u6027\u952e\u91cd\u590d\u7684\u95ee\u9898\u662f\u7531\u4e8emaven-bundle-plugin 2.5.4\u7684\u9519\u8bef\u5bfc\u81f4\u7684\uff0c\u5982\u679c\u4f7f\u7528maven-bundle-plugin 3.0.0+\u8fdb\u884c\u6784\u5efa\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u95ee\u9898\u3002\u6211\u8ba4\u4e3a\u8fd9\u4e2a\u95ee\u9898\u5c06\u5728mybatis-spring-boot-starter \uff03gh-127\u4e2d\u5f97\u5230\u89e3\u51b3\uff0c\u5e76\u5728\u7248\u672c1.2.1\u4e2d\u4fee\u590d\u3002<\/p>\n<p>\u8865\u5145\u4e8e2017\u5e744\u670810\u65e5\uff1a<br \/>\n\u8f93\u5165\u81ea\u52a8\u5b8c\u6210\u65f6\u5c5e\u6027\u952e\u91cd\u590d\u7684\u95ee\u9898\u5df2\u5728\u7248\u672c1.3\uff08\u4e5f\u5df2\u5411\u7248\u672c1.2.1\u8fdb\u884c\u4e86\u540e\u79fb\uff09\u4e2d\u89e3\u51b3\u3002<\/p><\/blockquote>\n<h2>\u4f7f\u7528ConfigurationCustomizer\u8fdb\u884c\u81ea\u5b9a\u4e49\u7684\u793a\u4f8b<\/h2>\n<p>\u4ece\u7248\u672c1.3.0\uff08\u5df2\u7ecf\u8fdb\u884c\u4e861.2.1\u7684\u56de\u6eaf\uff09\u5f00\u59cb\uff0cMyBatis\u6dfb\u52a0\u4e86\u4e00\u4e2a\u56de\u8c03\u63a5\u53e3\uff08org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer\uff09\uff0c\u7528\u4e8e\u5728Java\u4ee3\u7801\u4e2d\u81ea\u5b9a\u4e49\u4fdd\u5b58MyBatis\u914d\u7f6e\u4fe1\u606f\u7684Bean\uff08org.apache.ibatis.session.Configuration\u7684Bean\uff09\u3002\u5982\u4e0b\u6240\u793a\uff0c\u5982\u679c\u5b9a\u4e49\u4e00\u4e2a\u5b9e\u73b0\u4e86\u8be5\u63a5\u53e3\u7684\u7c7b\u4f5c\u4e3aBean\uff0c\u90a3\u4e48configure\u65b9\u6cd5\u5c06\u88ab\u8c03\u7528\u56de\u8c03\uff0c\u901a\u8fc7\u4f7f\u7528Java\u4ee3\u7801\u53ef\u4ee5\u5b8c\u5168\u81ea\u5b9a\u4e49MyBatis\u7684\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Configuration<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MyBatisConfiguration<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nc\">ConfigurationCustomizer<\/span> <span class=\"nf\">mybatisConfigurationCustomizer<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"o\">(<\/span><span class=\"n\">configuration<\/span><span class=\"o\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"c1\">\/\/ aplication.properties\u3067\u6307\u5b9a\u30fb\u8868\u73fe\u3067\u304d\u306a\u3044\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u30b3\u30fc\u30c9\u3092\u5b9f\u88c5<\/span>\r\n            <span class=\"n\">configuration<\/span><span class=\"o\">.<\/span><span class=\"na\">getTypeHandlerRegistry<\/span><span class=\"o\">().<\/span><span class=\"na\">register<\/span><span class=\"o\">(<\/span><span class=\"nc\">RoundingMode<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"nc\">EnumOrdinalTypeHandler<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">};<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u5e94\u7528\u5916\u90e8\u5b9a\u4e49\u7684\u5c5e\u6027\u503c<\/h1>\n<p>MyBatis\u5141\u8bb8\u5c06\u5916\u90e8\u5b9a\u4e49\u7684\u5c5e\u6027\u503c\u5d4c\u5165\u5230MyBatis\u914d\u7f6e\u6587\u4ef6\u548cMapper\u6587\u4ef6\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528MyBatis\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u5143\u7d20\u6307\u5b9a\u5916\u90e8\u5b9a\u4e49\u3002\uff08\u867d\u7136\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728\u7a0b\u5e8f\u4e2d\u6307\u5b9a\uff0c\u4f46\u672c\u5e16\u4e0d\u6d89\u53ca\u6b64\u5904\u7406\u3002\uff09<\/p>\n<ul class=\"post-ul\">http:\/\/www.mybatis.org\/mybatis-3\/ja\/configuration.html#properties<\/ul>\n<p>\u6b64\u5916\uff0c\u5982\u679c\u4f7f\u7528MyBatis-Spring\uff0c\u53ef\u4ee5\u5728MyBatis\u914d\u7f6e\u6587\u4ef6\u7684\u5143\u7d20\u4e2d\u52a0\u5165\u5916\u90e8\u5b9a\u4e49\uff0c\u5e76\u4e14\u53ef\u4ee5\u901a\u8fc7SqlSessionFactoryBean\u7684configurationProperties\u5c5e\u6027\uff08java.util.Properties\u7c7b\u578b\uff09\u6307\u5b9a\u3002\u4ece1.2\u7248\u672c\u5f00\u59cb\uff0c\u53ef\u4ee5\u4f7f\u7528application.properties\uff08\u6216application.yml\uff09\u6765\u8fdb\u884c\u6307\u5b9a\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u5728MyBatis\u914d\u7f6e\u6587\u4ef6\u4e2d\uff0c\u5bf9\u4ee5\u4e0b\u90e8\u5206\u8fdb\u884c\u4e86\u5b9a\u4e49&#8230;<\/p>\n<pre class=\"post-pre\"><code><span class=\"nt\">&lt;properties&gt;<\/span>\r\n  <span class=\"nt\">&lt;property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"key\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"value\"<\/span><span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;\/properties&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u5728application.properties\uff08\u6216application.yml\uff09\u6587\u4ef6\u4e2d\u8fdb\u884c\u5982\u4e0b\u4fee\u6539\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.configuration-properties.key<\/span><span class=\"p\">=<\/span><span class=\"s\">value<\/span>\r\n<\/code><\/pre>\n<blockquote><p>\u6ce8\u610f\uff1a<br \/>\n\u5b9e\u9645\u4e0a\uff0c\u5728\u7248\u672c1.1.1\u4e2d\uff0c\u901a\u8fc7\u4ee5\u4e0b\u5b9a\u4e49\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u76f8\u540c\u7684\u6548\u679c\u3002\u8fd9\u79cd\u65b9\u6cd5\u53ef\u4ee5\u5728\u7248\u672c1.2\u53ca\u66f4\u9ad8\u7248\u672c\u4e2d\u4f7f\u7528\uff0c\u5e76\u4e14\u5982\u679c\u5b58\u5728\u76f8\u540c\u7684\u952e\u540d\uff0c\u5219\u4f18\u5148\u4f7f\u7528\u5728\u7248\u672c1.2\u4e2d\u6dfb\u52a0\u7684\u7531mybatis.configuration-properties\u6307\u5b9a\u7684\u503c\u3002<\/p>\n<p>src\/main\/resources\/application.properties<br \/>\nmybatis.configuration.variables.key=value<\/p>\n<p>\u4f8b\u5982\uff0c\u53ef\u4ee5\u5728mybatis.configuration.variables\u4e2d\u5b9a\u4e49\u4e0e\u73af\u5883\u65e0\u5173\u7684\u503c\uff08\u6216\u9ed8\u8ba4\u503c\uff09\uff0c\u7136\u540e\u5728\u6bcf\u4e2a\u914d\u7f6e\u6587\u4ef6\u4e2d\u4f7f\u7528mybatis.configuration-properties\u6839\u636e\u914d\u7f6e\u6587\u4ef6\u7684\u73af\u5883\u9010\u4e2a\u8986\u76d6\u503c\u3002<\/p><\/blockquote>\n<h1>\u5e94\u7528\u63d2\u4ef6\uff08\u62e6\u622a\u5668\uff09\u7684\u8bbe\u7f6e<\/h1>\n<p>MyBatis\u63d0\u4f9b\u4e86\u4e00\u4e2a\u673a\u5236\uff08\u62e6\u622a\u5668\uff09\uff0c\u7528\u4e8e\u5e72\u9884MyBatis\u6838\u5fc3\u7ec4\u4ef6\u7684\u5904\u7406\u8fc7\u7a0b\u3002<br \/>\n\u6211\u8ba4\u4e3a\u5f88\u5c11\u4f1a\u4f7f\u7528\u8fd9\u4e2a\u673a\u5236\uff0c\u4f46\u5982\u679c\u60f3\u8981\u5728MyBatis\u4e2d\u5e94\u7528\u62e6\u622a\u5668\uff0c\u53ea\u9700\u6dfb\u52a0\u4ee5\u4e0b\u7c7b\u4f3c\u7684Bean\u5b9a\u4e49\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplication<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nc\">Interceptor<\/span> <span class=\"nf\">myInterceptor<\/span><span class=\"o\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">MyInterceptor<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"c1\">\/\/ ...<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60f3\u8981\u5728MyBatis\u4e2d\u5e94\u7528\u591a\u4e2aIntereptor\uff0c\u53ea\u9700\u5206\u522b\u5b9a\u4e49\u76f8\u5e94\u7684Bean\u5373\u53ef\u3002<\/p>\n<h1>\u5e94\u7528DatabaseIdProvider<\/h1>\n<p>MyBatis\u63d0\u4f9b\u4e86\u4e00\u79cd\u7528\u4e8e\u8bc6\u522b\u8fde\u63a5\u4e2d\u6570\u636e\u5e93\u7684\u673a\u5236(DatabaseIdProvider)\u3002<br \/>\n\u6211\u8ba4\u4e3a\u5e76\u4e0d\u7ecf\u5e38\u4f7f\u7528\u8fd9\u4e2a\u673a\u5236\uff0c\u4f46\u5982\u679c\u60f3\u8981\u5728MyBatis\u4e2d\u5e94\u7528DatabaseIdProvider\uff0c\u53ea\u9700\u6dfb\u52a0\u4ee5\u4e0b\u7c7b\u4f3c\u7684Bean\u5b9a\u4e49\u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MybatisDemoApplication<\/span><span class=\"err\">\u3000<\/span><span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nc\">VendorDatabaseIdProvider<\/span> <span class=\"nf\">vendorDatabaseIdProvider<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">VendorDatabaseIdProvider<\/span> <span class=\"n\">databaseIdProvider<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">VendorDatabaseIdProvider<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"nc\">Properties<\/span> <span class=\"n\">vendorProperties<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Properties<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">vendorProperties<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"PostgreSQL\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"postgresql\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">vendorProperties<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"H2\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"h2\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">databaseIdProvider<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">vendorProperties<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">databaseIdProvider<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"c1\">\/\/ ...<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u5e94\u7528\u8bed\u8a00\u9a71\u52a8\u5668<\/h1>\n<p>MyBatis \u63d0\u4f9b\u4e86\u4e00\u79cd\u673a\u5236\uff08LanguageDriver\uff09\u6765\u6539\u53d8\uff08\u81ea\u5b9a\u4e49\uff09\u8bed\u8a00\u4ee5\u6784\u5efa\u52a8\u6001 SQL\u3002<br \/>\n\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cMyBatis \u4f7f\u7528\u5185\u7f6e\u7684\u57fa\u4e8e XML \u7684\u8bed\u8a00\uff08XMLLanguageDriver\uff09\uff0c\u4f46\u5982\u679c\u5e0c\u671b\u66f4\u6539\u9ed8\u8ba4\u884c\u4e3a\uff0c\u5f00\u53d1\u8005\u53ea\u9700\u6dfb\u52a0\u4ee5\u4e0b\u7c7b\u4f3c\u7684 Bean \u5b9a\u4e49\u5373\u53ef\u4f7f\u7528\u81ea\u5df1\u521b\u5efa\u7684 LanguageDriver \u7c7b\uff082.1 \u7248\u672c\u4ee5\u540e\u53ef\u7528\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Bean<\/span>\r\n<span class=\"nc\">MyLanguageDriver<\/span> <span class=\"nf\">myLanguageDriver<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"nf\">MyLanguageDriver<\/span><span class=\"o\">();<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6b64\u5916\uff0c\u5982\u679c\u4eceDI\u5bb9\u5668\u4e2d\u68c0\u6d4b\u5230\u7684LanguageDriver Bean\u53ea\u6709\u4e00\u4e2a\uff0c\u90a3\u4e48\u68c0\u6d4b\u5230\u7684LanguageDriver\u5c06\u88ab\u89c6\u4e3a\u9ed8\u8ba4\u7684LanguageDriver\u7c7b\uff08\u5982\u679c\u68c0\u6d4b\u5230\u591a\u4e2aBean\uff0c\u5219\u9ed8\u8ba4\u7684XMLLanguageDriver\u5c06\u76f4\u63a5\u5e94\u7528\uff09\u3002\u5982\u679c\u4e0d\u60f3\u901a\u8fc7\u81ea\u52a8\u68c0\u6d4b\u529f\u80fd\u66f4\u6539\u9ed8\u8ba4\u7684LanguageDriver\u7c7b\uff0c\u6216\u8005\u60f3\u8981\u66f4\u6539\u9ed8\u8ba4\u7684LanguageDriver\u7c7b\u4ee5\u5728\u591a\u4e2aLanguageDriver\u5171\u5b58\u65f6\u4f7f\u7528\uff0c\u8bf7\u4f7f\u7528\u4e0b\u9762\u4ecb\u7ecd\u7684mybatis.default-scripting-language-driver\u5c5e\u6027\uff08\u6dfb\u52a0\u4e8e2.1\u7248\u672c\uff09\u6765\u660e\u786e\u6307\u5b9a\u9ed8\u8ba4\u7684LanguageDriver\u7c7b\u3002<\/p>\n<h1>\u9ed8\u8ba4\u6307\u5b9a\u8981\u4f7f\u7528\u7684LanguageDriver\u3002<\/h1>\n<p>\u5982\u679c\u8981\u660e\u786e\u6307\u5b9a\u9ed8\u8ba4\u4f7f\u7528\u7684LanguageDriver\uff0c\u5219\u53ea\u9700\u8fdb\u884c\u4ee5\u4e0b\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">mybatis.default-scripting-language-driver<\/span><span class=\"p\">=<\/span><span class=\"s\">{\u30c7\u30d5\u30a9\u30eb\u30c8\u306eLanguageDriver\u30af\u30e9\u30b9\u306eFQCN}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u5c5e\u6027\u53ef\u4ee5\u4ece2.1\u7248\u672c\u5f00\u59cb\u4f7f\u7528\u3002\u7136\u800c\uff0c\u57282.0\u7248\u672c\u4e4b\u524d\uff0c\u6211\u4eec\u652f\u6301\u4f7f\u7528 mybatis.configuration.default-scripting-language \u5c5e\u6027\uff08\u7528\u4e8e\u76f4\u63a5\u5411MyBatis\u63d0\u4f9b\u7684\u914d\u7f6e\u7c7b\u8bbe\u7f6e\u503c\uff09\uff0c\u4f5c\u4e3a\u6307\u5b9a\u9ed8\u8ba4\u7684 LanguageDriver \u7c7b\u7684\u65b9\u6cd5\u3002\u4f46\u662f\uff0c\u7531\u4e8e\u4e0e\u540e\u9762\u63d0\u5230\u7684\u201cLanguageDriver\u7684\u81ea\u52a8\u914d\u7f6e\u201d\u7ed3\u5408\u4f7f\u7528\u65f6\u53ef\u80fd\u65e0\u6cd5\u6309\u9884\u671f\u8fdb\u884c\u64cd\u4f5c\uff0c\u6240\u4ee5\u8fd9\u4e2a\u5c5e\u6027\u57282.1\u7248\u672c\u4e2d\u88ab\u5e9f\u5f03\uff08\u7981\u6b62\u4f7f\u7528\uff09\u3002<\/p>\n<h1>LanguageDriver\u7684\u81ea\u52a8\u914d\u7f6e<\/h1>\n<p>\u81eaMyBatis\u76842.1\u7248\u672c\u5f00\u59cb\uff0c\u4ee5\u4e0b\u4e09\u4e2a\u5b50\u6a21\u5757\uff08LanguageDriver\uff09\u7684\u81ea\u52a8\u914d\u7f6e\u673a\u5236\u5f97\u5230\u4e86\u652f\u6301\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mybatis-velocity<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">mybatis-freemarker<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">mybatis-thymeleaf<\/ul>\n<p>\u5f53\u5728\u7c7b\u8def\u5f84\u4e0a\u6dfb\u52a0\u4e0a\u8ff0\u4e09\u4e2a\u5b50\u6a21\u5757\u7684jar\u6587\u4ef6\u65f6\uff0c\u4f1a\u81ea\u52a8\u5c06\u63d0\u4f9b\u5b50\u6a21\u5757\u7684LanguageDriver\u7c7b\u7684Bean\u6ce8\u518c\u5230DI\u5bb9\u5668\u4e2d\uff0c\u5e76\u5e94\u7528\u5230MyBatis\u4e2d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5982\u679c\u5f00\u53d1\u8005\u660e\u786e\u5730\u5728\u4e0a\u8ff0\u5b50\u6a21\u5757\u4e2d\u63d0\u4f9bLanguageDriver\u7c7b\u7684Bean\u5b9a\u4e49\uff0c\u5219\u4e0d\u4f1a\u8fdb\u884c\u81ea\u52a8\u914d\u7f6e\u3002<\/p>\n<blockquote><p>\u8b66\u544a\uff1a<\/p>\n<p>\u5982\u679c\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\uff0c\u5c06\u4e27\u5931\u5411\u4e0b\u517c\u5bb9\u6027\uff0c\u9700\u8981\u989d\u5916\u7684\u63aa\u65bd\u3002<\/p>\n<p>1. mybatis-velocity\u3001mybatis-freemarker\u548cmybatis-thymeleaf\u8fd9\u4e09\u4e2a\u5b50\u6a21\u5757\u7684jar\u6587\u4ef6\u53ea\u6709\u4e00\u4e2a\u5728\u7c7b\u8def\u5f84\u4e0a\u3002<br \/>\n2. \u9ed8\u8ba4\u7684LanguageDriver\u4e0d\u662f\u7531\u5b50\u6a21\u5757\u63d0\u4f9b\u7684LanguageDriver\u3002<\/p>\n<p>\u5982\u679c\u6ee1\u8db3\u4ee5\u4e0a\u6761\u4ef6\uff0c\u56e0\u4e3a\u91c7\u7528\u4e86\u5b50\u6a21\u5757\u63d0\u4f9b\u7684LanguageDriver\u7c7b\u4f5c\u4e3a\u9ed8\u8ba4\u7684LanguageDriver\u8bbe\u7f6e\u673a\u5236\uff0c\u6240\u4ee5\u9700\u8981\u660e\u786e\u6307\u5b9a\u9ed8\u8ba4\u7684LanguageDriver\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<p>mybatis.default-scripting-language-driver={\u9ed8\u8ba4\u7684LanguageDriver\u7c7b\u7684FQCN}<\/p><\/blockquote>\n<h3>\u4f7f\u7528 MyBatis Velocity<\/h3>\n<p>\u5f53\u4f60\u6dfb\u52a0\u4ee5\u4e0b\u7684\u5de5\u5177\u540e\uff0c\u5b83\u4f1a\u5c06org.mybatis.scripting.velocity.VelocityLanguageDriver\uff08\u5982\u679c\u6307\u5b9amybatis-velocity 2.0\u4e4b\u524d\u7684\u7248\u672c\uff0c\u5219\u4f7f\u7528org.mybatis.scripting.velocity.Driver\uff09\u5e94\u7528\u5230MyBatis\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">&lt;!-- Mybatis Velocity\u3092\u5229\u7528\u3059\u308b\u5834\u5408 --&gt;<\/span>\r\n<span class=\"nt\">&lt;dependency&gt;<\/span>\r\n  <span class=\"nt\">&lt;groupId&gt;<\/span>org.mybatis.scripting<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n  <span class=\"nt\">&lt;artifactId&gt;<\/span>mybatis-velocity<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n  <span class=\"nt\">&lt;version&gt;<\/span>2.1.0<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662fMyBatis-velocity 2.1.0\u6216\u66f4\u9ad8\u7248\u672c\uff0c\u60a8\u53ef\u4ee5\u5229\u7528\u914d\u7f6e\u5c5e\u6027\u673a\u5236\u6765\u81ea\u5b9a\u4e49MyBatis Velocity\u548cVelocity\u6a21\u677f\u5f15\u64ce\u5728MyBatis Velocity\u4e2d\u7684\u64cd\u4f5c\u65b9\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#\r\n# mybatis.scripting-language-driver.velocity.{key} = {value} \u5f62\u5f0f\r\n#\r\n<\/span>\r\n<span class=\"c\"># Velocity\u672c\u4f53\u306e\u52d5\u4f5c\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u30d7\u30ed\u30d1\u30c6\u30a3\r\n# mybatis.scripting-language-driver.velocity.velocity-settings.{name} = {value}\u5f62\u5f0f\r\n# {name}\u306b\u8a2d\u5b9a\u53ef\u80fd\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n<\/span><span class=\"py\">mybatis.scripting-language-driver.velocity.velocity-settings.runtime.custom_directives<\/span> <span class=\"p\">=<\/span> <span class=\"s\">com.example.directives.MyDirective<\/span>\r\n\r\n<span class=\"c\"># \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30f3\u30b8\u30f3\u306b\u6e21\u3059\u8ffd\u52a0\u5c5e\u6027(\u30aa\u30d6\u30b8\u30a7\u30af\u30c8)\u3092\u6307\u5b9a\u3059\u308b\u30d7\u30ed\u30d1\u30c6\u30a3\r\n# mybatis.scripting-language-driver.velocity.additional-context-attributes.{name} = {value}\r\n<\/span><span class=\"py\">mybatis.scripting-language-driver.velocity.additional-context-attributes.likeEscape<\/span> <span class=\"p\">=<\/span> <span class=\"s\">com.example.helpers.LikeEscape<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528 MyBatis FreeMarker<\/h3>\n<p>\u5728\u6dfb\u52a0\u4ee5\u4e0b\u7684\u5de5\u4ef6\u540e\uff0c\u5c06org.mybatis.scripting.freemarker.FreeMarkerLanguageDriver\u5e94\u7528\u5230MyBatis\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nt\">&lt;dependency&gt;<\/span>\r\n  <span class=\"nt\">&lt;groupId&gt;<\/span>org.mybatis.scripting<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n  <span class=\"nt\">&lt;artifactId&gt;<\/span>mybatis-freemarker<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n  <span class=\"nt\">&lt;version&gt;<\/span>1.2.0<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u8981\u4f7f\u7528mybatis-velocity 1.2.0\u7248\u672c\u6216\u66f4\u9ad8\u7248\u672c\uff0c\u53ef\u4ee5\u5229\u7528\u914d\u7f6e\u5c5e\u6027\u673a\u5236\u6765\u81ea\u5b9a\u4e49MyBatis FreeMarker\u548cMyBatis Velocity\u4e2d\u6240\u4f7f\u7528\u7684\u6a21\u677f\u5f15\u64ceFreeMarker\u7684\u884c\u4e3a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#\r\n# mybatis.scripting-language-driver.freemarker.{key} = {value} \u5f62\u5f0f\r\n#\r\n<\/span>\r\n<span class=\"c\"># FreeMarker\u672c\u4f53\u306e\u52d5\u4f5c\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u30d7\u30ed\u30d1\u30c6\u30a3\r\n# mybatis.scripting-language-driver.freemarker.freemarker-settings.{name} = {value}\u5f62\u5f0f\r\n# {name}\u306b\u8a2d\u5b9a\u53ef\u80fd\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n<\/span><span class=\"py\">mybatis.scripting-language-driver.freemarker.freemarker-settings.interpolation_syntax<\/span> <span class=\"p\">=<\/span> <span class=\"s\">dollar<\/span>\r\n\r\n<span class=\"c\"># MyBatis FreeMarker\u306e\u52d5\u4f5c\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u30d7\u30ed\u30d1\u30c6\u30a3\r\n# mybatis.scripting-language-driver.freemarker.{name} = {value}\r\n# {name}\u306b\u8a2d\u5b9a\u53ef\u80fd\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n<\/span><span class=\"py\">mybatis.scripting-language-driver.freemarker.template-file.base-dir<\/span> <span class=\"p\">=<\/span> <span class=\"s\">sql<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528MyBatis\u548cThymeleaf<\/h3>\n<p>\u6dfb\u52a0\u4ee5\u4e0b\u5de5\u4ef6\u540e\uff0c\u5c06org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriver\u5e94\u7528\u4e8eMyBatis\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nt\">&lt;dependency&gt;<\/span>\r\n  <span class=\"nt\">&lt;groupId&gt;<\/span>org.mybatis.scripting<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n  <span class=\"nt\">&lt;artifactId&gt;<\/span>mybatis-thymeleaf<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n  <span class=\"nt\">&lt;version&gt;<\/span>1.0.1<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u60a8\u53ef\u4ee5\u5229\u7528\u914d\u7f6e\u5c5e\u6027\u7684\u673a\u5236\u6765\u81ea\u5b9a\u4e49Thymeleaf\u6a21\u677f\u5f15\u64ce\u7684\u884c\u4e3a\uff0c\u5305\u62ec\u5728MyBatis Thymeleaf\u548cThymeleaf\u4e2d\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#\r\n# mybatis.scripting-language-driver.thymeleaf.{key} = {value} \u5f62\u5f0f\r\n#\r\n<\/span>\r\n<span class=\"c\"># MyBatis Thymeleaf\u306e\u52d5\u4f5c\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u30d7\u30ed\u30d1\u30c6\u30a3\r\n# mybatis.scripting-language-driver.thymeleaf.{name} = {value}\r\n# {name}\u306b\u8a2d\u5b9a\u53ef\u80fd\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n<\/span><span class=\"py\">mybatis.scripting-language-driver.thymeleaf.use2way<\/span> <span class=\"p\">=<\/span> <span class=\"s\">false<\/span>\r\n<span class=\"py\">mybatis.scripting-language-driver.thymeleaf.template-file.cache-enabled<\/span> <span class=\"p\">=<\/span> <span class=\"s\">false<\/span>\r\n<span class=\"py\">mybatis.scripting-language-driver.thymeleaf.dialect.like-additional-escape-target-chars<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\uff05, \uff3f<\/span>\r\n<\/code><\/pre>\n<h1>\u6620\u5c04\u5668\u7684\u5ef6\u8fdf\u521d\u59cb\u5316\u63a7\u5236<\/h1>\n<p>\u4ece 2.1 \u7248\u672c\u5f00\u59cb\uff0c\u53ef\u4ee5\u63a7\u5236\u5728 DI \u5bb9\u5668\u4e2d\u6ce8\u518c\u7684 Mapper \u7684\u521d\u59cb\u5316\u65f6\u673a\uff08\u5728 DI \u5bb9\u5668\u521d\u59cb\u5316\u65f6\u3001\u6ce8\u5165\u6216\u4f7f\u7528\u65f6\uff09\u3002\u9ed8\u8ba4\u884c\u4e3a\u662f\u5728 DI \u5bb9\u5668\u521d\u59cb\u5316\u65f6\u521d\u59cb\u5316\u6240\u6709\u7684 Mapper\u3002<\/p>\n<p>Spring Boot 2.2\uff08\u5728\u53d1\u5e03\u65f6\u5c1a\u672a\u6b63\u5f0f\u53d1\u5e03\uff09\u4e2d\u652f\u6301Bean\u7684\u5ef6\u8fdf\u521d\u59cb\u5316\u673a\u5236\uff0c\u4f46\u5b58\u5728\u7279\u5b9a\u6761\u4ef6\u4e0b\u8c03\u7528Mapper\u65b9\u6cd5\u65f6\u4f1a\u53d1\u751f\u9519\u8bef\u3002\u4e3a\u4e86\u4f7f\u7528\u6237\u80fd\u591f\u5728\u63a7\u5236\u4e0a\u5bf9Mapper\u5e94\u7528\u5ef6\u8fdf\u521d\u59cb\u5316\uff0c\u6211\u4eec\u6dfb\u52a0\u4e86\u8fd9\u4e2a\u673a\u5236\u3002\u5982\u679c\u53ea\u662f\u4e3a\u4e86\u907f\u514d\u9519\u8bef\uff0c\u53ef\u4ee5\u5728\u5bf9Mapper\u8fdb\u884c\u5ef6\u8fdf\u521d\u59cb\u5316\u65f6\u53d6\u6d88\u6761\u4ef6\u9650\u5236\u3002\u4f46\u5728\u5f00\u53d1\uff08\u6d4b\u8bd5\uff09\u9636\u6bb5\uff0c\u6211\u8ba4\u4e3a\u5ef6\u8fdf\u521d\u59cb\u5316\u673a\u5236\u662f\u6709\u6548\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u72ec\u7acb\u4e8eMyBatis\uff08mybatis-spring &amp; mybatis-spring-boot-starter\uff09\u5b9e\u73b0\u4e86\u5bf9Mapper\u7684\u5ef6\u8fdf\u521d\u59cb\u5316\u63a7\u5236\u3002\u8be6\u7ec6\u4fe1\u606f\u8bf7\u53c2\u9605\u201cmybatis-spring-boot 2.1.0\u4e2d\u65b0\u589e\u7684mybatis.lazy-initialization\u201d\u3002<\/p>\n<blockquote><p>\u6ce8\u610f\uff1a<\/p>\n<p>\u4ece\u7248\u672c2.1\u5f00\u59cb\uff0c\u63d0\u4f9b\u4e86\u5ef6\u8fdf\u521d\u59cb\u5316\u673a\u5236\uff0c\u5b83\u662fMyBatis(mybatis-spring &amp; mybatis-spring-boot-starter)\u72ec\u6709\u7684\u673a\u5236\uff0c\u6240\u4ee5\u5728Spring Boot 2.1\u7cfb\u5217\u4e2d\u4e5f\u53ef\u4ee5\u4f7f\u7528\u3002<\/p><\/blockquote>\n<h1>\u4f7f\u7528 @MybatisTest(mybatis-spring-boot-starter-test)<\/h1>\n<p>\u4ece\u7248\u672c1.3\u5f00\u59cb\uff0c\u6dfb\u52a0\u4e86@MybatisTest\u6ce8\u89e3\u6765\u652f\u6301\u5728\u6d4b\u8bd5MyBatis\u529f\u80fd\u65f6\u9700\u8981\u7684Bean\u5b9a\u4e49\u3002\u8fd9\u662fSpring Boot\u63d0\u4f9b\u7684@DataJpaTest\u548c@JdbcTest\u7684MyBatis\u7248\u672c\uff08\u5f53\u7136\uff0c\u7528\u6cd5\u4e0eSpring Boot\u63d0\u4f9b\u7684\u6ce8\u89e3\u76f8\u540c\uff09\u3002<br \/>\n\u968f\u7740\u8fd9\u4e2a\u6539\u52a8\uff0c\u65b0\u5efa\u4e86mybatis-spring-boot-starter-test\u6765\u89e3\u51b3\u6d4b\u8bd5MyBatis\u529f\u80fd\u6240\u9700\u7684\u5e93\u95ee\u9898\u3002\u56e0\u6b64\uff0c\u5982\u679c\u8981\u5bf9MyBatis\u63d0\u4f9b\u7684\u529f\u80fd\u8fdb\u884c\u6d4b\u8bd5\uff0c\u8bf7\u5728pom.xml\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u4e49\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nt\">&lt;dependency&gt;<\/span>\r\n    <span class=\"nt\">&lt;groupId&gt;<\/span>org.mybatis.spring.boot<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n    <span class=\"nt\">&lt;artifactId&gt;<\/span>mybatis-spring-boot-starter-test<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n    <span class=\"nt\">&lt;version&gt;<\/span>2.1.0<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n    <span class=\"nt\">&lt;scope&gt;<\/span>test<span class=\"nt\">&lt;\/scope&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u4f8b\u5982\uff0c\u5982\u679c\u8981\u5bf9\u4ee5\u4e0b\u7c7b\u4f3c\u7684Mapper\u63a5\u53e3\u8fdb\u884c\u6d4b\u8bd5\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo.mapper<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.example.mybatisdemo.domain.Todo<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Insert<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Mapper<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Options<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.ibatis.annotations.Select<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Mapper<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">TodoMapper<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Insert<\/span><span class=\"o\">(<\/span><span class=\"s\">\"INSERT INTO todo (title, details, finished) VALUES (#{title}, #{details}, #{finished})\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nd\">@Options<\/span><span class=\"o\">(<\/span><span class=\"n\">useGeneratedKeys<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">,<\/span> <span class=\"n\">keyProperty<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"id\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kt\">void<\/span> <span class=\"nf\">insert<\/span><span class=\"o\">(<\/span><span class=\"nc\">Todo<\/span> <span class=\"n\">todo<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"nd\">@Select<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SELECT id, title, details, finished FROM todo WHERE id = #{id}\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nc\">Todo<\/span> <span class=\"nf\">select<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"o\">);<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u4f7f\u7528@MybatisTest\uff0c\u5c31\u53ef\u4ee5\u521b\u5efa\u4ee5\u4e0b\u7c7b\u578b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7c7b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo.mapper<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.example.mybatisdemo.domain.Todo<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.Test<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.runner.RunWith<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.mybatis.spring.boot.test.autoconfigure.MybatisTest<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Autowired<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.core.BeanPropertyRowMapper<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.core.namedparam.MapSqlParameterSource<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.support.GeneratedKeyHolder<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.test.context.junit4.SpringRunner<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">assertj<\/span><span class=\"o\">.<\/span><span class=\"na\">core<\/span><span class=\"o\">.<\/span><span class=\"na\">api<\/span><span class=\"o\">.<\/span><span class=\"na\">Assertions<\/span><span class=\"o\">.<\/span><span class=\"na\">assertThat<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@RunWith<\/span><span class=\"o\">(<\/span><span class=\"nc\">SpringRunner<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n<span class=\"nd\">@MybatisTest<\/span> <span class=\"c1\">\/\/ (1)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">TodoMapperTests<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">TodoMapper<\/span> <span class=\"n\">todoMapper<\/span><span class=\"o\">;<\/span> <span class=\"c1\">\/\/ (2)<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">NamedParameterJdbcOperations<\/span> <span class=\"n\">jdbcOperations<\/span><span class=\"o\">;<\/span> <span class=\"c1\">\/\/ (3)<\/span>\r\n\r\n    <span class=\"nd\">@Test<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">insert<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n\r\n        <span class=\"c1\">\/\/ setup<\/span>\r\n        <span class=\"c1\">\/\/ none<\/span>\r\n\r\n        <span class=\"c1\">\/\/ perform test and assertions<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"c1\">\/\/ (4)<\/span>\r\n            <span class=\"nc\">Todo<\/span> <span class=\"n\">newTodo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Todo<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">setTitle<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u98f2\u307f\u4f1a\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">setDetails<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u9280\u5ea7 19:00\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">todoMapper<\/span><span class=\"o\">.<\/span><span class=\"na\">insert<\/span><span class=\"o\">(<\/span><span class=\"n\">newTodo<\/span><span class=\"o\">);<\/span>\r\n\r\n            <span class=\"c1\">\/\/ (5)<\/span>\r\n            <span class=\"nc\">Todo<\/span> <span class=\"n\">actualTodo<\/span> <span class=\"o\">=<\/span>\r\n                <span class=\"n\">jdbcOperations<\/span><span class=\"o\">.<\/span><span class=\"na\">queryForObject<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SELECT * FROM todo WHERE id = :id\"<\/span><span class=\"o\">,<\/span>\r\n                    <span class=\"k\">new<\/span> <span class=\"nf\">MapSqlParameterSource<\/span><span class=\"o\">(<\/span><span class=\"s\">\"id\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getId<\/span><span class=\"o\">()),<\/span>\r\n                    <span class=\"k\">new<\/span> <span class=\"nc\">BeanPropertyRowMapper<\/span><span class=\"o\">&lt;&gt;(<\/span><span class=\"nc\">Todo<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">));<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getId<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getId<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getTitle<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u98f2\u307f\u4f1a\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getDetails<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u9280\u5ea7 19:00\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">isFinished<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n\r\n    <span class=\"nd\">@Test<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">select<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n\r\n        <span class=\"c1\">\/\/ (6)<\/span>\r\n        <span class=\"c1\">\/\/ setup<\/span>\r\n        <span class=\"nc\">Todo<\/span> <span class=\"n\">newTodo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Todo<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">setTitle<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u98f2\u307f\u4f1a\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">newTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">setDetails<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u9280\u5ea7 19:00\"<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"nc\">GeneratedKeyHolder<\/span> <span class=\"n\">keyHolder<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">GeneratedKeyHolder<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">jdbcOperations<\/span><span class=\"o\">.<\/span><span class=\"na\">update<\/span><span class=\"o\">(<\/span>\r\n            <span class=\"s\">\"INSERT INTO todo (title, details, finished) VALUES(:title, :details, :finished)\"<\/span><span class=\"o\">,<\/span>\r\n            <span class=\"k\">new<\/span> <span class=\"nf\">BeanPropertySqlParameterSource<\/span><span class=\"o\">(<\/span><span class=\"n\">newTodo<\/span><span class=\"o\">),<\/span> <span class=\"n\">keyHolder<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"c1\">\/\/ perform test and assertions<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"c1\">\/\/ (7)<\/span>\r\n            <span class=\"nc\">Todo<\/span> <span class=\"n\">actualTodo<\/span> <span class=\"o\">=<\/span> <span class=\"n\">todoMapper<\/span><span class=\"o\">.<\/span><span class=\"na\">select<\/span><span class=\"o\">(<\/span><span class=\"n\">keyHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">getKey<\/span><span class=\"o\">().<\/span><span class=\"na\">intValue<\/span><span class=\"o\">());<\/span>\r\n\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getId<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"n\">keyHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">getKey<\/span><span class=\"o\">().<\/span><span class=\"na\">intValue<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getTitle<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u98f2\u307f\u4f1a\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">getDetails<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\u9280\u5ea7 19:00\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">actualTodo<\/span><span class=\"o\">.<\/span><span class=\"na\">isFinished<\/span><span class=\"o\">()).<\/span><span class=\"na\">isEqualTo<\/span><span class=\"o\">(<\/span><span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<div>\n<div class=\"post-table\">\u9805\u756a\u8aac\u660e(1)\u30af\u30e9\u30b9\u306b<code>@MybatisTest<\/code>\u3092\u4ed8\u4e0e\u3059\u308b\u3002\u3053\u306e\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4ed8\u4e0e\u3059\u308b\u3053\u3068\u3067\u3001MyBatis\u3092\u52d5\u304b\u3059\u305f\u3081\u306b\u5fc5\u8981\u306b\u306a\u308bAutoConfigure\u30af\u30e9\u30b9\u3060\u3051\u304c\u6709\u52b9\u306b\u306a\u308a\u307e\u3059\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u52d5\u4f5c\u3067\u306f\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30b9\u30ad\u30e3\u30f3\u304c\u7121\u52b9\u5316\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u30c6\u30b9\u30c8\u6642\u306b\u5fc5\u8981\u306a\u3044Bean\u304c\u7121\u984c\u306bDI\u30b3\u30f3\u30c6\u30ca\u306b\u767b\u9332\u3055\u308c\u308b\u3053\u3068\u3092\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002(2)\u30c6\u30b9\u30c8\u5bfe\u8c61\u306eMapper\u3092\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u3059\u308b\u3002<code>@MybatisTest<\/code>\u3092\u4ed8\u4e0e\u3059\u308b\u3068\u3001MyBatis\u63d0\u4f9b\u306eAutoConfigure\u306b\u3088\u3063\u3066Mapper\u306eBean\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002(3)\u767b\u9332\u30c7\u30fc\u30bf\u306e\u691c\u8a3c\u304a\u3088\u3073\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u767b\u9332\u3059\u308b\u305f\u3081\u306b\u3001<code>NamedParameterJdbcTemplate<\/code> \u306eBean\u3092\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u3059\u308b\u3002<code>@MybatisTest<\/code>\u3092\u4ed8\u4e0e\u3059\u308b\u3068\u3001<code>JdbcTemplate<\/code>\u3068<code>NamedParameterJdbcTemplate<\/code>\u306eBean\u304cDI\u30b3\u30f3\u30c6\u30ca\u306b\u767b\u9332\u3055\u308c\u307e\u3059\u3002(4)\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e<code>insert<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002(5)<code>insert<\/code>\u30e1\u30bd\u30c3\u30c9\u306e\u547c\u3073\u51fa\u3057\u7d50\u679c\u3092\u691c\u8a3c\u3059\u308b\u3002\u3053\u3053\u3067\u306f\u3001<code>NamedParameterJdbcOperations<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4ecb\u3057\u3066\u767b\u9332\u3057\u305f\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3001\u767b\u9332\u3057\u305f\u30c7\u30fc\u30bf\u306e\u59a5\u5f53\u6027\u3092\u691c\u8a3c\u3057\u3066\u3044\u307e\u3059\u3002(6)<code>select<\/code>\u30e1\u30bd\u30c3\u30c9\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046\u305f\u3081\u306b\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u767b\u9332\u3059\u308b\u3002\u3053\u3053\u3067\u306f\u3001<code>NamedParameterJdbcOperations<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4ecb\u3057\u3066\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u767b\u9332\u3057\u3066\u3044\u307e\u3059\u3002\u306a\u304a\u3001Spring Framework\u63d0\u4f9b\u306e<code>@Sql<\/code>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306a\u3069\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u767b\u9332\u3059\u308b\u65b9\u6cd5\u3082\u3042\u308a\u307e\u3059\u3002(7)\u30c6\u30b9\u30c8\u5bfe\u8c61\u306e<code>select<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002(8)<code>select<\/code>\u30e1\u30bd\u30c3\u30c9\u306e\u547c\u3073\u51fa\u3057\u7d50\u679c\u3092\u691c\u8a3c\u3059\u308b\u3002<\/div>\n<\/div>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u8fdb\u884c\u6d4b\u8bd5\u65f6\uff0c\u7531\u4e8e\u5b58\u5728\u4e8e\u4e0a\u7ea7\u5305\u4e2d\u7684Spring Boot\u5e94\u7528\u7a0b\u5e8f\u7c7b\uff08\u6807\u6709@SpringBootApplication\u6ce8\u91ca\u7684\u7c7b\uff09\u4e2d\u5b9a\u4e49\u7684Bean\u5b9a\u4e49\u4e5f\u4f1a\u88ab\u52a0\u8f7d\uff0c\u6240\u4ee5\u53ef\u80fd\u4f1a\u6ce8\u518c\u4e0eMyBatis\u6d4b\u8bd5\u65e0\u5173\u7684Bean\u5230DI\u5bb9\u5668\u4e2d\u3002<br \/>\n\u5982\u679c\u4e0d\u60f3\u5c06\u4e0eMyBatis\u6d4b\u8bd5\u65e0\u5173\u7684Bean\u6ce8\u518c\u5230DI\u5bb9\u5668\u4e2d\uff0c\u8bf7\u5728\u6d4b\u8bd5\u7528\u4f8b\u7c7b\u76f8\u540c\u7684\u5305\u4e2d\u521b\u5efa\u4e00\u4e2a\u7a7a\u7684Spring Boot\u5e94\u7528\u7a0b\u5e8f\u7c7b\u3002\u901a\u8fc7\u8fd9\u6837\u505a\uff0c\u53ef\u4ee5\u7981\u7528\u4e0a\u7ea7\u5305\u4e2d\u7684Spring Boot\u5e94\u7528\u7a0b\u5e8f\u7c7b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.mybatisdemo.mapper<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MapperTestApplication<\/span> <span class=\"o\">{<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u67e5\u770b\u5b98\u65b9\u53c2\u8003\u6587\u6863\u4ee5\u53caSpring Boot\u63d0\u4f9b\u7684@DataJpaTest\u548c@JdbcTest\u7684\u6587\u6863\uff0c\u83b7\u53d6\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<p>\u8fd9\u6b21\u4ecb\u7ecd\u4e86\u5728\u4f7f\u7528Spring Boot\u8fd0\u884cMyBatis\u65f6\u975e\u5e38\u4fbf\u5229\u7684mybatis-spring-boot-starter\u3002\u5982\u679c\u4f7f\u7528MyBatis\u7684\u9ed8\u8ba4\u884c\u4e3a\u6ca1\u6709\u95ee\u9898\uff0c\u5c31\u4e0d\u9700\u8981\u8fdb\u884c\u4efb\u4f55\u7279\u522b\u7684\u914d\u7f6e\u3002\u6b64\u5916\uff0c\u4ece\u7248\u672c1.3\u5f00\u59cb\u52a0\u5165\u4e86\u652f\u6301\u6d4b\u8bd5\u7684\u65b0\u529f\u80fd(@MybatisTest)\uff0c\u53ef\u4ee5\u5728\u8fdb\u884cMapper\u548cDAO\u7684\u6d4b\u8bd5\u65f6\u9ad8\u6548\u5730\u8fdb\u884cBean\u5b9a\u4e49\uff08\u5728\u5404\u79cd\u610f\u4e49\u4e0a\uff09\u3002<\/p>\n<h1>\u53c2\u8003\u7f51\u7ad9<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/mybatis\/spring-boot-starter<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/www.mybatis.org\/spring-boot-starter\/mybatis-spring-boot-autoconfigure\/<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/www.mybatis.org\/spring-boot-starter\/mybatis-spring-boot-test-autoconfigure\/<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/www.mybatis.org\/mybatis-3\/ja\/<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/terasolunaorg.github.io\/guideline\/5.5.1.RELEASE\/ja\/ArchitectureInDetail\/DataAccessDetail\/DataAccessMyBatis3.html<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/docs.spring.io\/spring-boot\/docs\/2.1.6.RELEASE\/reference\/htmlsingle\/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">http:\/\/docs.spring.io\/spring-boot\/docs\/2.1.6.RELEASE\/reference\/htmlsingle\/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jdbc-test<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0b\u9762\u5c06\u4ecb\u7ecdmybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8be5\u9879\u76ee\u4e8e2015\u5e7411\u6708\u53d1\u5e03\u4e861. [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-39850","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5\" \/>\n<meta property=\"og:description\" content=\"\u4e0b\u9762\u5c06\u4ecb\u7ecdmybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8be5\u9879\u76ee\u4e8e2015\u5e7411\u6708\u53d1\u5e03\u4e861. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-19T02:46:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T06:28:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3cd737434c4406c85ddc\/25-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/\",\"name\":\"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-02-19T02:46:26+00:00\",\"dateModified\":\"2024-05-04T06:28:59+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5\/","og_locale":"zh_CN","og_type":"article","og_title":"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5","og_description":"\u4e0b\u9762\u5c06\u4ecb\u7ecdmybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8be5\u9879\u76ee\u4e8e2015\u5e7411\u6708\u53d1\u5e03\u4e861. [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-02-19T02:46:26+00:00","article_modified_time":"2024-05-04T06:28:59+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3cd737434c4406c85ddc\/25-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"13 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/","name":"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-02-19T02:46:26+00:00","dateModified":"2024-05-04T06:28:59+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Mybatis-spring-boot-starter\u7684\u4f7f\u7528\u65b9\u6cd5"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/mybatis-spring-boot-starter%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=39850"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39850\/revisions"}],"predecessor-version":[{"id":98875,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39850\/revisions\/98875"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=39850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=39850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=39850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}