数据访问

SQL

1、自动配置数据库连接池

(1)带 data 的启动器,都与数据访问相关

(2)导入 JDBC 场景

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

(3)导入 MySQL 驱动,Spring Boot 有版本仲裁

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2、自动配置类

(1)DataSourceAutoConfiguration:数据库连接池的自动配置类

(2)修改数据库连接池相关的配置:spring.datasource

@EnableConfigurationProperties(DataSourceProperties.class)
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean

(3)容器中没有 DataSource 时,自动配置数据库连接池

@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
         DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
         DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration {

}

(4)若导入 JDBC 启动器,配置的数据库连接池为:HikariDataSource

(5)根据 spring.datasource.type,动态判断,并创建数据库连接池

(6)DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置类

(7)JdbcTemplateAutoConfiguration:JdbcTemplate 的自动配置类,可对数据库进行 CRUD

(8)修改 JdbcTemplate 相关配置:spring.jdbc

@EnableConfigurationProperties(JdbcProperties.class)
@ConfigurationProperties(prefix = "spring.jdbc")

 

使用 Druid 数据库连接池

1、StatViewServlet

(1)用于展示 Druid 的统计信息

(2)提供监控信息展示的 html 页面

(3)提供监控信息的 JSON API

2、StatFilter

(1)用于统计监控信息

(2)如:SQL 监控、URI 监控

3、WebStatFilter:用于采集 web-jdbc 关联监控的数据

4、WallFilter:基于 SQL 语义分析,实现防御 SQL 注入攻击

5、自定义方式

(1)引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.11</version>
</dependency>

(2)数据库连接池配置类

@Configuration
public class MyDataSourceConfig {

    @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        //加入监控、防火墙功能
        druidDataSource.setFilters("stat, wall");
        //省略其他配置
        return druidDataSource;
    }

    //配置Druid监控页功能
    @Bean
    public ServletRegistrationBean statViewServlet(){
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        //配置监控页面访问的用户名、密码
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","123456");
        return registrationBean;
    }

    //配置WebStatFilter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

6、启动器方式

(1)引入第三方依赖 Druid 启动器

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.11</version>
</dependency>

(2)自动配置类:DruidDataSourceAutoConfigure

@Configuration
//所需要的类
@ConditionalOnClass(DruidDataSource.class)
//在DataSourceAutoConfiguration之前配置
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
//拓展配置项:spring.datasource.druid;原生配置项:spring.datasource
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class,//监控SpringBean,配置项:spring.datasource.druid.aop-patterns
    DruidStatViewServletConfiguration.class,//监控页的配置:spring.datasource.druid.stat-view-servlet;默认开启
    DruidWebStatFilterConfiguration.class,//Web监控配置;spring.datasource.druid.web-stat-filter;默认开启
    DruidFilterConfiguration.class})//Druid所有Filter配置

public class DruidDataSourceAutoConfigure {
    private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);

    @Bean(initMethod = "init")
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        LOGGER.info("Init DruidDataSource");
        return new DruidDataSourceWrapper();
    }
}

(3)application.ymal 配置示例

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_account
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: #监控指定包路径下的Spring组件
      #开启功能,stat(SQL监控),wall(防火墙)
      filters: stat,wall

      #配置监控页功能
      stat-view-servlet:  
        enabled: true
        #访问用户名
        login-username: admin
        #访问密码
        login-password: admin
        #是否允许重置
        resetEnable: false
      
      #监控Web
      web-stat-filter:  
        enabled: true
        #监控路径
        urlPattern: /*
        #排除路径
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
      
      #详细配置filters的stat、wall
      filter:
        stat:
          #慢查询时间(毫秒)
          slow-sql-millis: 1000
          #是否记录慢查询
          logSlowSql: true
          enabled: true
        wall:
          enabled: true
          config:
            #拦截删除表的SQL
            drop-table-allow: false

 

 

整合 MyBatis

1、引入第三方依赖 MyBatis 启动器

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>

2、自动配置类:MybatisAutoConfiguration

(1)所需要的类

@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })

(2)容器有且只有一个 DataSource 实例时,才装配

@ConditionalOnSingleCandidate(DataSource.class)

(3)MyBatis 配置项绑定类:MybatisProperties

@EnableConfigurationProperties(MybatisProperties.class)

(4)配置项前缀:mybatis

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public static final String MYBATIS_PREFIX = "mybatis";

(5)自动配置 SqlSessionFactory

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception

(6)自动配置 SqlSessionTemplate,组合 SqlSession

@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
public class SqlSessionTemplate implements SqlSession, DisposableBean {
    private final SqlSession sqlSessionProxy;
}

(7)Mapper 接口标注 @Mapper,该接口交给 Spring 进行管理,不需要创建 xml 映射文件

@Import(AutoConfiguredMapperScannerRegistrar.class)

3、application.yaml

(1)配置 MyBatis 规则(示例)

mybatis:
  #全局配置文件位置
  config-location: classpath:mybatis/mybatis-config.xml
  #SQL映射文件位置
  mapper-locations: classpath:mybatis/mapper/*.xml

(2)建议:使用配置项 mybatis:configuration: 修改全局配置文件的值,不需要额外创建 xml 文件,与 mybatis:config-location: 不能共存

4、编写 Mapper 接口,并标注 @Mapper

5、实现 SQL

(1)方法上标注 SQL 注解(建议)

(2)编写 mapper.xml,对方法进行绑定映射

(3)@MapperScan("指定包路径"),扫描指定包路径下的接口,可以不用标注 @Mapper

 

整合 MyBatis-Plus

1、引入第三方依赖 MyBatis-Plus 启动器

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>

2、自动配置类:MybatisPlusAutoConfiguration

(1)MyBatis-Plus 配置项绑定类:MybatisPlusProperties

@EnableConfigurationProperties(MybatisPlusProperties.class)

(2)配置项前缀:mybatis-plus

@ConfigurationProperties(prefix = Constants.MYBATIS_PLUS)
String MYBATIS_PLUS = "mybatis-plus";

(3)自动配置 mapperLocations,任意包的类路径下,所有 mapper 文件夹下,任意路径下,所有 xml 都是 SQL 映射文件(建议:SQL 映射文件放在 mapper)

private String[] mapperLocations = new String[]{"classpath*:/mapper/**/*.xml"};

(4)自动配置 SqlSessionFactory,使用容器中的数据源

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception

(5)自动配置 SqlSessionTemplate

@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory)

(6)自动扫描标注 @Mapper 的接口,建议使用 @MapperScan

@Import(AutoConfiguredMapperScannerRegistrar.class)

 

NoSQL

1、引入 Redis 场景启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、自动配置类:RedisAutoConfiguration

(1)Redis 配置项绑定类:RedisProperties

@EnableConfigurationProperties(RedisProperties.class)

(2)配置项前缀:spring.redis

@ConfigurationProperties(prefix = "spring.redis")

(3)自动配置连接工厂:LettuceConnectionConfiguration、JedisConnectionConfiguration

@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
@Bean
@ConditionalOnMissingBean(RedisConnectionFactory.class)
LettuceConnectionFactory redisConnectionFactory(
    ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
    ClientResources clientResources) {
    LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources,
                                                                            getProperties().getLettuce().getPool());
    return createLettuceConnectionFactory(clientConfig);
}
@Bean
JedisConnectionFactory redisConnectionFactory(
    ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {
    return createJedisConnectionFactory(builderCustomizers);
}

(4)自动注入 RedisTemplate<Object, Object>

@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

(5)自动注入 StringRedisTemplate<String, String>

@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    return new StringRedisTemplate(redisConnectionFactory);
}
posted @   半条咸鱼  阅读(68)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示