微服务常用组件封装项目过程详细介绍总述(五)---基于springboot的自定义DB starter组件开发

微服务常用组件封装项目过程详细介绍总述(五)---基于springboot的自定义DB starter组件开发,第1张

微服务常用组件封装项目过程详细介绍总述(五)---基于springboot的自定义DB starter组件开发 一:综述:

        本节将针对上节总增加的immortal-maqiao-core-mybatis 模块进行封装,最终封装成starter组件。

二:详细过程:

由于网上对springboot原理已经有很详细的源码级别的解析,这里不进行描述,只描述经过哪些步骤可以实现对immortal-maqiao-core-mybatis的starter封装。

1>创建模块immortal-maqiao-core-starter-db,创建完成后如下图:

 2>对应的POM文件,其中版本在之前的文章中创建的immortal-maqiao-depencies模块管理,模块对应pom文件如下:

immortal-maqiao-core-starter-db  POM文件:



    
        immortal-maqiao-core
        immortal-maqiao
        1.0-SNAPSHOT
    
    4.0.0

    immortal-maqiao-core-starter-db
    
        
            immortal.maqiao
            immortal-maqiao-core-common
        
        
        
            com.baomidou
            mybatis-plus-boot-starter
        
        
            com.baomidou
            mybatis-plus-extension
        
        
        
            com.alibaba
            druid-spring-boot-starter
        
        
        
            mysql
            mysql-connector-java
        
        
            immortal-maqiao
            immortal-maqiao-core-mybatis
        
        
            jakarta.servlet
            jakarta.servlet-api
        
    

immortal-maqiao-depencies中需要增加的自身包:

 至此模块项目创建集成完成。

3>具体编码:

   在immortal-maqiao-core-mybatis 这个模块中只是对mybatis进行了一些封装,但是并没有配置数据库连接,连接池等内容,因此这些配置要在本模块中实现,数据库选用mysql , 连接池中间件选用druid。

增加一个DruidConfiguration配置类,配置druid,如下:

package immortal.maqiao.core.db;


import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import immortal.maqiao.factory.YamlPropertySourceFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(factory = YamlPropertySourceFactory.class, value = "classpath:immortal-maqiao-druid.yml")
public class DruidConfiguration {

    @Bean
    public ServletRegistrationBean DruidStatViewServle() {

        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        //添加初始化参数:initParams
        //白名单:
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
        //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter("deny", "192.168.0.114");
        //登录查看信息的账号密码.
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "mqimmortal");
        //是否能够重置数据.
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean druidStatFilter() {

        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加过滤规则.
        filterRegistrationBean.addUrlPatterns("/*");
        //添加不需要忽略的格式信息.
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

其中@PropertySource(factory = YamlPropertySourceFactory.class, value = "classpath:mq-immortal-druid.yml") 注解YamlPropertySourceFactory类为immortal-maqiao-core-common中提供的yaml文件解析工具,value为druid配置文件的路径,位于该模块src/main/resources目录下,内容如下:

spring:
  datasource:
    druid:
      enable: true
      # druid begin
      username: ${mq.immortal.db.username}
      password: ${mq.immortal.db.password}
      driver-class-name: ${spring.datasource.driver-class-name}
      url: ${mq.immortal.db.url}
      db-type: mysql
      initialSize: 10
      minIdle: 10
      maxActive: 500
      max-wait: 60000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      validation-query: SELECT 'x'
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      time-between-eviction-runs-millis: 60000  #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      min-evictable-idle-time-millis: 300000    #配置一个连接在池中最小生存的时间,单位是毫秒
      filters: stat,wall
      filter:
        wall:
          enabled: true
          config:
            commentAllow: true
            multiStatementAllow: true
            nonebaseStatementAllow: true
      # druid end

      # StatViewServlet配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
        session-stat-max-count: 1000
        profile-enable: true
        session-stat-enable: false
      # 配置DruidStatViewServlet
      stat-view-servlet:
        # 新版需要配置这个属性才能访问监控页面
        enabled: true
        url-pattern: /druid/*
        #  禁用HTML页面上的“Reset All”功能
        reset-enable: true
        # 登录名
        login-username: admin
        # 登录密码
        login-password: mqImmortal
        # IP白名单(没有配置或者为空,则允许所有访问)
        allow: 127.0.0.1
        # IP黑名单 (存在共同时,deny优先于allow)
        deny: 192.168.0.1

配置文件中

${mq.immortal.db.username}  
${mq.immortal.db.password}
${spring.datasource.driver-class-name}
${mq.immortal.db.url}

为数据库连接信息,可根据格式在配置中心nacos中进行配置即可,这样就完成了数据库连接的配置。但是目前启动时并不会自动加载配置文件,需要进行第二步配置starter.

在该模块src/main/resources路径下新建meta-INF文件夹,同时在文件夹下创建spring.factories文件,文件内容为:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
  immortal.maqiao.core.db.config.MybatisPlusConfiguration

这样在引入该starter模块后就会加载druid配置类,同时根据自定义数据库配置信息创建数据库连接信息,至此完成了对数据库连接池的配置集成。

增加一个MybatisPlusConfiguration配置类,配置MybatisPlus的内容,包括immortal-maqiao-core-mybatis模块中的自定义方法sql注入,sql日志是否启用,自动填充时间戳等。

增加一个MybatisPlusConfiguration配置类,对mp进行配置:

package immortal.maqiao.core.db;

import immortal.maqiao.core.mybatis.props.ImmortalMyBatisProps;
import immortal.maqiao.factory.YamlPropertySourceFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableTransactionManagement
@EnableConfigurationProperties(ImmortalMyBatisProps.class)
@PropertySource(factory = YamlPropertySourceFactory.class, value = "classpath:immortal-maqiao-db.yml")
@MapperScan("immortal.maqiao.**.mapper.**")
public class MybatisPlusConfiguration {
}

其中MqImmortalBybatisProps为上一节immortal-maqiao-core-mybatis模块中的类,该类中包含

@ConfigurationProperties("mq.immortal.mybatis") 可根据该配置格式在配置中心配置相关内容。

immortal-maqiao-db.yml为mp的配置文件,内容如下:

#mybatis-plus配置
mybatis-plus:
  mapper-locations: classpath*:immortal/maqiao/prod/mapper/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: immortal.maqiao.prod.**.entity
  global-config:
    # 关闭MP3.0自带的banner
    banner: false
    db-config:
      #主键类型  0:"数据库ID自增", 1:"不 *** 作", 2:"用户输入ID",3:"数字型snowflake", 4:"全局唯一ID UUID", 5:"字符串型snowflake";
      id-type: 0
      #字段策略
      insert-strategy: not_null
      update-strategy: not_null
      select-strategy: not_empty
      #驼峰下划线转换
      table-underline: true
      # 逻辑删除配置
      # 逻辑删除全局值(1表示已删除,这也是Mybatis Plus的默认配置)
      logic-delete-value: 1
      # 逻辑未删除全局值(0表示未删除,这也是Mybatis Plus的默认配置)
      logic-not-delete-value: 0
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false

由于在immortal-maqiao-core-mybatis模块中增加了自定义的日志输出,需要关闭mp原有的日志输出,同时注入新的日志输出,需要对MybatisPlusConfiguration增加如下内容:

  //sql注入
    @Bean
    public ISqlInjector sqlInjector() {
        return new MqImmortalSqlInjector();
    }

    //sql日志
    @Bean
    @ConditionalOnProperty(value = "mybatis-plus.sql-log.enable", matchIfMissing = true)
    public SqlLogInterceptor sqlLogInterceptor() {
        return new SqlLogInterceptor();
    }

其中sql日志需要根据配置确定是否开启。

  @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            configuration.setDefaultEnumTypeHandler(EnumTypeHandler.class);
            // 关闭 mybatis 默认的日志
            configuration.setLogPrefix("log.mybatis");
        };
    }

关闭原有默认日志。

自动填充时间戳:

    @Bean
    @ConditionalOnMissingBean(MqImmortalObjectHandler.class)
    public MqImmortalObjectHandler mqImmortalObjectHandler() {
        return new MqImmortalObjectHandler();
    }

增加MP 乐观锁和分页插件同时限制单页最多2000条

​
  @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件
        // DbType:数据库类型(根据类型获取应使用的分页方言)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 分页插件
        return interceptor;
    }

​

metaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。

通过该接口实现自动时间戳:

@Component
public class ImmortalObjectHandler implements metaObjectHandler {

    @Override
    public void insertFill(metaObject metaObject) {
        this.strictInsertFill(metaObject,"createTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(metaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}
MybatisPlusConfiguration完整内容如下:
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableTransactionManagement
@EnableConfigurationProperties(ImmortalMyBatisProps.class)
@PropertySource(factory = YamlPropertySourceFactory.class, value = "classpath:immortal-maqiao-db.yml")
@MapperScan("immortal.maqiao.**.mapper.**")
public class MybatisPlusConfiguration {

    //单页分页条数限制为2000条
    private static final Long MAX_LIMIT = 2000L;
    //sql注入
    @Bean
    public ISqlInjector sqlInjector() {
        return new ImmortalMqSqlInjector();
    }

    //sql日志
    @Bean
    @ConditionalOnProperty(value = "mybatis-plus.sql-log.enable", matchIfMissing = true)
    public SqlLogInterceptor sqlLogInterceptor() {
        return new SqlLogInterceptor();
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            configuration.setDefaultEnumTypeHandler(EnumTypeHandler.class);
            // 关闭 mybatis 默认的日志
            configuration.setLogPrefix("log.mybatis");
        };
    }

    //注册乐观锁和分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(MAX_LIMIT);
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 分页插件
        return interceptor;
    }

    @Bean
    @ConditionalOnMissingBean(ImmortalObjectHandler.class)
    public ImmortalObjectHandler immortalObjectHandler() {
        return new ImmortalObjectHandler();
    }
}

最后吧MybatisPlusConfiguration配置到spring.factories中即可。

spring.factories完整内容为:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
  immortal.maqiao.core.db.config.MybatisPlusConfiguration,
  immortal.maqiao.core.db.config.DruidConfiguration

至此该模块集成完成,同时可以在改模块中增加 baseEntity baseSearch PageUtil 等数据库业务 *** 作类方便使用。

4>测试

        新建一个独立的 springboot 工程 引入该starter 对进行测试(后期所有的starter都可以用该项目进行测试),如下:

        

application.yml

 

 实体类:

@Data
@TableName("test_table")
@EqualsAndHashCode(callSuper = true)
public class Test extends baseEntity {

    private static final long serialVersionUID = 4774426299064291274L;

    private String name;
}

mapper:

package immortal.maqiao.mapper;

import com.baomidou.mybatisplus.core.mapper.baseMapper;
import immortal.maqiao.entity.Test;

public interface TestMapper extends baseMapper {
}

xml




    
        
        
        
        
        
        
    
    
                    id, create_by, update_by, create_time, update_time
    

service:

package immortal.maqiao.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import immortal.maqiao.entity.Test;
import immortal.maqiao.mapper.TestMapper;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService extends ServiceImpl {

    public List  findAll(){
        return this.baseMapper.selectList(null);
    }
}

test:

package dbmodule;

import immortal.Application;
import immortal.maqiao.service.TestService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest(classes={Application.class})
public class DBTest {

    @Autowired
    private TestService testService;

    @Test
    public void selectTest(){
        testService.findAll();
        immortal.maqiao.entity.Test bo = new immortal.maqiao.entity.Test();
        bo.setName("11");
        bo.setCreateBy("1");
        bo.setUpdateBy("11");
        testService.insertInt(bo);
        testService.deleteById(bo);
    }
}

执行TEST后会看到配置打印的日志如下:

至此DB模块完成。 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5672519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存