1. 程式人生 > >springboot + mybatis + gradle項目構建過程

springboot + mybatis + gradle項目構建過程

驅動 trim www. files 控制 word text monitor imp

1.從Spring boot官網根據需求下載腳手架或者到GitHub上去搜索對應的腳手架項目,D_iao ^0^

? 文件目錄如下(此處generatorConfig.xml 和 log4j2.xml文件請忽略,後續會講解)

技術分享圖片

2.使用Mybatis代碼自動構建插件生成代碼

? gradle 相關配置

// Mybatis 代碼自動生成所引入的包
compile group: ‘org.mybatis.generator‘, name: ‘mybatis-generator-core‘, version: ‘1.3.3‘

// MyBatis代碼自動生成插件工具
apply plugin: "com.arenagod.gradle.MybatisGenerator"

configurations {
    mybatisGenerator
}

mybatisGenerator {
    verbose = true
    // 配置文件路徑
    configFile = ‘src/main/resources/generatorConfig.xml‘
}

? 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>

    <!--數據庫驅動包路徑 -->
<classPathEntry <!--此驅動包路徑可在項目的包庫中找到,復制過來即可--> location="C:\Users\pc\.gradle\caches\modules-2\files-2.1\mysql\mysql-connector-java\5.1.38\dbbd7cd309ce167ec8367de4e41c63c2c8593cc5\mysql-connector-java-5.1.38.jar"/> <context id="mysql" targetRuntime="MyBatis3"
> <!--關閉註釋 --> <commentGenerator> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--數據庫連接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/xxx" userId="root" password=""> </jdbcConnection> <!--生成的model 包路徑 ,其中rootClass為model的基類,配置之後他會自動繼承該類作為基類,trimStrings會為model字串去空格--> <javaModelGenerator targetPackage="com.springboot.mybatis.demo.model" targetProject="D:/self-code/spring-boot-mybatis/spring-boot-mybatis/src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> <property name="rootClass" value="com.springboot.mybatis.demo.model.common.BaseModel"/> </javaModelGenerator> <!--生成mapper xml文件路徑 --> <sqlMapGenerator targetPackage="mapper" targetProject="D:/self-code/spring-boot-mybatis/spring-boot-mybatis/src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成的Mapper接口的路徑 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.springboot.mybatis.demo.mapper" targetProject="D:/self-code/spring-boot-mybatis/spring-boot-mybatis/src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 對應的表 這個是生成Mapper xml文件的基礎,enableCountByExample如果為true則會在xml文件中生成樣例,過於累贅所以不要--> <table tableName="tb_user" domainObjectName="User" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"></table> </context> </generatorConfiguration>

以上配置中註意targetProject路徑請填寫絕對路徑,避免錯誤,其中targetPackage是類所處的包路徑(確保包是存在的,否則無法生成),也就相當於

技術分享圖片

? 代碼生成

配置完成之後首先得在數據庫中新建對應的表,然後確保數據庫能正常訪問,最後在終端執行gradle mbGenerator或者點擊如下任務

技術分享圖片

成功之後它會生成model、mapper接口以及xml文件

3.集成日誌

? gradle 相關配置

compile group: ‘org.springframework.boot‘, name: ‘spring-boot-starter-log4j2‘, version: ‘1.4.0.RELEASE‘

// 排除沖突
configurations {
    mybatisGenerator
    compile.exclude module: ‘spring-boot-starter-logging‘
}

當沒有引入spring-boot-starter-log4j2包時會報錯:java.lang.IllegalStateException: Logback configuration error detected Logback 配置錯誤聲明

原因參考鏈接;https://blog.csdn.net/blueheart20/article/details/78111350?locationNum=5&fps=1

解決方案:排除依賴 spring-boot-starter-logging

what???

排除依賴之後使用的時候又報錯:Failed to load class "org.slf4j.impl.StaticLoggerBinder" 加載slf4j.impl.StaticLoggerBinder類失敗

原因參考鏈接:https://blog.csdn.net/lwj_199011/article/details/51853110

解決方案:添加依賴 spring-boot-starter-log4j2 此包所依賴的包如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starters</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <name>Spring Boot Log4j 2 Starter</name>
    <description>Starter for using Log4j2 for logging. An alternative to
        spring-boot-starter-logging</description>
    <url>http://projects.spring.io/spring-boot/</url>
    <organization>
        <name>Pivotal Software, Inc.</name>
        <url>http://www.spring.io</url>
    </organization>
    <properties>
        <main.basedir>${basedir}/../..</main.basedir>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
        </dependency>
    </dependencies>
</project>

它依賴了 log4j-slf4j-impl ,使用的是log4j2日誌框架

這裏涉及到log4j、logback、log4j2以及slf4j相關概念,那麽它們是啥關系呢?unbelievable...相關知識如下:

slf4j、log4j、logback、log4j2 
日誌接口(slf4j) slf4j是對所有日誌框架制定的一種規範、標準、接口,並不是一個框架的具體的實現,因為接口並不能獨立使用,需要和具體的日誌框架實現配合使用(如log4j、logback)
日誌實現(log4j、logback、log4j2) log4j是apache實現的一個開源日誌組件 logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日誌框架,是slf4j的原生實現 Log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步、等等),使得日誌的吞吐量、性能比log4j 1.x提高10倍,並解決了一些死鎖的bug,而且配置更加簡單靈活,官網地址: http://logging.apache.org/log4j/2.x/manual/configuration.html 為什麽需要日誌接口,直接使用具體的實現不就行了嗎? 接口用於定制規範,可以有多個實現,使用時是面向接口的(導入的包都是slf4j的包而不是具體某個日誌框架中的包),即直接和接口交互,不直接使用實現,所以可以任意的更換實現而不用更改代碼中的日誌相關代碼。 比如:slf4j定義了一套日誌接口,項目中使用的日誌框架是logback,開發中調用的所有接口都是slf4j的,不直接使用logback,調用是 自己的工程調用slf4j的接口,slf4j的接口去調用logback的實現,可以看到整個過程應用程序並沒有直接使用logback,當項目需要更換更加優秀的日誌框架時(如log4j2)只需要引入Log4j2的jar和Log4j2對應的配置文件即可,完全不用更改Java代碼中的日誌相關的代碼logger.info(“xxx”),也不用修改日誌相關的類的導入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)
使用日誌接口便於更換為其他日誌框架,適配器作用 log4j、logback、log4j2都是一種日誌具體實現框架,所以既可以單獨使用也可以結合slf4j一起搭配使用)

? 到此我們使用的是Log4j2日誌框架,接下來是配置log4j,具體配置詳解如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
 <!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<Configuration status="WARN">

    <!--定義一些屬性-->
    <Properties>
        <Property name="PID">????</Property>
        <Property name="LOG_PATTERN">
            [%d{yyyy-MM-dd HH:mm:ss.SSS}] - ${sys:PID} --- %c{1}: %m%n
        </Property>
    </Properties>

    <!--輸出源,用於定義日誌輸出的地方-->
    <Appenders>

        <!--輸出到控制臺-->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout
                    pattern="${LOG_PATTERN}">
            </PatternLayout>
        </Console>

        <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用-->
        <!--append為TRUE表示消息增加到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true-->
        <!--<File name="File" fileName="logs/log.log" append="false">-->
            <!--<PatternLayout>-->
                <!--<pattern>[%-5p] %d %c - %m%n</pattern>-->
            <!--</PatternLayout>-->
        <!--</File>-->

        <!--這個會打印出所有的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔 -->
        <RollingFile name="RollingAllFile" fileName="logs/all/all.log"
                     filePattern="logs/all/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout
                    pattern="${LOG_PATTERN}" />
            <Policies>
                <!--以下兩個屬性結合filePattern使用,完成周期性的log文件封存工作-->
                <!--TimeBasedTriggeringPolicy 基於時間的觸發策略,以下是它的兩個參數:
                    1.interval,integer型,指定兩次封存動作之間的時間間隔。單位:以日誌的命名精度來確定單位,比如yyyy-MM-dd-HH 單位為小時,yyyy-MM-dd-HH-mm 單位為分鐘
                    2.modulate,boolean型,說明是否對封存時間進行調制。若modulate=true,則封存時間將以0點為邊界進行偏移計算。比如,modulate=true,interval=4hours,那麽假設上次封存日誌的時間為03:00,則下次封存日誌的時間為04:00,之後的封存時間依次為08:00,12:00,16:00-->
                <!--<TimeBasedTriggeringPolicy/>-->
                <!--SizeBasedTriggeringPolicy 基於日誌文件大小的觸發策略,以下配置解釋為:
                    當單個文件達到20M後,會自動將以前的內容,先創建類似 2014-09(年-月)的目錄,然後按 "xxx-年-月-日-序號"命名,打成壓縮包-->
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
        </RollingFile>

        <!-- 添加過濾器ThresholdFilter,可以有選擇的輸出某個級別及以上的類別  onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否則直接拒絕 -->
        <RollingFile name="RollingErrorFile" fileName="logs/error/error.log"
                     filePattern="logs/error/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout
                    pattern="${LOG_PATTERN}" />
            <Policies>
                <!--<TimeBasedTriggeringPolicy/>-->
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingWarnFile" fileName="logs/warn/warn.log"
                     filePattern="logs/warn/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="${LOG_PATTERN}" />
            <Policies>
                <!--<TimeBasedTriggeringPolicy/>-->
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
        </RollingFile>

    </Appenders>

    <!--然後定義Loggers,只有定義了Logger並引入的Appender,Appender才會生效-->
    <Loggers>
        <Logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
        <Logger name="org.springframework" level="INFO" />
        <Logger name="com.springboot.mybatis.demo" level="DEBUG"/>
        <!--以上的logger會繼承Root,也就是說他們默認會輸出到Root下定義的符合條件的Appender中,若不想讓它繼承可以設置 additivity="false"
        並可以在Logger中設置 <AppenderRef ref="Console"/> 指定輸出到Console-->
        <Root level="INFO">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingAllFile"/>
            <AppenderRef ref="RollingErrorFile"/>
            <AppenderRef ref="RollingWarnFile"/>
        </Root>
    </Loggers>
</Configuration>

到此我們就算是把日誌集成進去了,可以在終端看到各種log,very exciting!!!

未完!待續。。。

springboot + mybatis + gradle項目構建過程