前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot2----数据访问

SpringBoot2----数据访问

作者头像
大忽悠爱学习
发布2021-11-15 15:00:04
3560
发布2021-11-15 15:00:04
举报
文章被收录于专栏:c++与qt学习

数据访问


数据源的自动配置—默认是HikariDataSource


导入JDBC场景

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

数据库驱动?

为什么导入JDBC场景,官方不导入驱动?官方不知道我们接下要操作什么数据库。

数据库版本和驱动版本对应

代码语言:javascript
复制
默认版本:<mysql.version>8.0.22</mysql.version>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
<!--            <version>5.1.49</version>-->
        </dependency>
想要修改版本
1、直接依赖引入具体版本(maven的就近依赖原则)
2、重新声明版本(maven的属性的就近优先原则)
    <properties>
        <java.version>1.8</java.version>
        <mysql.version>5.1.49</mysql.version>
    </properties>

一开始要导入jdbc启动器和mysql数据库驱动

代码语言:javascript
复制
        <!--jdbc 和带版本号的mysql驱动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

分析自动配置

自动配置的类

DataSourceAutoConfiguration : 数据源的自动配置

  • 修改数据源相关的配置:spring.datasource
  • 数据库连接池的配置,是自己容器中没有DataSource才自动配置的
  • 底层配置好的连接池是:HikariDataSource
代码语言:javascript
复制
	@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

DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置

JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud

  • 可以修改这个配置项@ConfigurationProperties(prefix = “spring.jdbc”) 来修改JdbcTemplate
  • @Bean@Primary JdbcTemplate;容器中有这个组件,可以直接注入使用

JndiDataSourceAutoConfiguration: jndi的自动配置

XADataSourceAutoConfiguration: 分布式事务相关的


修改配置项

代码语言:javascript
复制
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/tx
    username: root
    password: 126433
    driver-class-name: com.mysql.jdbc.Driver
  jdbc:
    template:
      query-timeout: 1 #查询的超时时间

代码语言:javascript
复制
@SpringBootTest
class SpringBootDaoApplicationTests {
    @Autowired
    JdbcTemplate jdbcTemplate;

    @Test
    void contextLoads()
    {
        Long num = jdbcTemplate.queryForObject("select count(*) from employee", Long.class);
        System.out.println("查询到的记录数为: "+num);
    }
}

使用Druid数据源

druid官方github地址

druid官方github地址

github如果打不开,可以看这里

整合第三方技术的两种方式: 自定义 找starter


自定义方式

创建数据源

代码语言:javascript
复制
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

<!--原生方法是给容器中放一个数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="maxActive" value="20" />
		<property name="initialSize" value="1" />
		<property name="maxWait" value="60000" />
		<property name="minIdle" value="1" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="poolPreparedStatements" value="true" />
		<property name="maxOpenPreparedStatements" value="20" />

springboot的做法: 在配置类中给容器中直接注入一个数据源

代码语言:javascript
复制
@Configuration
public class WebConfig implements WebMvcConfigurer
{
    //给容器中放置一个数据源
    @Bean
    //将注入容器的DataSource组件的属性与配置文件中spring.datasource下面的值进行绑定
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource()
    {
       return new DruidDataSource();
    }
}

Driud内置监控页面功能开启

需要在容器中放入一个servlet,这样才能开启监控功能

代码语言:javascript
复制
    //配置Druid的监控页面功能
    @Bean
    public ServletRegistrationBean statViewServlet()
    {
        StatViewServlet statViewServlet=new StatViewServlet();
        //配置该servl拦截路径
        ServletRegistrationBean<StatViewServlet> serlvet = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        return serlvet;
    }

只是打开了监控的页面


Driud监控统计功能开启(sql监控)

代码语言:javascript
复制
    //给容器中放置一个数据源
    @Bean
    //将注入容器的DataSource组件的属性与配置文件中spring.datasource下面的值进行绑定
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        //加入监控功能
        druidDataSource.setFilters("stat");
        return druidDataSource;
    }

当我们执行一次sql语句时,就可以去查询一下这个语句执行的相关信息


web-jdbc关联的监控数据

代码语言:javascript
复制
    //WebStatFilter用于采集web-jdbc关联监控的数据
    @Bean
    public FilterRegistrationBean WebStatFilter(){
        WebStatFilter webStatFilter=new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> fb= new FilterRegistrationBean<>(webStatFilter);
        fb.setUrlPatterns(Arrays.asList("/*"));
        fb.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return  fb;
    }

开启防火墙功能

代码语言:javascript
复制
    //给容器中放置一个数据源
    @Bean
    //将注入容器的DataSource组件的属性与配置文件中spring.datasource下面的值进行绑定
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        //加入监控功能, wall:开启防火墙功能
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }

用户名和密码登录数据监控页面,开启监控页面的时候配置初始化参数即可

代码语言:javascript
复制
    //配置Druid的监控页面功能
    @Bean
    public ServletRegistrationBean statViewServlet()
    {
        StatViewServlet statViewServlet=new StatViewServlet();
        //配置该servl拦截路径
        ServletRegistrationBean<StatViewServlet> serlvet = new ServletRegistrationBean<>(statViewServlet, "/druid/*");

        serlvet.addInitParameter("loginUsername","大忽悠");
        serlvet.addInitParameter("loginPassword","123456");
        return serlvet;
    }

使用官方starter方式

1、引入druid-starter

代码语言:javascript
复制
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2、分析自动配置

扩展配置项 spring.datasource.druid,在主配置文件中以这个前缀开头,就可以修改相关属性配置

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的配置

代码语言:javascript
复制
    private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
    private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
    private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
    private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
    private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
    private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
    private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
    private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";

配置文件配置实例

代码语言:javascript
复制
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_account
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.atguigu.admin.*  #监控SpringBean
      filters: stat,wall,slf4j     # 底层开启功能,stat(sql监控),wall(防火墙),slf4j(日志)

      stat-view-servlet:   # 配置监控页功能
        enabled: true
        login-username: admin
        login-password: admin
        resetEnable: false  #禁用重置按钮

      web-stat-filter:  # 监控web--url监控
        enabled: true
        urlPattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'


      filter:
        stat:    # 对上面filters里面的stat的详细配置
          slow-sql-millis: 1000
          logSlowSql: true
          enabled: true
        wall:
          enabled: true
          config:
            drop-table-allow: false

官方文档

官方文档

配置项列表https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8


整合MyBaits

引入starter

SpringBoot官方的Starter:spring-boot-starter-*

*第三方的: -spring-boot-starter

我们要引入的是第三方的启动器

代码语言:javascript
复制
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

配置模式

全局配置文件

  • SqlSessionFactory: 自动配置好了
  • SqlSession:自动配置了 SqlSessionTemplate 组合了SqlSession
  • @Import(AutoConfiguredMapperScannerRegistrar.class);
  • Mapper: 只要我们写的操作MyBatis的接口标注了 @Mapper 就会被自动扫描进来
代码语言:javascript
复制
@EnableConfigurationProperties(MybatisProperties.class) : MyBatis配置项绑定类。
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration{}

@ConfigurationProperties(prefix = "mybatis")
public class MybatisProperties

可以修改配置文件中通过 mybatis 前缀开始的所有属性

代码语言:javascript
复制
# 配置mybatis规则
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml  #全局配置文件位置
  mapper-locations: classpath:mybatis/mapper/*.xml  #sql映射文件位置
  
@Mapper注解扫描Mapper接口---->Mapper接口--->绑定Xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.admin.mapper.AccountMapper">
<!--    public Account getAcct(Long id); -->
    <select id="getAcct" resultType="com.atguigu.admin.bean.Account">
        select * from  account_tbl where  id=#{id}
    </select>
</mapper>

配置 private Configuration configuration; mybatis.configuration下面的所有,就是相当于改mybatis全局配置文件中的值

代码语言:javascript
复制
# 配置mybatis规则
mybatis:
#  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true 驼峰命名规则的开启
    
 可以不写全局配置文件,所有全局配置文件的配置都放在configuration配置项中即可
 config-location和configuration不能同时写,因为写了configuration就顶替了myBaits默认的全局配置文件

具体步骤

  1. 导入mybatis官方starter
  2. 编写mapper接口。标准@Mapper注解(也可以在启动类上加上@MapperScan替换@Mapper)
  3. 编写sql映射文件并绑定mapper接口
  4. 在application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息 (建议;配置在mybatis.configuration)

注解模式

代码语言:javascript
复制
@Mapper
public interface CityMapper {

    @Select("select * from city where id=#{id}")
    public City getById(Long id);
}

混合模式=注解模式+配置文件方式

代码语言:javascript
复制
@Mapper
public interface UserMapper
{
     public UserDao getUser(String name);

     @Insert("INSERT INTO USER(`name`,age) VALUES(name,age)")
     @Options(useGeneratedKeys = true,keyProperty = "id")//获取自增主键的值,赋值给参数上的对象
     public Integer InsertUser(UserDao user );
}

最佳实践

  • 引入mybatis-starter
  • 配置application.yaml中,指定mapper-location位置即可
  • 编写Mapper接口并标注@Mapper注解
  • 简单方法直接注解方式,可以使用option注解完成配置文件中标签里面的属性设置
  • 复杂方法编写mapper.xml进行绑定映射
  • @MapperScan(“com.atguigu.admin.mapper”) 简化,该主键需要标注在配置类上方可生效,其他的接口就可以不用标注@Mapper注解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据访问
  • 数据源的自动配置—默认是HikariDataSource
  • 导入JDBC场景
  • 分析自动配置
    • 自动配置的类
    • 修改配置项
    • 使用Druid数据源
      • druid官方github地址
        • 自定义方式
          • 创建数据源
        • Driud内置监控页面功能开启
          • Driud监控统计功能开启(sql监控)
            • web-jdbc关联的监控数据
              • 开启防火墙功能
                • 用户名和密码登录数据监控页面,开启监控页面的时候配置初始化参数即可
                  • 使用官方starter方式
                    • 1、引入druid-starter
                    • 2、分析自动配置
                  • 配置文件配置实例
                    • 官方文档
                • 整合MyBaits
                  • 配置模式
                    • 可以修改配置文件中通过 mybatis 前缀开始的所有属性
                    • 配置 private Configuration configuration; mybatis.configuration下面的所有,就是相当于改mybatis全局配置文件中的值
                  • 具体步骤
                    • 注解模式
                      • 混合模式=注解模式+配置文件方式
                        • 最佳实践
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档