0120 springboot集成Mybatis和代碼生成器

在日常開(kāi)發(fā)中,數(shù)據(jù)持久技術(shù)使用的架子使用頻率最高的有3個(gè),即spring-jdbc , spring-jpa, spring-mybatis.詳情可以看我之前的一篇文章spring操作數(shù)據(jù)庫(kù)的3個(gè)架子 .

spring-jdbc封裝的比較少,需要在代碼中拼接sql,不太適合大規(guī)模的企業(yè)級(jí)別的開(kāi)發(fā)。<br />spring-jpa封裝略多,適合開(kāi)發(fā)后臺(tái)管理類的系統(tǒng),可以減少大量重復(fù)工作。

但是在當(dāng)下的互聯(lián)網(wǎng)大環(huán)境下,spring-mybatis既帶來(lái)了開(kāi)發(fā)的便捷性,也不失靈活性,特別適合性能要求高,可以靈活改變的場(chǎng)景。本篇文章大致回顧一下基于springboot的mybatis的配置開(kāi)發(fā)要點(diǎn)以及基于maven插件的代碼自動(dòng)生成。

hello, springboot集成mybatis以及代碼生成器!
<a name="wll9X"></a>

springboot集成Mybatis


springboot集成Mybatis有大把的文章,不過(guò)如果撇開(kāi)別人的觀點(diǎn),你覺(jué)得從0開(kāi)始配置,應(yīng)該有哪幾個(gè)步驟呢?

我覺(jué)得大致分為如下幾個(gè)要點(diǎn):

  1. 引入依賴,數(shù)據(jù)庫(kù)驅(qū)動(dòng),mybatis的starter;
  2. 配置數(shù)據(jù)庫(kù)連接信息,連接池信息;
  3. 配置mybatis的核心配置信息;比如entity位置,執(zhí)行器類型,xml的位置;
  4. 配置springboot的Mybatis注解,主要是開(kāi)啟支持,然后是mapper的地址;
  5. 測(cè)試啟動(dòng)成功:可以放到健康檢查里面去做;

springboot集成Mybatis的關(guān)鍵步驟:


集成完畢之后,剩下的就是使用代碼生成器,生成好常規(guī)的entity,xml,mapper, example 這些基礎(chǔ)代碼,然后結(jié)合業(yè)務(wù)邏輯,新增一些新的mapper的方法代碼;

下面跟我一起來(lái)一步一步集成springboot:

<a name="2JRqm"></a>

1 依賴

使用spring initializr創(chuàng)建項(xiàng)目,引入如下依賴:

image.png

依賴說(shuō)明如下:


<a name="jQ4Z5"></a>

2 數(shù)據(jù)源配置

數(shù)據(jù)源使用springboot默認(rèn)自帶的hikari數(shù)據(jù)源;<br />配置如下:

數(shù)據(jù)庫(kù)連接信息

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

數(shù)據(jù)連接池配置信息

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

<br />
<a name="TPrEA"></a>

3 mybatis的配置

mybatis主要是配置mapper-locations,type-alias-package,以及駝峰對(duì)應(yīng)關(guān)系,執(zhí)行器的類型等;

#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

<a name="V8bMx"></a>

4 入口@MapperScan配置

告訴應(yīng)用程序mapper接口所在的包位置,以及標(biāo)識(shí)注解。

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);
    }

}

<a name="ixsL7"></a>

5 數(shù)據(jù)庫(kù)的健康檢查

首先配置好actuator,開(kāi)放health端點(diǎn);

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

<a name="4R5RP"></a>

6 檢查數(shù)據(jù)庫(kù)連接狀態(tài)

啟動(dòng)程序, curl http://localhost:8080/actuator/health/db 可以檢查數(shù)據(jù)庫(kù)的連接狀態(tài),正常返回結(jié)果如下:

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

至此,springboot集成mybatis的步驟完成了。但是一些模板代碼,需要記憶嗎?記憶起來(lái)很痛苦應(yīng)該。所以,我們還應(yīng)該配置一下mybatis的代碼生成插件,生成好一些常用的代碼,然后在生成的代碼的基礎(chǔ)上添加一些自己的持久化的mapper方法,提供給業(yè)務(wù)層調(diào)用。

<a name="AQuPM"></a>

代碼生成器


代碼生成器,mybatis官網(wǎng)有介紹。配置分為插件配置和生成配置。本文主要通過(guò)maven的插件來(lái)進(jìn)行常規(guī)的代碼生成。

官網(wǎng)提供的代碼生成插件介紹

<a name="V11Cn"></a>

插件配置

主要使用的是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>

配置要點(diǎn)如下:


<a name="0Y3vr"></a>

生成代碼配置

主要配置幾個(gè)生成代碼的位置,mapper,entity,example,xml,以及連接的數(shù)據(jù)庫(kù)的信息。然后配置了幾個(gè)我認(rèn)為非常適用的增強(qiáng)插件。

配置代碼如下

<?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 默認(rèn)開(kāi)啟,同時(shí)插件會(huì)對(duì)子類自動(dòng)附加@EqualsAndHashCode(callSuper = true),@ToString(callSuper = true) -->
            <property name="@Data" value="true"/>
            <!-- @Builder 必須在 Lombok 版本 >= 1.18.2 的情況下開(kāi)啟,對(duì)存在繼承關(guān)系的類自動(dòng)替換成@SuperBuilder -->
            <property name="@Builder" value="true"/>
            <!-- @NoArgsConstructor 和 @AllArgsConstructor 使用規(guī)則和Lombok一致 -->
            <property name="@AllArgsConstructor" value="true"/>
            <property name="@NoArgsConstructor" value="true"/>
            <!-- @Getter、@Setter、@Accessors 等使用規(guī)則參見(jiàn)官方文檔 -->
            <property name="@Accessors(chain = true)" value="false"/>
            <!-- 臨時(shí)解決IDEA工具對(duì)@SuperBuilder的不支持問(wèn)題,開(kāi)啟后(默認(rèn)未開(kāi)啟)插件在遇到@SuperBuilder注解時(shí)會(huì)調(diào)用ModelBuilderPlugin來(lái)生成相應(yīng)的builder代碼 -->
            <property name="supportSuperBuilderForIdea" value="false"/>
        </plugin>
        <!-- Mapper注解插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.MapperAnnotationPlugin">
            <!-- @Mapper 默認(rèn)開(kāi)啟 -->
            <property name="@Mapper" value="false"/>
            <!-- @Repository 默認(rèn)關(guān)閉,開(kāi)啟后解決IDEA工具@Autowired報(bào)錯(cuò) -->
            <property name="@Repository" value="true"/>
        </plugin>
        <!-- MySQL分頁(yè)插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin">
            <!-- 通過(guò)配置startPage影響Example中的page方法開(kāi)始分頁(yè)的頁(yè)碼,默認(rèn)分頁(yè)從0開(kāi)始 -->
            <property name="startPage" value="1"/>
        </plugin>
        <plugin type="com.itfsw.mybatis.generator.plugins.ExampleTargetPlugin">
            <!-- 修改Example類生成到目標(biāo)包下 -->
            <property name="targetPackage" value="${code.base.package}.example"/>
        </plugin>
        <!-- 狀態(tài)枚舉生成插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.EnumTypeStatusPlugin">
            <!-- 是否開(kāi)啟自動(dòng)掃描根據(jù)約定注釋格式生成枚舉,默認(rèn)true  注釋[success(0):成功, fail(1):失敗]-->
            <property name="autoScan" value="true"/>
        </plugin>
        <!-- 邏輯刪除插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.LogicalDeletePlugin">
            <!-- 這里配置的是全局邏輯刪除列和邏輯刪除值,當(dāng)然在table中配置的值會(huì)覆蓋該全局配置 -->
            <!-- 邏輯刪除列類型只能為數(shù)字、字符串或者布爾類型 -->
            <property name="logicalDeleteColumn" value="deleted"/>
            <!-- 邏輯刪除-已刪除值 -->
            <property name="logicalDeleteValue" value="1"/>
            <!-- 邏輯刪除-未刪除值 -->
            <property name="logicalUnDeleteValue" value="0"/>
            <!-- 是否生成邏輯刪除常量(只有開(kāi)啟時(shí) logicalDeleteConstName、logicalUnDeleteConstName 才生效) -->
            <property name="enableLogicalDeleteConst" value="true"/>
            <!-- 邏輯刪除常量名稱,不配置默認(rèn)為 IS_DELETED -->
            <property name="logicalDeleteConstName" value="IS_DELETED"/>
            <!-- 邏輯刪除常量(未刪除)名稱,不配置默認(rèn)為 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>

此外,還把兩個(gè)信息配置外部化了。<br />jdbc.properties : 主要配置數(shù)據(jù)連接信息,父包名;

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("\n") as remark>
* ${remark}  對(duì)應(yīng)數(shù)據(jù)庫(kù)表字段: ${introspectedTable.fullyQualifiedTable}.${introspectedColumn.actualColumnName}
                </#list>
            </#if>
*/
        <#else>
        </#if>
        ]]></comment>
    <comment ID="addModelClassComment"><![CDATA[
/**
* @author: carter
* 對(duì)應(yīng)數(shù)據(jù)庫(kù)表: ${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>

**
<a name="HHZHd"></a>

小結(jié)


通過(guò)本篇文章你可以學(xué)到如下內(nèi)容:

  1. 0基礎(chǔ)為你的springboot應(yīng)用集成mybatis;
  2. 配置mybatis的代碼生成器插件,并用于生成代碼,提高工作效率;

代碼獲取點(diǎn)我!

springboot集成mybatis,配置好代碼生成插件之后,就可以有大把時(shí)間專注于業(yè)務(wù)邏輯的開(kāi)發(fā),快速的完成研發(fā)工作,有大把的時(shí)間下班回去陪娃了。該demo可以用于生產(chǎn)環(huán)境,經(jīng)過(guò)產(chǎn)品試驗(yàn)。放心使用,拿走不謝!

不管你有沒(méi)有收獲,美女還是要送的,最近在追劇,猜猜看這個(gè)美女是誰(shuí)?雞腿仙女送給你。<br />
image.png

原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容