登录
登录 注册新账号
注册
已有账号登录
前端工程师2022版-完结无密
王之 阅读 217 次
6月11日发布

下载网盘链接:前端工程师2022版-完结无密

大道至简,一个注解完成数据库配置
今天来试试运用一个注解完成数据库配置.最终效果:

开端
SpringBoot这个框架还是挺凶猛的,或许有些人以为SpringBoot不算一个框架,它只是Spring的加强工具.
当然Spring关于Java而言有着不可动摇的位置.
就像我之前说的:

天不生Spring,Java万古如长夜.

可是SpringBoot的重要性也不能视而不见.
今天就基于SpringBoot来完成运用一个注解来完成数据库配置.
EnableXXX
在SpringBoot中,能够自定义这样一个注解EnableXXX,就是启用某种功用.
在EnableXXX这个注解上运用Import这个注解,就能够把配置类,或者什么其他需求Spring管理的东西,注入到Spring容器.
就像下面这样,在启动类上运用这个注解, MybatisExtraConfig.class这个类就会注入到Spring容器中.相当于这个类就由Spring帮你管理了,你能够在这个类里运用Autowired,或者获取容器等,而且MybatisExtraConfig这个类上不需求运用Component等注解.
Target({ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
Documented
Import(MybatisExtraConfig.class)
public interface EnableMpExtra {
}
复制代码
其实不运用EnableXXX也能够.在resources目录下新建一个文件夹META-INF,然后再新建一个文件spring.factories,然后在spring.factories中设置org.springframework.boot.autoconfigure.EnableAutoConfiguration=等于你的配置类.这样不运用注解,在包被引入的时分,就会自动加载配置类.
动态选择数据库 ImportSelector
我们也能够在EnableXXX注解里加一些值,在启动类上运用的时分,设置这些值,最终我们取到这些值.这些值就是衔接数据库的各种参数,
要获取这些值,就少不了ImportSelector.
最后注解是这样的
Target({ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
Documented
Import(DBSelector.class)
public interface EnableDbStarter {

DbType type() default DbType.MySQL;

String url() default "localhost";

String port() default "3306";

String dbName();

String username() default "root";

String password();

String basePackage();

}
复制代码
DBSelector
public class DBSelector implements ImportSelector {

public static String url;
public static String port;
public static String dbName;
public static String username;
public static String password;
public static String basePackage;

Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    AnnotationAttributes attributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(EnableDbStarter.class.getName()));
    DbType type = attributes.getEnum("type");
    url = attributes.getString("url");
    port = attributes.getString("port");
    dbName = attributes.getString("dbName");
    username = attributes.getString("username");
    password = attributes.getString("password");
    basePackage = attributes.getString("basePackage");

    switch (type) {
        case Oracle:
            return new String[]{OracleConfig.class.getName()};
        case MariaDB:
            return new String[]{MariaDBConfig.class.getName()};
        case SqlServer:
            return new String[]{SqlServerConfig.class.getName()};
        case PostgreSQL:
            return new String[]{PostgreSQLConfig.class.getName()};
        case MySQL:
        default:
            return new String[]{MySqlConfig.class.getName()};
    }
}

}
复制代码
这个能够依据枚举值,来选择对应的数据库配置.由于其他数据库暂时不需求,就只写了一个MySQL的.
枚举类
public enum DbType {
MySQL,
Oracle,
PostgreSQL,
SqlServer,
MariaDB
}
复制代码
MySql配置类
这个类上面是没有Configuration这个注解的,可是由于我们在DBSelector中return了这个类,所以这个类也能够被Spring管理的.能够看到这个类中运用了Bean这个注解,是能够正常运用的.
public class MySqlConfig {

Bean("dataSource")
public DataSource dataSource() {
    try {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://" + DBSelector.url + ":" + DBSelector.port + "/" + DBSelector.dbName + "?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
        dataSource.setUsername(DBSelector.username);
        dataSource.setPassword(DBSelector.password);

        dataSource.setInitialSize(1);
        dataSource.setMaxActive(20);
        dataSource.setMinIdle(1);
        dataSource.setMaxWait(60_000);
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
        dataSource.setTimeBetweenEvictionRunsMillis(60_000);
        dataSource.setMinEvictableIdleTimeMillis(300_000);
        dataSource.setValidationQuery("SELECT 1");
        return dataSource;
    } catch (Throwable throwable) {
        throw new RuntimeException();
    }
}

Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(Qualifier("dataSource") DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
    factoryBean.setDataSource(dataSource);
    factoryBean.setVfs(SpringBootVFS.class);
    factoryBean.setTypeAliasesPackage(DBSelector.basePackage);

    Resource[] mapperResources = new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml");
    factoryBean.setMapperLocations(mapperResources);
    MybatisConfiguration configuration = new MybatisConfiguration();
    configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
    configuration.setJdbcTypeForNull(JdbcType.NULL);
    configuration.setMapUnderscoreToCamelCase(true);
    configuration.addInterceptor(new SqlExplainInterceptor());
    //分页
    configuration.addInterceptor(new PaginationInterceptor());
    configuration.setUseGeneratedKeys(true);
    factoryBean.setConfiguration(configuration);
    return factoryBean.getObject();
}

Bean(name = "sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
}

Bean(name = "transactionManager")
public PlatformTransactionManager platformTransactionManager(Qualifier("dataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

Bean(name = "transactionTemplate")
public TransactionTemplate transactionTemplate(Qualifier("transactionManager") PlatformTransactionManager transactionManager) {
    return new TransactionTemplate(transactionManager);
}

}
复制代码
其他数据库的配置类就是一个空类.就像下面这样,不细说了.
public class OracleConfig {
}
复制代码
运用办法
第一种
简单点就是,还是在这个项目下,创立Controller,Service,Mapper,Domain,然后新建启动类,然后在启动类上运用EnableDbStarter这个注解.就是在当前项目中测试.不引荐这种办法,由于看不出来效果.
第二种
能够把这个项目打成Jar包,在其他项目引入.效果比拟直观一点,当然假如有maven私服,能够把这个项目发到私服,然后再其他项目运用.
我就是发到了私服,然后在其他项目中援用.
引入依赖,能够看到依赖也少了很多,不用再引入mysql-connector和druid的.

在启动类上运用,在注解上设置数据库相关的信息,由于注解有些值有默许值,就能够少写一点啦.
basePackage是给Mybatis用来扫描别名的.

整个项目构造如下,没有其他配置.

启动看一下

启动胜利.
恳求一下

数据库
.
到这里,运用一个注解就完成了数据库的配置.
感兴味的小同伴能够试试其他的,比方Swagger配置,Redis配置,Dubbo配置等等,最终简化为一个注解就能够完成,最后肯定很有成就感.