Bläddra i källkod

扩展data-mybatis-plus,增加schema-validate配置,对应启动时的schema校验功能

Signed-off-by: luoshi <luoshi@qmth.com.cn>
luoshi 2 år sedan
förälder
incheckning
7d2586245d

+ 10 - 0
data-mybatis-plus/src/main/java/com/qmth/boot/mybatis/config/MybatisProperties.java

@@ -15,6 +15,8 @@ public class MybatisProperties {
 
     private boolean blockAttack = true;
 
+    private boolean schemaValidate = true;
+
     @NotNull
     private String logLevel = LoggerConstant.DEFAULT_LEVEL;
 
@@ -33,4 +35,12 @@ public class MybatisProperties {
     public void setLogLevel(String logLevel) {
         this.logLevel = logLevel;
     }
+
+    public boolean isSchemaValidate() {
+        return schemaValidate;
+    }
+
+    public void setSchemaValidate(boolean schemaValidate) {
+        this.schemaValidate = schemaValidate;
+    }
 }

+ 41 - 16
data-mybatis-plus/src/main/java/com/qmth/boot/mybatis/service/DatabaseInitializeService.java

@@ -1,5 +1,8 @@
 package com.qmth.boot.mybatis.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.boot.mybatis.config.MybatisProperties;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,30 +23,52 @@ public class DatabaseInitializeService implements ApplicationListener<ContextRef
 
     private JdbcTemplate jdbcTemplate;
 
-    public DatabaseInitializeService(JdbcTemplate jdbcTemplate) {
+    private MybatisProperties mybatisProperties;
+
+    public DatabaseInitializeService(JdbcTemplate jdbcTemplate, MybatisProperties mybatisProperties) {
         this.jdbcTemplate = jdbcTemplate;
+        this.mybatisProperties = mybatisProperties;
     }
 
     @Override
     public synchronized void onApplicationEvent(ContextRefreshedEvent event) {
         if (event.getApplicationContext().getParent() == null) {
-            Map<String, SqlProvider> beans = event.getApplicationContext().getBeansOfType(SqlProvider.class);
-            for (SqlProvider provider : beans.values()) {
-                String beanName = AopUtils.getTargetClass(provider).getName();
-                String content = StringUtils.trimToNull(provider.get());
-                if (content == null) {
-                    throw new RuntimeException("Blank content from SqlProvider: " + beanName);
-                }
-                String[] lines = StringUtils.split(content, SQL_SPLITE);
-                int count = 0;
-                for (String sql : lines) {
-                    if (StringUtils.isNotBlank(sql)) {
-                        jdbcTemplate.execute(sql);
-                        count++;
-                    }
+            //获取容器中的SqlProvider执行初始化sql
+            initBySql(event);
+            //若开启schema校验,则读取所有BaseMapper分别尝试select一条记录
+            if (mybatisProperties.isSchemaValidate()) {
+                schemaValidate(event);
+            }
+        }
+    }
+
+    private void initBySql(ContextRefreshedEvent event) {
+        Map<String, SqlProvider> beans = event.getApplicationContext().getBeansOfType(SqlProvider.class);
+        for (SqlProvider provider : beans.values()) {
+            String beanName = AopUtils.getTargetClass(provider).getName();
+            String content = StringUtils.trimToNull(provider.get());
+            if (content == null) {
+                throw new RuntimeException("Blank content from SqlProvider: " + beanName);
+            }
+            String[] lines = StringUtils.split(content, SQL_SPLITE);
+            int count = 0;
+            for (String sql : lines) {
+                if (StringUtils.isNotBlank(sql)) {
+                    jdbcTemplate.execute(sql);
+                    count++;
                 }
-                log.info("Database initialize from SqlProvider: {}, execute count: {}", beanName, count);
             }
+            log.info("Database initialize from SqlProvider: {}, execute count: {}", beanName, count);
+        }
+    }
+
+    private void schemaValidate(ContextRefreshedEvent event) {
+        Map<String, BaseMapper> beans = event.getApplicationContext().getBeansOfType(BaseMapper.class);
+        for (BaseMapper mapper : beans.values()) {
+            QueryWrapper wrapper = new QueryWrapper();
+            wrapper.last("limit 1");
+            mapper.selectOne(wrapper);
+            log.info("MybatisPlus schema validate: {}", mapper.getClass().getGenericInterfaces()[0].getTypeName());
         }
     }
 }