weblog/doc/9、用户服务搭建与开发/9.2 用户微服务搭建(2).md
2025-02-17 11:57:55 +08:00

9.8 KiB
Raw Blame History

title, url, publishedTime
title url publishedTime
用户微服务搭建2 - 犬小哈专栏 https://www.quanxiaoha.com/column/10310.html null

本小节中,我们继续完善用户微服务,将 Druid 数据连接池与 MyBatis 整合进来,因为用户信息修改接口最终的目的是,将修改的用户信息保存到数据库中,需要操作数据库。

整合 Druid 与 MyBatis

Tip

: 关于如何整合阿里 Druid 连接池,在《4.5节》 已经详细说过了,本小节在用户微服务中,再次演示一波,后续如果还有新创建的服务,就不再做演示了,相信小伙伴们也已经非常熟悉了。

添加依赖

编辑 xiaohashu-user-biz 模块的 pom.xml 文件,添加数据源相关依赖,如下:

        // 省略...
        
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <!-- MySQL 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- Druid 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-3-starter</artifactId>
        </dependency>
        
        // 省略...
        

依赖添加完毕后,刷新一波 Maven 依赖,将包下载到本地仓库中。

添加配置

Mybatis 配置

编辑 application.yml 本地开发环境配置文件, 配置 MyBatis xml 文件路径:

mybatis:
  # MyBatis xml 配置文件路径
  mapper-locations: classpath:/mapper/**/*.xml

Druid 数据源配置

编辑 application-dev.yml 本地开发环境配置文件,添加数据源相关配置,可以直接从已经整合好的服务中复制过来,如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver # 指定数据库驱动类
    # 数据库连接信息
    url: jdbc:mysql://127.0.0.1:3306/xiaohashu?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
    username: root # 数据库用户名
    password: A2qT03X7KlL4v/F2foD6kV/Ch9gpNBWOh1qoCywanjv1AsI7f9x3iAyR9NkUKeV+FMo+halCTzy5Llbk2VOrVQ== # 数据库密码
    type: com.alibaba.druid.pool.DruidDataSource
    druid: # Druid 连接池
      initial-size: 5 # 初始化连接池大小
      min-idle: 5 # 最小连接池数量
      max-active: 20 # 最大连接池数量
      max-wait: 60000 # 连接时最大等待时间(单位:毫秒)
      test-while-idle: true
      time-between-eviction-runs-millis: 60000 # 配置多久进行一次检测,检测需要关闭的连接(单位:毫秒)
      min-evictable-idle-time-millis: 300000 # 配置一个连接在连接池中最小生存的时间(单位:毫秒)
      max-evictable-idle-time-millis: 900000 # 配置一个连接在连接池中最大生存的时间(单位:毫秒)
      validation-query: SELECT 1 FROM DUAL # 配置测试连接是否可用的查询 sql
      connectionProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIaJmhsfN14oM+bghiOfARP6YgIiArekviyAOEa9Dt8spf4W38kSJShGs0NkzT3btqJB0O2o0X/yfVE8kqme1jMCAwEAAQ==
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: false
      web-stat-filter:
        enabled: true
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/* # 配置监控后台访问路径
        login-username: admin # 配置监控后台登录的用户名、密码
        login-password: admin
      filter:
        config:
          enabled: true
        stat:
          enabled: true
          log-slow-sql: true # 开启慢 sql 记录
          slow-sql-millis: 2000 # 若执行耗时大于 2s则视为慢 sql
          merge-sql: true
        wall: # 防火墙
          config:
            multi-statement-allow: true

logging:
  level:
    com.quanxiaoha.xiaohashu.user.biz.domain.mapper: debug

整合代码生成器

接下来,为用户服务整合代码生成器 Maven 插件。编辑 xiaohashu-user-biz 模块的 pom.xml 文件,添加对应插件依赖,如下:

     <build>
        <plugins>
            // 省略...
            
            <!-- 代码生成器 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

预创建相关文件夹

插件添加好后,分别创建 /domain/dataobject 实体类包、/domain/mapper 接口包、/resources/mapper 映射文件文件夹,如上图所示。

创建配置文件

并在 /resources 文件夹下新建 generatorConfig.xml 生成器配置文件,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="mysqlTables" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 自动检查关键字,为关键字增加反引号,如:`type` -->
        <property name="autoDelimitKeywords" value="true"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <!-- 指定生成的 Java 文件编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>

        <!-- 对生成的注释进行控制 -->
        <commentGenerator>
            <!-- 由于此插件生成的注释不太美观,这里设置不生成任何注释 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 数据库链接 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/xiaohashu"
                        userId="root"
                        password="123456">
            <!-- 解决多个重名的表生成表结构不一致问题 -->
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!-- 不强制将所有的数值类型映射为 Java 的 BigDecimal 类型 -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- DO 实体类存放路径 -->
        <javaModelGenerator targetPackage="com.quanxiaoha.xiaohashu.user.biz.domain.dataobject"
                            targetProject="src/main/java"/>

        <!-- Mapper xml 文件存放路径-->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources"/>

        <!-- Mapper 接口存放路径 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.quanxiaoha.xiaohashu.user.biz.domain.mapper"
                             targetProject="src/main/java"/>

        <!-- 需要生成的表-实体类 -->
        <table tableName="t_user" domainObjectName="UserDO"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

Tip

: 每个服务的 DO 实体类、mapper 接口、xml 映射文件的包路径会有所区别,小伙伴们可以直接从别的服务中,复制过来然后稍作修改一下。

生成代码

点击右侧栏中 xiaohashu-user-biz 模块中 Plugins 插件下的 generate , 开始自动生成相关代码,操作如下图所示:

生成完毕后,就能在刚刚创建的文件夹中,看到生成好的代码啦,如下图所示:

修改一下 UserDO 实体类,删除掉 get/set 方法,并添加上 Lombok 相关注解,以及将 Date 日期类修改为 LocalDateTime Java8 新的日期类, 最终代码如下:

package com.quanxiaoha.xiaohashu.user.biz.domain.dataobject;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserDO {
    private Long id;

    private String xiaohashuId;

    private String password;

    private String nickname;

    private String avatar;

    private LocalDate birthday;

    private String backgroundImg;

    private String phone;

    private Integer sex;

    private Integer status;

    private String introduction;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    private Boolean isDeleted;
}

添加 @MapperScan 注解

在启动类头上添加 @MapperScan 注解,并配置 mapper 接口的包路径,代码如下:

package com.quanxiaoha.xiaohashu.user.biz;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.quanxiaoha.xiaohashu.user.biz.domain.mapper")
public class XiaohashuUserBizApplication {

    public static void main(String[] args) {
        SpringApplication.run(XiaohashuUserBizApplication.class, args);
    }

}

测试一波

最后,重启用户服务,观察控制台日志,若打印了 Init DruidDataSource 信息,说明 Druid 连接池整合成功了。

本小节源码下载

https://t.zsxq.com/yOBnR