{"id":338,"date":"2023-02-25T06:50:55","date_gmt":"2023-02-24T22:50:55","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=338"},"modified":"2023-04-30T14:49:39","modified_gmt":"2023-04-30T06:49:39","slug":"springboot-druid-mybatis-config-multiple-data-sources","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/25\/springboot-druid-mybatis-config-multiple-data-sources\/","title":{"rendered":"SpringBoot+Druid+MyBatis\u914d\u7f6e\u591a\u6570\u636e\u6e90"},"content":{"rendered":"<p>\u9879\u76ee\u53ef\u80fd\u4f1a\u9047\u5230\u9700\u8981\u5bf9\u591a\u4e2a\u6570\u636e\u5e93\u8fdb\u884c\u8bfb\u5199\u7684\u9700\u6c42\uff0c\u6b64\u65f6\u5c31\u9700\u8981\u914d\u7f6e\u591a\u4e2a\u6570\u636e\u6e90\u3002<\/p>\n<h2>\u4f9d\u8d56\u914d\u7f6e<\/h2>\n<p>pom.xml\u914d\u7f6e\u7684\u4f9d\u8d56\u5982\u4e0b\uff1a<\/p>\n<p><!-- more --><\/p>\n<pre><code class=\"language-xml\">&lt;dependencies&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.mybatis.spring.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-spring-boot-starter&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;mysql&lt;\/groupId&gt;\n        &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n        &lt;scope&gt;test&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- alibaba\u7684druid\u6570\u636e\u5e93\u8fde\u63a5\u6c60 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n        &lt;artifactId&gt;druid-spring-boot-starter&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/code><\/pre>\n<h2>\u9879\u76ee\u914d\u7f6e<\/h2>\n<p>application.yml\u914d\u7f6e\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-yml\">spring:\n  datasource:\n    #\u4f7f\u7528druid\u8fde\u63a5\u6c60\n    type: com.alibaba.druid.pool.DruidDataSource\n\n# \u81ea\u5b9a\u4e49\u7684\u4e3b\u6570\u636e\u6e90\u914d\u7f6e\u4fe1\u606f\nprimary:\n  datasource:\n    #druid\u76f8\u5173\u914d\u7f6e\n    druid:\n      #\u76d1\u63a7\u7edf\u8ba1\u62e6\u622a\u7684filters\n      filters: stat\n      driverClassName: com.mysql.jdbc.Driver\n      #\u914d\u7f6e\u57fa\u672c\u5c5e\u6027\n      url: jdbc:mysql:\/\/127.0.0.1:3306\/primary_database?useUnicode=true&amp;characterEncoding=UTF-8&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useSSL=false\n      username: root\n      password: password\n      #\u914d\u7f6e\u521d\u59cb\u5316\u5927\u5c0f\/\u6700\u5c0f\/\u6700\u5927\n      initialSize: 1\n      minIdle: 1\n      maxActive: 20\n      #\u83b7\u53d6\u8fde\u63a5\u7b49\u5f85\u8d85\u65f6\u65f6\u95f4\n      maxWait: 60000\n      #\u95f4\u9694\u591a\u4e45\u8fdb\u884c\u4e00\u6b21\u68c0\u6d4b\uff0c\u68c0\u6d4b\u9700\u8981\u5173\u95ed\u7684\u7a7a\u95f2\u8fde\u63a5\n      timeBetweenEvictionRunsMillis: 60000\n      #\u4e00\u4e2a\u8fde\u63a5\u5728\u6c60\u4e2d\u6700\u5c0f\u751f\u5b58\u7684\u65f6\u95f4\n      minEvictableIdleTimeMillis: 300000\n      validationQuery: SELECT &#039;x&#039;\n      testWhileIdle: true\n      testOnBorrow: false\n      testOnReturn: false\n      #\u6253\u5f00PSCache\uff0c\u5e76\u6307\u5b9a\u6bcf\u4e2a\u8fde\u63a5\u4e0aPSCache\u7684\u5927\u5c0f\u3002oracle\u8bbe\u4e3atrue\uff0cmysql\u8bbe\u4e3afalse\u3002\u5206\u5e93\u5206\u8868\u8f83\u591a\u63a8\u8350\u8bbe\u7f6e\u4e3afalse\n      poolPreparedStatements: false\n      maxPoolPreparedStatementPerConnectionSize: 20\n\n# \u81ea\u5b9a\u4e49\u7684\u4ece\u6570\u636e\u6e90\u914d\u7f6e\u4fe1\u606f\nslave:\n  datasource:\n    #druid\u76f8\u5173\u914d\u7f6e\n    druid:\n      #\u76d1\u63a7\u7edf\u8ba1\u62e6\u622a\u7684filters\n      filters: stat\n      driverClassName: com.mysql.jdbc.Driver\n      #\u914d\u7f6e\u57fa\u672c\u5c5e\u6027\n      url: jdbc:mysql:\/\/127.0.0.1:3306\/slave_database?useUnicode=true&amp;characterEncoding=UTF-8&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useSSL=false\n      username: root\n      password: password\n      #\u914d\u7f6e\u521d\u59cb\u5316\u5927\u5c0f\/\u6700\u5c0f\/\u6700\u5927\n      initialSize: 1\n      minIdle: 1\n      maxActive: 20\n      #\u83b7\u53d6\u8fde\u63a5\u7b49\u5f85\u8d85\u65f6\u65f6\u95f4\n      maxWait: 60000\n      #\u95f4\u9694\u591a\u4e45\u8fdb\u884c\u4e00\u6b21\u68c0\u6d4b\uff0c\u68c0\u6d4b\u9700\u8981\u5173\u95ed\u7684\u7a7a\u95f2\u8fde\u63a5\n      timeBetweenEvictionRunsMillis: 60000\n      #\u4e00\u4e2a\u8fde\u63a5\u5728\u6c60\u4e2d\u6700\u5c0f\u751f\u5b58\u7684\u65f6\u95f4\n      minEvictableIdleTimeMillis: 300000\n      validationQuery: SELECT &#039;x&#039;\n      testWhileIdle: true\n      testOnBorrow: false\n      testOnReturn: false\n      #\u6253\u5f00PSCache\uff0c\u5e76\u6307\u5b9a\u6bcf\u4e2a\u8fde\u63a5\u4e0aPSCache\u7684\u5927\u5c0f\u3002oracle\u8bbe\u4e3atrue\uff0cmysql\u8bbe\u4e3afalse\u3002\u5206\u5e93\u5206\u8868\u8f83\u591a\u63a8\u8350\u8bbe\u7f6e\u4e3afalse\n      poolPreparedStatements: false\n      maxPoolPreparedStatementPerConnectionSize: 20<\/code><\/pre>\n<p>\u7136\u540e\u5728\u9879\u76ee\u4e2d\u65b0\u5efa\u4e00\u4e2aconfig\u5305\uff0c\u5e76\u5728\u8be5\u5305\u4e0b\u521b\u5efa\u4e00\u4e2aPrimaryDataBaseConfig\u7c7b\uff0c\u4f5c\u4e3a\u6211\u4eec\u7684\u4e3b\u6570\u636e\u6e90\u914d\u7f6e\u7c7b\uff0c\u7528\u4e8e\u52a0\u8f7d\u81ea\u5b9a\u4e49\u7684\u4e3b\u6570\u636e\u6e90\u914d\u7f6e\u4fe1\u606f\uff0c\u4ee5\u53ca\u521b\u5efa\u6570\u636e\u6e90\u548c\u4f1a\u8bdd\u8fde\u63a5\u5de5\u5382\u7b49\u5b9e\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">import com.alibaba.druid.pool.DruidDataSource;\nimport lombok.Data;\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\nimport java.sql.SQLException;\n\n\/**\n * \u6570\u636e\u6e90\u914d\u7f6e\u7c7b\n *\/\n@Data\n@Configuration\n\/\/ \u524d\u7f00\u4e3aprimary.datasource.druid\u7684\u914d\u7f6e\u4fe1\u606f\n@ConfigurationProperties(prefix = &quot;primary.datasource.druid&quot;)\n@MapperScan(basePackages = PrimaryDataBaseConfig.PACKAGE, sqlSessionFactoryRef = &quot;primarySqlSessionFactory&quot;)\npublic class PrimaryDataBaseConfig {\n\n    \/**\n     * dao\u5c42\u7684\u5305\u8def\u5f84\n     *\/\n    static final String PACKAGE = &quot;cn.appblog.mall.dao.primary&quot;;\n\n    \/**\n     * mapper\u6587\u4ef6\u7684\u76f8\u5bf9\u8def\u5f84\n     *\/\n    private static final String MAPPER_LOCATION = &quot;classpath:mappers\/primary\/*.xml&quot;;\n\n    private String filters;\n    private String url;\n    private String username;\n    private String password;\n    private String driverClassName;\n    private int initialSize;\n    private int minIdle;\n    private int maxActive;\n    private long maxWait;\n    private long timeBetweenEvictionRunsMillis;\n    private long minEvictableIdleTimeMillis;\n    private String validationQuery;\n    private boolean testWhileIdle;\n    private boolean testOnBorrow;\n    private boolean testOnReturn;\n    private boolean poolPreparedStatements;\n    private int maxPoolPreparedStatementPerConnectionSize;\n\n    \/\/ \u4e3b\u6570\u636e\u6e90\u4f7f\u7528@Primary\u6ce8\u89e3\u8fdb\u884c\u6807\u8bc6\n    @Primary\n    @Bean(name = &quot;primaryDataSource&quot;)\n    public DataSource primaryDataSource() throws SQLException {\n        DruidDataSource druid = new DruidDataSource();\n        \/\/ \u76d1\u63a7\u7edf\u8ba1\u62e6\u622a\u7684filters\n        druid.setFilters(filters);\n\n        \/\/ \u914d\u7f6e\u57fa\u672c\u5c5e\u6027\n        druid.setDriverClassName(driverClassName);\n        druid.setUsername(username);\n        druid.setPassword(password);\n        druid.setUrl(url);\n\n        \/\/\u521d\u59cb\u5316\u65f6\u5efa\u7acb\u7269\u7406\u8fde\u63a5\u7684\u4e2a\u6570\n        druid.setInitialSize(initialSize);\n        \/\/\u6700\u5927\u8fde\u63a5\u6c60\u6570\u91cf\n        druid.setMaxActive(maxActive);\n        \/\/\u6700\u5c0f\u8fde\u63a5\u6c60\u6570\u91cf\n        druid.setMinIdle(minIdle);\n        \/\/\u83b7\u53d6\u8fde\u63a5\u65f6\u6700\u5927\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u6beb\u79d2\u3002\n        druid.setMaxWait(maxWait);\n        \/\/\u95f4\u9694\u591a\u4e45\u8fdb\u884c\u4e00\u6b21\u68c0\u6d4b\uff0c\u68c0\u6d4b\u9700\u8981\u5173\u95ed\u7684\u7a7a\u95f2\u8fde\u63a5\n        druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);\n        \/\/\u4e00\u4e2a\u8fde\u63a5\u5728\u6c60\u4e2d\u6700\u5c0f\u751f\u5b58\u7684\u65f6\u95f4\n        druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);\n        \/\/\u7528\u6765\u68c0\u6d4b\u8fde\u63a5\u662f\u5426\u6709\u6548\u7684sql\n        druid.setValidationQuery(validationQuery);\n        \/\/\u5efa\u8bae\u914d\u7f6e\u4e3atrue\uff0c\u4e0d\u5f71\u54cd\u6027\u80fd\uff0c\u5e76\u4e14\u4fdd\u8bc1\u5b89\u5168\u6027\u3002\n        druid.setTestWhileIdle(testWhileIdle);\n        \/\/\u7533\u8bf7\u8fde\u63a5\u65f6\u6267\u884cvalidationQuery\u68c0\u6d4b\u8fde\u63a5\u662f\u5426\u6709\u6548\n        druid.setTestOnBorrow(testOnBorrow);\n        druid.setTestOnReturn(testOnReturn);\n        \/\/\u662f\u5426\u7f13\u5b58preparedStatement\uff0c\u4e5f\u5c31\u662fPSCache\uff0coracle\u8bbe\u4e3atrue\uff0cmysql\u8bbe\u4e3afalse\u3002\u5206\u5e93\u5206\u8868\u8f83\u591a\u63a8\u8350\u8bbe\u7f6e\u4e3afalse\n        druid.setPoolPreparedStatements(poolPreparedStatements);\n        \/\/ \u6253\u5f00PSCache\u65f6\uff0c\u6307\u5b9a\u6bcf\u4e2a\u8fde\u63a5\u4e0aPSCache\u7684\u5927\u5c0f\n        druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);\n\n        return druid;\n    }\n\n    \/\/ \u521b\u5efa\u8be5\u6570\u636e\u6e90\u7684\u4e8b\u52a1\u7ba1\u7406\n    @Primary\n    @Bean(name = &quot;primaryTransactionManager&quot;)\n    public DataSourceTransactionManager primaryTransactionManager() throws SQLException {\n        return new DataSourceTransactionManager(primaryDataSource());\n    }\n\n    \/\/ \u521b\u5efaMybatis\u7684\u8fde\u63a5\u4f1a\u8bdd\u5de5\u5382\u5b9e\u4f8b\n    @Primary\n    @Bean(name = &quot;primarySqlSessionFactory&quot;)\n    public SqlSessionFactory primarySqlSessionFactory(@Qualifier(&quot;primaryDataSource&quot;) DataSource primaryDataSource) throws Exception {\n        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();\n        sessionFactory.setDataSource(primaryDataSource);  \/\/ \u8bbe\u7f6e\u6570\u636e\u6e90bean\n        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()\n                .getResources(PrimaryDataBaseConfig.MAPPER_LOCATION));  \/\/ \u8bbe\u7f6emapper\u6587\u4ef6\u8def\u5f84\n\n        return sessionFactory.getObject();\n    }\n}<\/code><\/pre>\n<p>\u540c\u6837\u7684\uff0c\u8fd8\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u4ece\u6570\u636e\u6e90\u914d\u7f6e\u7c7b\uff0c\u4e0e\u4e3b\u6570\u636e\u6e90\u914d\u7f6e\u7c7b\u4e0d\u540c\u7684\u662f\uff0c\u4ece\u6570\u636e\u6e90\u914d\u7f6e\u7c7b\u4e0d\u80fd\u4f7f\u7528<code>@Primary<\/code>\u6ce8\u89e3\uff0c\u5373\u8868\u793a\u5b83\u662f\u4e00\u4e2a\u4ece\u6570\u636e\u6e90\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">import com.alibaba.druid.pool.DruidDataSource;\nimport lombok.Data;\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\nimport java.sql.SQLException;\n\n\/**\n * \u540e\u53f0\u6570\u636e\u6e90\u914d\u7f6e\u7c7b\n *\/\n@Data\n@Configuration\n@ConfigurationProperties(prefix = &quot;slave.datasource.druid&quot;)\n@MapperScan(basePackages = SlaveDataBaseConfig.PACKAGE, sqlSessionFactoryRef = &quot;slaveSqlSessionFactory&quot;)\npublic class SlaveDataBaseConfig {\n\n    \/**\n     * dao\u5c42\u7684\u5305\u8def\u5f84\n     *\/\n    static final String PACKAGE = &quot;cn.appblog.mall.dao.slave&quot;;\n\n    \/**\n     * mapper\u6587\u4ef6\u7684\u76f8\u5bf9\u8def\u5f84\n     *\/\n    private static final String MAPPER_LOCATION = &quot;classpath:mappers\/slave\/*.xml&quot;;\n\n    private String filters;\n    private String url;\n    private String username;\n    private String password;\n    private String driverClassName;\n    private int initialSize;\n    private int minIdle;\n    private int maxActive;\n    private long maxWait;\n    private long timeBetweenEvictionRunsMillis;\n    private long minEvictableIdleTimeMillis;\n    private String validationQuery;\n    private boolean testWhileIdle;\n    private boolean testOnBorrow;\n    private boolean testOnReturn;\n    private boolean poolPreparedStatements;\n    private int maxPoolPreparedStatementPerConnectionSize;\n\n    @Bean(name = &quot;slaveDataSource&quot;)\n    public DataSource slaveDataSource() throws SQLException {\n        DruidDataSource druid = new DruidDataSource();\n        \/\/ \u76d1\u63a7\u7edf\u8ba1\u62e6\u622a\u7684filters\n        druid.setFilters(filters);\n\n        \/\/ \u914d\u7f6e\u57fa\u672c\u5c5e\u6027\n        druid.setDriverClassName(driverClassName);\n        druid.setUsername(username);\n        druid.setPassword(password);\n        druid.setUrl(url);\n\n        \/\/\u521d\u59cb\u5316\u65f6\u5efa\u7acb\u7269\u7406\u8fde\u63a5\u7684\u4e2a\u6570\n        druid.setInitialSize(initialSize);\n        \/\/\u6700\u5927\u8fde\u63a5\u6c60\u6570\u91cf\n        druid.setMaxActive(maxActive);\n        \/\/\u6700\u5c0f\u8fde\u63a5\u6c60\u6570\u91cf\n        druid.setMinIdle(minIdle);\n        \/\/\u83b7\u53d6\u8fde\u63a5\u65f6\u6700\u5927\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u6beb\u79d2\u3002\n        druid.setMaxWait(maxWait);\n        \/\/\u95f4\u9694\u591a\u4e45\u8fdb\u884c\u4e00\u6b21\u68c0\u6d4b\uff0c\u68c0\u6d4b\u9700\u8981\u5173\u95ed\u7684\u7a7a\u95f2\u8fde\u63a5\n        druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);\n        \/\/\u4e00\u4e2a\u8fde\u63a5\u5728\u6c60\u4e2d\u6700\u5c0f\u751f\u5b58\u7684\u65f6\u95f4\n        druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);\n        \/\/\u7528\u6765\u68c0\u6d4b\u8fde\u63a5\u662f\u5426\u6709\u6548\u7684sql\n        druid.setValidationQuery(validationQuery);\n        \/\/\u5efa\u8bae\u914d\u7f6e\u4e3atrue\uff0c\u4e0d\u5f71\u54cd\u6027\u80fd\uff0c\u5e76\u4e14\u4fdd\u8bc1\u5b89\u5168\u6027\u3002\n        druid.setTestWhileIdle(testWhileIdle);\n        \/\/\u7533\u8bf7\u8fde\u63a5\u65f6\u6267\u884cvalidationQuery\u68c0\u6d4b\u8fde\u63a5\u662f\u5426\u6709\u6548\n        druid.setTestOnBorrow(testOnBorrow);\n        druid.setTestOnReturn(testOnReturn);\n        \/\/\u662f\u5426\u7f13\u5b58preparedStatement\uff0c\u4e5f\u5c31\u662fPSCache\uff0coracle\u8bbe\u4e3atrue\uff0cmysql\u8bbe\u4e3afalse\u3002\u5206\u5e93\u5206\u8868\u8f83\u591a\u63a8\u8350\u8bbe\u7f6e\u4e3afalse\n        druid.setPoolPreparedStatements(poolPreparedStatements);\n        \/\/ \u6253\u5f00PSCache\u65f6\uff0c\u6307\u5b9a\u6bcf\u4e2a\u8fde\u63a5\u4e0aPSCache\u7684\u5927\u5c0f\n        druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);\n\n        return druid;\n    }\n\n    @Bean(name = &quot;backTransactionManager&quot;)\n    public DataSourceTransactionManager backTransactionManager() throws SQLException {\n        return new DataSourceTransactionManager(slaveDataSource());\n    }\n\n    @Bean(name = &quot;slaveSqlSessionFactory&quot;)\n    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier(&quot;slaveDataSource&quot;) DataSource slaveDataSource) throws Exception {\n        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();\n        sessionFactory.setDataSource(slaveDataSource);\n        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()\n                .getResources(BackDataBaseConfig.MAPPER_LOCATION));\n\n        return sessionFactory.getObject();\n    }\n}<\/code><\/pre>\n<p>\u5b8c\u6210\u4ee5\u4e0a\u914d\u7f6e\u540e\uff0c\u8be5\u5de5\u7a0b\u5373\u5177\u6709\u8fde\u63a5\u4e24\u4e2a\u6570\u636e\u5e93\u7684\u80fd\u529b\uff0c\u5982\u679c\u8981\u914d\u7f6e\u4e24\u4e2a\u4ee5\u4e0a\u7684\u6570\u636e\u5e93\u4e5f\u662f\u4e00\u6837\u7684\uff0c\u914d\u7f6e\u591a\u4e2a\u4ece\u6570\u636e\u6e90\u5373\u53ef\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9879\u76ee\u53ef\u80fd\u4f1a\u9047\u5230\u9700\u8981\u5bf9\u591a\u4e2a\u6570\u636e\u5e93\u8fdb\u884c\u8bfb\u5199\u7684\u9700\u6c42\uff0c\u6b64\u65f6\u5c31\u9700\u8981\u914d\u7f6e\u591a\u4e2a\u6570\u636e\u6e90\u3002 \u4f9d\u8d56\u914d\u7f6e pom.xml\u914d\u7f6e\u7684\u4f9d\u8d56\u5982 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[110,111],"class_list":["post-338","post","type-post","status-publish","format-standard","hentry","category-spring-boot","tag-druid","tag-mybatis"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=338"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/338\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}