zoukankan      html  css  js  c++  java
  • 0120 springboot集成Mybatis和代码生成器

    在日常开发中,数据持久技术使用的架子使用频率最高的有3个,即spring-jdbc , spring-jpa, spring-mybatis.详情可以看我之前的一篇文章spring操作数据库的3个架子 .

    spring-jdbc封装的比较少,需要在代码中拼接sql,不太适合大规模的企业级别的开发。
    spring-jpa封装略多,适合开发后台管理类的系统,可以减少大量重复工作。

    但是在当下的互联网大环境下,spring-mybatis既带来了开发的便捷性,也不失灵活性,特别适合性能要求高,可以灵活改变的场景。本篇文章大致回顾一下基于springboot的mybatis的配置开发要点以及基于maven插件的代码自动生成。

    hello, springboot集成mybatis以及代码生成器!

    springboot集成Mybatis


    springboot集成Mybatis有大把的文章,不过如果撇开别人的观点,你觉得从0开始配置,应该有哪几个步骤呢?

    我觉得大致分为如下几个要点:

    1. 引入依赖,数据库驱动,mybatis的starter;
    2. 配置数据库连接信息,连接池信息;
    3. 配置mybatis的核心配置信息;比如entity位置,执行器类型,xml的位置;
    4. 配置springboot的Mybatis注解,主要是开启支持,然后是mapper的地址;
    5. 测试启动成功:可以放到健康检查里面去做;

    springboot集成Mybatis的关键步骤:
    集成完毕之后,剩下的就是使用代码生成器,生成好常规的entity,xml,mapper, example 这些基础代码,然后结合业务逻辑,新增一些新的mapper的方法代码;

    下面跟我一起来一步一步集成springboot:

    1 依赖

    使用spring initializr创建项目,引入如下依赖:

    image.png

    依赖说明如下:

    2 数据源配置

    数据源使用springboot默认自带的hikari数据源;
    配置如下:

    数据库连接信息

    spring.datasource.url=jdbc:mysql://10.19.174.11:3306/demo_datasource
    spring.datasource.username=lxdev
    spring.datasource.password=db@LX4devtmp123
    spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    

    数据连接池配置信息

    spring.datasource.hikari.pool-name=demo_mybatis_and_plugin_pool
    spring.datasource.hikari.maximum-pool-size=5
    spring.datasource.hikari.allow-pool-suspension=false
    

    3 mybatis的配置

    mybatis主要是配置mapper-locations,type-alias-package,以及驼峰对应关系,执行器的类型等;

    #mybatis配置
    mybatis.mapper-locations=classpath:com/springbootpractice/demo/mybatis/plugin/dao/xml/*.xml
    mybatis.type-aliases-package=com.springbootpractice.demo.mybatis.plugin.dao.entity
    mybatis.executor-type=reuse
    mybatis.configuration.map-underscore-to-camel-case=true
    mybatis.configuration.cache-enabled=true
    mybatis.lazy-initialization=true
    

    4 入口@MapperScan配置

    告诉应用程序mapper接口所在的包位置,以及标识注解。

    package com.springbootpractice.demo.mybatis.plugin;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.stereotype.Repository;
    
    @SpringBootApplication
    @MapperScan(annotationClass = Repository.class,
            basePackages = "com.springbootpractice.demo.mybatis.plugin.dao.mapper")
    public class DemoMybatisAndPluginApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoMybatisAndPluginApplication.class, args);
        }
    
    }
    

    5 数据库的健康检查

    首先配置好actuator,开放health端点;

    #ops配置
    management.endpoints.web.exposure.include=*
    management.endpoints.enabled-by-default=false
    management.endpoint.health.enabled=true
    management.endpoint.health.show-details=always
    

    6 检查数据库连接状态

    启动程序, curl http://localhost:8080/actuator/health/db  可以检查数据库的连接状态,正常返回结果如下:

    {
    status: "UP",
    details:- {
    database: "MySQL",
    result: 1,
    validationQuery: "/* ping */ SELECT 1"
    }
    }
    

    至此,springboot集成mybatis的步骤完成了。但是一些模板代码,需要记忆吗?记忆起来很痛苦应该。所以,我们还应该配置一下mybatis的代码生成插件,生成好一些常用的代码,然后在生成的代码的基础上添加一些自己的持久化的mapper方法,提供给业务层调用。

    代码生成器


    代码生成器,mybatis官网有介绍。配置分为插件配置和生成配置。本文主要通过maven的插件来进行常规的代码生成。

    官网提供的代码生成插件介绍

    插件配置

    主要使用的是maven插件,配置如下:主要是需要配置生成代码配置文件的位置;

    <plugin>
           <groupId>org.mybatis.generator</groupId>
           <artifactId>mybatis-generator-maven-plugin</artifactId>
           <version>1.3.7</version>
           <configuration>
               <configurationFile>${project.basedir}/src/main/resources/generateConfig.xml</configurationFile>
               <verbose>false</verbose>
               <overwrite>true</overwrite>
           </configuration>
           <dependencies>
               <dependency>
                   <groupId>mysql</groupId>
                   <artifactId>mysql-connector-java</artifactId>
                   <version>5.1.31</version>
               </dependency>
               <dependency>
                   <groupId>com.itfsw</groupId>
                   <artifactId>mybatis-generator-plugin</artifactId>
                   <version>1.3.8</version>
               </dependency>
           </dependencies>
    </plugin>
    

    配置要点如下:

    生成代码配置

    主要配置几个生成代码的位置,mapper,entity,example,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>
        <properties resource="jdbc.properties"></properties>
        <context defaultModelType="flat" id="Mysql" targetRuntime="MyBatis3">
            <property name="endingDelimiter" value="`"/>
            <property name="beginningDelimiter" value="`"/>
            <property name="javaFileEncoding" value="UTF-8"/>
            <property name="autoDelimitKeywords" value="true"/>
            <!-- 自定义注释插件 -->
            <plugin type="com.itfsw.mybatis.generator.plugins.CommentPlugin">
                <!-- 自定义模板路径 -->
                <property name="template" value="src/main/resources/comment.ftl"/>
            </plugin>
            <plugin type="com.itfsw.mybatis.generator.plugins.LombokPlugin">
                <!-- @Data 默认开启,同时插件会对子类自动附加@EqualsAndHashCode(callSuper = true),@ToString(callSuper = true) -->
                <property name="@Data" value="true"/>
                <!-- @Builder 必须在 Lombok 版本 >= 1.18.2 的情况下开启,对存在继承关系的类自动替换成@SuperBuilder -->
                <property name="@Builder" value="true"/>
                <!-- @NoArgsConstructor 和 @AllArgsConstructor 使用规则和Lombok一致 -->
                <property name="@AllArgsConstructor" value="true"/>
                <property name="@NoArgsConstructor" value="true"/>
                <!-- @Getter、@Setter、@Accessors 等使用规则参见官方文档 -->
                <property name="@Accessors(chain = true)" value="false"/>
                <!-- 临时解决IDEA工具对@SuperBuilder的不支持问题,开启后(默认未开启)插件在遇到@SuperBuilder注解时会调用ModelBuilderPlugin来生成相应的builder代码 -->
                <property name="supportSuperBuilderForIdea" value="false"/>
            </plugin>
            <!-- Mapper注解插件 -->
            <plugin type="com.itfsw.mybatis.generator.plugins.MapperAnnotationPlugin">
                <!-- @Mapper 默认开启 -->
                <property name="@Mapper" value="false"/>
                <!-- @Repository 默认关闭,开启后解决IDEA工具@Autowired报错 -->
                <property name="@Repository" value="true"/>
            </plugin>
            <!-- MySQL分页插件 -->
            <plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin">
                <!-- 通过配置startPage影响Example中的page方法开始分页的页码,默认分页从0开始 -->
                <property name="startPage" value="1"/>
            </plugin>
            <plugin type="com.itfsw.mybatis.generator.plugins.ExampleTargetPlugin">
                <!-- 修改Example类生成到目标包下 -->
                <property name="targetPackage" value="${code.base.package}.example"/>
            </plugin>
            <!-- 状态枚举生成插件 -->
            <plugin type="com.itfsw.mybatis.generator.plugins.EnumTypeStatusPlugin">
                <!-- 是否开启自动扫描根据约定注释格式生成枚举,默认true  注释[success(0):成功, fail(1):失败]-->
                <property name="autoScan" value="true"/>
            </plugin>
            <!-- 逻辑删除插件 -->
            <plugin type="com.itfsw.mybatis.generator.plugins.LogicalDeletePlugin">
                <!-- 这里配置的是全局逻辑删除列和逻辑删除值,当然在table中配置的值会覆盖该全局配置 -->
                <!-- 逻辑删除列类型只能为数字、字符串或者布尔类型 -->
                <property name="logicalDeleteColumn" value="deleted"/>
                <!-- 逻辑删除-已删除值 -->
                <property name="logicalDeleteValue" value="1"/>
                <!-- 逻辑删除-未删除值 -->
                <property name="logicalUnDeleteValue" value="0"/>
                <!-- 是否生成逻辑删除常量(只有开启时 logicalDeleteConstName、logicalUnDeleteConstName 才生效) -->
                <property name="enableLogicalDeleteConst" value="true"/>
                <!-- 逻辑删除常量名称,不配置默认为 IS_DELETED -->
                <property name="logicalDeleteConstName" value="IS_DELETED"/>
                <!-- 逻辑删除常量(未删除)名称,不配置默认为 NOT_DELETED -->
                <property name="logicalUnDeleteConstName" value="NOT_DELETED"/>
            </plugin>
            <jdbcConnection connectionURL="${spring.datasource.url}" driverClass="${spring.datasource.driver-class-name}"
                            password="${spring.datasource.password}" userId="${spring.datasource.username}"/>
    
            <javaTypeResolver>
                <property name="forceBigDecimals" value="true"/>
                <property name="useJSR310Types" value="true"/>
            </javaTypeResolver>
            <javaModelGenerator targetPackage="${code.base.package}.entity"
                                targetProject="src/main/java">
                <property name="trimStrings" value="true"/>
                <property name="enableSubPackages" value="true"/>
            </javaModelGenerator>
            <sqlMapGenerator targetPackage="${code.base.package}.xml" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
            <javaClientGenerator targetPackage="${code.base.package}.mapper"
                                 targetProject="src/main/java" type="XMLMAPPER">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
    
            <table domainObjectName="UserLoginExtEntity" tableName="user_login_ext"
                   enableDeleteByExample="false" enableDeleteByPrimaryKey="false">
                <generatedKey column="id" identity="true" sqlStatement="MySql"/>
            </table>
        </context>
    </generatorConfiguration>
    
    

    此外,还把两个信息配置外部化了。
    jdbc.properties : 主要配置数据连接信息,父包名;

    spring.datasource.url=jdbc:mysql://10.19.174.11:3306/demo_datasource
    spring.datasource.username=lxdev
    spring.datasource.password=db@LX4devtmp123
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    code.base.package=com.springbootpractice.demo.mybatis.plugin.dao
    

    comment.ftl 配置了注释生成的格式;

    <?xml version="1.0" encoding="UTF-8"?>
    <template>
        <comment ID="addJavaFileComment"></comment>
        <comment ID="addComment"></comment>
        <comment ID="addRootComment"></comment>
        <comment ID="addFieldComment"><![CDATA[
            <#if introspectedColumn??>
                /**
                <#if introspectedColumn.remarks?? && introspectedColumn.remarks != ''>
                    <#list introspectedColumn.remarks?split("
    ") as remark>
    * ${remark}  对应数据库表字段: ${introspectedTable.fullyQualifiedTable}.${introspectedColumn.actualColumnName}
                    </#list>
                </#if>
    */
            <#else>
            </#if>
            ]]></comment>
        <comment ID="addModelClassComment"><![CDATA[
    /**
    * @author: carter
    * 对应数据库表: ${introspectedTable.fullyQualifiedTable}
    */
            ]]></comment>
        <comment ID="addClassComment"></comment>
        <comment ID="addEnumComment"></comment>
        <comment ID="addInterfaceComment"></comment>
        <comment ID="addGetterComment"></comment>
        <comment ID="addSetterComment"></comment>
        <comment ID="addGeneralMethodComment"></comment>
    </template>
    
    

    **

    小结


    通过本篇文章你可以学到如下内容:

    1. 0基础为你的springboot应用集成mybatis;
    2. 配置mybatis的代码生成器插件,并用于生成代码,提高工作效率;

    代码获取点我!

    springboot集成mybatis,配置好代码生成插件之后,就可以有大把时间专注于业务逻辑的开发,快速的完成研发工作,有大把的时间下班回去陪娃了。该demo可以用于生产环境,经过产品试验。放心使用,拿走不谢!

    不管你有没有收获,美女还是要送的,最近在追剧,猜猜看这个美女是谁?鸡腿仙女送给你。
    image.png

    原创不易,转载请注明出处。

  • 相关阅读:
    关于pem与ppk格式的密钥的相互转换
    关于linux免密登录的配置及ssh客户端基于私钥文件的登录
    关于yum update和yum upgrade的区别
    Golang文件操作整理
    整理那些用于基本生存的shell命令
    Docker command line 学习笔记
    关于fork
    tips for using shortcuts
    chapter2
    使用MarkDown的编辑器
  • 原文地址:https://www.cnblogs.com/snidget/p/12219044.html
Copyright © 2011-2022 走看看