SpringBoot之数据访问

源码地址:https://github.com/YuChangTao/springboot.git

SpringBoot集成jdbcTemplate

Spring的jdbcTemplate是通过JdbcTemplateConfiguration自动配置的,需要配置相关的数据源,然后可以直接使用@Autowired来注入到你自己的bean中使用。

一. 引入jdbc starter依赖:

<!--引入spring-jdbc模块,使用jdbcTemplate-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

二. 数据源配置

application.yml

spring: 
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test
        username: root
        password: yt1994
        #启动时执行指定sql文件
        schema:
        - classpath:t_user.sql

通过DataSourceConfiguration类可以知道,SpringBoot内部支持
org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、org.apache.commons.dbcp2.BasicDataSource三种数据源,而且还可以通过spring.datasource.type属性来指定使用哪种数据源。

SpringBoot 2.0.6版本默认使用HikariDataSource作为数据源(不同版本或有差异),虽然HikariDataSource数据源在性能上表现良好,但是阿里Druid数据源提供了监控中心等服务,可能会被更多的使用到,以下提供了Druid数据源的集成:

1)application.yml配置文件配置

#数据源配置
spring: 
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test
        username: root
        password: yt1994
        #启动时执行指定sql文件
        schema:
          - classpath:t_user.sql
        type: com.alibaba.druid.pool.DruidDataSource

        #  druid数据源其他配置,无法通过DataSourceProperties注入
        initialSize: 5
        minIdle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,logback
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

2) 注入Druid数据源相关Bean

/**
 * 阿里Druid数据源配置
 *
 * @author yutyi
 * @date 2018/09/14
 */
@Configuration
public class DruidDataSourceConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DruidDataSource dataSource() {
        return new DruidDataSource();
    }

    /**
     * 配置druid的监控管理后台的servlet
     * 请求路径:http://locahost:9090/jdbc/durid
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        Map<String,String> initParams = new HashMap<>(16);
        initParams.put("loginUsername","yt");
        initParams.put("loginPassword","123");

        bean.setInitParameters(initParams);
        return bean;
    }

    /**
     * 配置一个web监控的filter
     * @return
     */
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        //监控后台所有请求
        bean.setUrlPatterns(Arrays.asList("/*"));

        return bean;
    }
}

三. 引入jdbcTemplate

@Service
public class UserService {

    @Autowired
    private JdbcTemplate template;

    public List<Map<String,Object>> getUser() {
        return template.queryForList("select * from t_user");
    }
}

SpringBoot集成Mybatis

引入Mybatis相关依赖:

 <!--Mybatis官方为SpringBoot提供的starter-->
 <dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>1.3.2</version>
 </dependency>

MybatisAutoConfiguration自动配置Mybatis,注入SqlSessionFactory、SqlSessionTemplate等相关Bean,如需配置Mybatis其它属性可通过MybatisProperties注入相关属性。

mybatis:
  #Mybatis mapper配置文件位置
  mapper-locations: classpath:mapper/*
  #Mybatis外置config配置文件位置
  config-location: classpath:mybatis-config.xml
  #该包下类启用别名
  type-aliases-package: cn.yutao.entity
  #configuration:
    #开启驼峰命名法
    #map-underscore-to-camel-case: true

可以选择使用properites/yml配置文件配置Mybatis,也可以保留以前xml配置Mybatis的方式,只需要引入相关配置文件的,但是config-locationconfiguration配置方式只能选择其一。还可以通过ConfigurationCustomizer来配置Mybatis。

SpringBoot集成MybatisPlus

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MybatisPlus官方地址:https://baomidou.gitee.io/mybatis-plus-doc/#/

引入MybatisPlus相关依赖

  <!--MybatisPlus官方提供starter,无需引入mybatis-spring-boot-starter-->
  <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>2.2.0</version>
  </dependency>

MybatisPlus使用MybatisPlusAutoConfiguration自动配置,可修改MybatisPlusProperties属性配置Mybatis

mybatis-plus:
  # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
  # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
  mapper-locations: classpath:mapper/*
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: cn.yutao.entity
#  config-location: classpath:mybatis-config.xml
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 3
    #字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
    field-strategy: 0
    #驼峰下划线转换
    db-column-underline: true
    #mp2.3+ 全局表前缀 mp_
    #table-prefix: mp_
    #刷新mapper 调试神器
    #refresh-mapper: true
    #数据库大写下划线转换
    #capital-mode: true
    # Sequence序列接口实现类配置
    key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
    #逻辑删除配置(下面3个配置)
    logic-delete-value: 1
    logic-not-delete-value: 0
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
    #公共字段自动填充
    meta-object-handler: cn.yutao.config.MyMetaObjectHandler
  configuration:
    #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
    map-underscore-to-camel-case: true
    cache-enabled: false
    #配置JdbcTypeForNull, oracle数据库必须配置
    jdbc-type-for-null: 'null'

公共字段自动填充类

@Configuration
public class MyMetaObjectHandler extends MetaObjectHandler {

    private static Logger logger = LoggerFactory.getLogger(MyMetaObjectHandler.class);

    /**
     * 元对象插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        Object updateTime = getFieldValByName("updateTime", metaObject);
        logger.debug("***************INSERT自动填充********************");

        if (updateTime == null) {
            setFieldValByName("updateTime",new Date(System.currentTimeMillis()),metaObject);
        }
    }

    /**
     * 元对象更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        Object updateTime = getFieldValByName("updateTime", metaObject);
        logger.debug("***************UPDATE自动填充********************");
        if (updateTime == null) {
            setFieldValByName("updateTime",new Date(System.currentTimeMillis()),metaObject);
        }
    }
}

注入MybatisPlus提供的开发插件

@Configuration
public class MybatisPlusConfig {

    /**
     * MybatisPlus分页插件
     * @return
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        //设置为true,启用pageHeper支持
        paginationInterceptor.setLocalPage(true);
        return paginationInterceptor;
    }

    /**
     * SQL执行分析插件,开发环境使用,线上不推荐
     * @return
     */
    @Bean
    public SqlExplainInterceptor sqlExplainInterceptor() {
        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
        //发现全表执行 delete update停止运行
        sqlExplainInterceptor.setStopProceed(true);
        return sqlExplainInterceptor;
    }

    /**
     * SQL 执行性能分析,开发环境使用,线上不推荐
     * @return
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        //SQL 执行最大时长,超过自动停止运行,有助于发现问题,单位ms
        performanceInterceptor.setMaxTime(1000);
        //SQL是否格式化
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值