• [学习记录] SpringBoot 17. 数据访问 Mybatis


    SpringBoot 17. 数据访问 Mybatis

    尚硅谷

    官方文档

    1. 数据源的自动配置

    1.1 导入 JDBC 场景

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-jdbcartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2 分析自动配置

    在这里插入图片描述
    导入了 HikariCP 数据源,jdbc,tx 事务。

    为什么没有导入数据库驱动?

    • 因为官方不知道我们接下来要用什么数据库
    1.2.1 引入数据库驱动
    
    <properties>
        <java.version>1.8java.version>
        <mysql.version>5.1.49mysql.version>
    properties>
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1.2.2 自动配置的类
    • DataSourceAutoConfiguration 数据源自动配置
      • 修改数据源相关的配置:spring.datasource
      • 数据库连接池的配置,当自己容器中没有 DataSource 才自动装配
      • 底层配置好的连接池:HikariDataSource
    • DataSourceTransactionManagerAutoConfiguration 事务管理器的自动配置
    • JdbcTemplateAutoConfiguration JDBC 模板的自动配置,可以用来对数据库进行 CRUD
      • 修改配置: spring.jdbc
    • XADataSourceAutoConfiguration 分布式事务的自动配置
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/todos
        username: root
        password: secret
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
      jdbc:
        template:
          query-timeout: 3    # 查询超时
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试:

    @Slf4j
    @SpringBootTest
    class SpringbootReviewRecordsApplicationTests {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
        @Test
        void contextLoads() {
            Integer count = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
    //        jdbcTemplate.queryForList("select count(*) from user");
            log.info("记录总数: {}", count);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. 使用 Druid 数据源

    2.1 导入场景依赖

    
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druid-spring-boot-starterartifactId>
        <version>1.2.11version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.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的配置
    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";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3 yaml 配置

    spring:
      datasource:
        url: jdbc:mysql://10.1.1.128:3306/todos?useSSL=false
        username: root
        password: secret
    
        druid:
          aop-patterns: com.xz.* # 监控 Spring Bean
          filters: stat, wall   # 开启功能 stat (SQL), wall(防火墙)
    
          stat-view-servlet:   # 监控页功能
            enabled: true
            login-username: admin
            login-password: admin
            reset-enable: false   # 重置按钮
    
          web-stat-filter:    # 监控 web 应用
            enabled: true
            url-pattern: /*
    #        exclusions:
    
          filter:                   # 对上面 filters 详细配置
            stat:
              slow-sql-millis: 1000    # 慢查询时间(ms)
              log-slow-sql: true
            wall:
              enabled: true
              config:
                delete-allow: false    # 是否允许删除 SQL
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3. 整合 Mybatis 操作

    3.1 导入场景依赖

    
    <dependency>
        <groupId>org.mybatis.spring.bootgroupId>
        <artifactId>mybatis-spring-boot-starterartifactId>
        <version>2.2.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2 自动配置

    • SqlSessionFactory: 自动配置好了
    • SqlSession:自动配置了 SqlSessionTemplate 组合了SqlSession
    • @Import(AutoConfiguredMapperScannerRegistrar.class)
    • Mapper: 只要我们写的操作MyBatis的接口标准了 @Mapper 就会被自动扫描进来

    mybatis-config.xml 中开启驼峰命名:

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    settings>
    
    • 1
    • 2
    • 3

    或者配置 yaml:

    mybatis:
      configuration:
        map-underscore-to-camel-case: true
    
    • 1
    • 2
    • 3

    写 userMapper 代码 @Mapper

    =》

    写 userMapper.xml

    =》

    写 userService 代码 @Service

    =》

    写 Controller @Controller

    3.2.1 插入数据时自增 id
    <insert id="insertXXX" useGeneratedKeys="true" keyProperty="id"> 
    ...
    insert>
    
    • 1
    • 2
    • 3

    3.3 注解版

    https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start

    在 Mapper 中写语句。@Select 等注解放在对应方法上即可。

    若插入需要自增 id,加上 @Options 注解配置即可。

    4. 最佳实践

    • 引入 mybatis-starter
    • 配置 application.yml,指定 mapper-location
    • 编写 Mapper 接口并标注 @Mapper 注解
    • 简单方法写注解
    • 复杂方法编写 mapper.xml 进行绑定映射

    5. Mybatis-Plus

    官方文档

    5.1 一些注意事项

    若表中没有一个字段,实体类中可以使用 TableField(exist=False) 注解。

    @TableName 可以放在类上,指明类的方法。

  • 相关阅读:
    MATLAB算法实战应用案例精讲-【智能优化算法】差分进化算法-DE(附MATLAB、Java、Python和C++代码)
    从零开始配置 vim(15)——状态栏配置
    【餐厅点餐平台|一】项目描述+需求分析
    Git 工作流程
    LCD DRM驱动框架分析一
    K线形态识别_锤头线和吊颈线(绞刑线)
    HTTP与HTTPS
    dice loss
    【数据库——MySQL(实战项目1)】(2)图书借阅系统
    maven创建web项目—war
  • 原文地址:https://blog.csdn.net/qq_39906884/article/details/126793164