搭建大型分布式服务(五)Springboot整合mybatis

435 阅读2分钟

一、本文要点

会员服务需要用到数据库,我们这里采用mysql,orm框架采用mybatis,接上文代码,将介绍SpringBoot如何整合 mybatis,并自动生成CRUD代码。系列文章完整目录

  • springboot整合mybatis

  • springboot整合mysql

  • mysql 授权

  • mybatis插件自动生成代码

  • junit 5 单元测试

二、开发环境

  • jdk 1.8
  • maven 3.6.2
  • lombok 1.18.18
  • springboot 2.4.3
  • mysql 5.6.46
  • junit 5
  • idea 2020

三、安装配置mysql

1、安装mysql

搭建大型分布式服务(四)Docker搭建开发环境安装Mysql

2、登录mysql,授权用户访问权限(如果你直接用mysql的root账号,这步可以忽略),开发环境密码可以简单点,%可以替换成你机器所在的网段,如 'mmc_update'@'10.10.%' 。

-- 授权
grant all privileges on *.* to 'mmc_update'@'%' identified by '123456';
-- 刷新权限
flush privileges;
-- 查看MYSQL数据库中所有用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

3、创建库表

create database mmc;

use mmc;

drop table if exists Tbl_MemberInfo;

create table Tbl_MemberInfo
(
  `uid` bigint(11) NOT NULL auto_increment,
  `uname` varchar(20) NOT NULL,
  `usex` tinyint(4) DEFAULT NULL,
  `ubirth` datetime NOT NULL,
  `utel` char(11) DEFAULT NULL,
  `uaddr` varchar(255) DEFAULT NULL,
  `uphoto` longblob,
  `createTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `state` tinyint(4) DEFAULT NULL,
  `delFlag` tinyint(4) DEFAULT '0' COMMENT '删除状态:0未删除,1已删除',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

四、整合mybatis插件生成CRUD代码

1、修改pom.xml,增加mysql、mybatis依赖。

        <version.mybatis>1.3.0</version.mybatis>
        <version.mysql>5.1.48</version.mysql>

				<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${version.mysql}</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${version.mybatis}</version>
        </dependency>

2、修改pom.xml,增加mybatis插件。

            <!--mybatis代码生成器:支持批量操作的生成-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${version.mysql}</version>
                        <scope>runtime</scope>
                    </dependency>
                    <dependency>
                        <groupId>com.itfsw</groupId>
                        <artifactId>mybatis-generator-plugin</artifactId>
                        <version>1.3.8</version>
                    </dependency>
                </dependencies>
            </plugin>

3、在src/main/resources目录下增加generatorConfig.xml文件,用来生成CRUD代码。

<?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="test" targetRuntime="MyBatis3" defaultModelType="flat">

        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>


        <!-- 批量插入插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.BatchInsertPlugin">
            <!--
            开启后可以实现官方插件根据属性是否为空决定是否插入该字段功能
            !需开启allowMultiQueries=true多条sql提交操作,所以不建议使用!插件默认不开启
            -->
            <property name="allowMultiQueries" value="false"/>
        </plugin>
        <!-- 数据Model属性对应Column获取插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.ModelColumnPlugin"/>
        <!-- 存在即更新插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.UpsertPlugin">
            <!--
            支持upsertByExample,upsertByExampleSelective操作
            !需开启allowMultiQueries=true多条sql提交操作,所以不建议使用!插件默认不开启
            -->
            <property name="allowMultiQueries" value="false"/>
            <!--
            开启批量功能,支持batchUpsert,batchUpsertWithBLOBs,batchUpserSelective
            !这几个方法中无法支持IncrementsPlugin的方法!插件默认不开启
            -->
            <property name="allowBatchUpsert" value="true"/>
        </plugin>

        <!-- 防止生成的代码中有很多注释,加入下面的配置控制 -->
        <commentGenerator >
            <!-- 这个元素用来去除指定生成的注释中是否包含生成的日期 false:表示保护 -->
            <!-- 如果生成日期,会造成即使修改一个字段,整个实体类所有属性都会发生变化,不利于版本控制,所以设置为true -->
            <property name="suppressDate" value="true" />
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>


        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://9.135.xxx.xxx:3306/mmc" userId="root" password="123456">
            <property name="useInformationSchema" value="true"/>
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>

        <javaTypeResolver>
            <!-- This property is used to specify whether MyBatis Generator should
                force the use of java.math.BigDecimal for DECIMAL and NUMERIC fields, -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.mmc.lesson.member.model"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
<!--            <property name="trimStrings" value="true" />-->
        </javaModelGenerator>


        <!-- 生成映射文件xml的包名和位置 -->
        <sqlMapGenerator targetPackage="mysqlMappers"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 生成DAO的包名和位置 -->
        <javaClientGenerator type="XMLMAPPER"
                targetPackage="com.mmc.lesson.member.mapper"
                targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>


        <table schema="mmc" tableName="Tbl_MemberInfo" domainObjectName="TblMemberInfo"
               enableCountByExample="true" enableUpdateByExample="true"
               enableDeleteByExample="true" enableSelectByExample="true"
               selectByExampleQueryId="true">
            <!-- 因为该表字段驼峰命名,属性保持一致 -->
            <property name="useActualColumnNames" value="true"/>

            <columnOverride column="usex" javaType="Integer"/>
            <columnOverride column="state" javaType="Integer"/>
            <columnOverride column="delFlag" javaType="Integer"/>
        </table>


    </context>

</generatorConfiguration>

4、双击运行插件。 在这里插入图片描述

5、效果。 在这里插入图片描述

五、修改工程配置

1、在启动类MemberApplication.java增加@MapperScan。

@MapperScan(basePackages = "com.mmc.lesson.member.mapper")
@SpringBootApplication
public class MemberApplication {

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

}

2、在application-dev.properties增加数据源配置。

logging.file.path=./logs

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://9.135.xxx.xxx:3306/mmc?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapper-locations=classpath:mysqlMappers/*.xml

3、编写MemberService.java。

@Service
public class MemberService {

    @Resource
    private TblMemberInfoMapper tblMemberInfoMapper;

    public TblMemberInfo save(TblMemberInfo member) {

        int affect = tblMemberInfoMapper.insert(member);

        return member;
    }
}

六、运行一下

1、编写单元测试。

@Slf4j
@ActiveProfiles("dev")
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {

    @Resource
    private MemberService memberService;

    /**
     * add.
     */
    @Test
    public void testAdd() {

        TblMemberInfo member = new TblMemberInfo();
        member.setUname("zhangsan");
        member.setUsex(1);
        member.setUbirth(new Date());
        member.setUtel("888");
        member.setUaddr("凌霄殿");
        member.setState(0);
        member.setDelFlag(0);
        member.setUphoto(null);

        TblMemberInfo ret = memberService.save(member);

        Assertions.assertThat(ret).isNotNull();
        log.info("--------------------------------------------------");
        log.info(ret.getUname());


    }

}

2、效果。

[2021-02-25 12:03:41.974] [main] [DEBUG] [c.m.l.member.mapper.TblMemberInfoMapper.insert:?] - ==> Parameters: null, zhangsan(String), 1(Integer), 2021-02-25 12:03:41.729(Timestamp), 888(String), 凌霄殿(String), null, null, 0(Integer), 0(Integer), null
[2021-02-25 12:03:41.990] [main] [DEBUG] [c.m.l.member.mapper.TblMemberInfoMapper.insert:?] - <==    Updates: 1
[2021-02-25 12:03:41.991] [main] [DEBUG] [org.mybatis.spring.SqlSessionUtils:?] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2d64c100]
[2021-02-25 12:03:42.032] [main] [INFO] [com.mmc.lesson.member.service.MemberServiceTest:?] - --------------------------------------------------
[2021-02-25 12:03:42.032] [main] [INFO] [com.mmc.lesson.member.service.MemberServiceTest:?] - zhangsan

七、小结

简单几步,就使项目整合mybatis和自动生成CRUD代码了,在高并发和大数据场景下,自动生成的代码并不适用,所以项目里会增加手写Mapper的操作。除了mybatis官方的starter,还可以使用baomidou的starter,完整代码地址:戳这里。下一篇《SpringBoot整合数据库连接池hikari

加我一起交流学习!