1. 程式人生 > >11、MyBatis-generator-Maven方式

11、MyBatis-generator-Maven方式

mave 覆蓋 推薦 exce record sage cef 關聯 兩個

配置依賴

依賴信息 pom.xml

<?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> <groupId>mybatis</groupId> <artifactId>generator</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</
artifactId> <version>8.0.15</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version
> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.0</version> </dependency> </dependencies> <properties> <configuration.path>${basedir}/src/main/resources/generatorConfig.xml</configuration.path> </properties> <build> <plugins> <!-- 指定jdk --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.7</version> <configuration> <!-- 允許移動生成的文件 --> <verbose>true</verbose> <!-- 允許覆蓋生成的文件 --> <overwrite>true</overwrite> <!-- 配置文件中的 contexts --> <contexts>DMySQLTables</contexts> <!-- 配置文件路徑 --> <configurationFile>${configuration.path}</configurationFile> <!-- MBG 生成文件的目錄。只要配置文件中 targetProject 設置為 MAVEN(區分大小寫),就會使用此目錄,如果該目錄不存在會創建該目錄 --> <outputDirectory>${project.build.directory}/generated-sources/mybatis-generator</outputDirectory> <!-- 為 true,則“compile”,“provided”和“system”範圍的依賴項將添加到生成器的類路徑中 --> <includeCompileDependencies>true</includeCompileDependencies> <!-- 為true,則將任何範圍的依賴項添加到生成器的類路徑中 --> <includeAllDependencies>true</includeAllDependencies> </configuration> </plugin> </plugins> <resources> <!-- 把xml文件也打包到相應位置 --> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project>

數據庫信息 db.properties

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://192.168.8.136:3306/mybatis

generator 配置 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>
    <!-- 指定DB2或JDBC驅動位置 -->
    <!--<classPathEntry location="D:\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar"/>-->

    <!--加載配置文件-->
    <properties resource="db.properties"/>

    <!-- context:一組環境
        id:必選,唯一標識符,用於在生成錯誤時提示
        defaultModelType:指定生成 JavaBean 的模式
            conditional:默認,類似於層次模型,表只包含一個字段時不會生成單獨的類,該字段將合並到基本記錄類中。
            flat:所有字段生成在一個 JavaBean 中
            hierarchical:主鍵列會生成主鍵類,Blob 列也單獨生成一個類,再其余字段一個類,類之間存在適當的繼承關系。
        targetRuntime:
            MyBatis3:默認的值,生成基於 MyBatis3.x 以上版本的內容,包括XXXBySample
            MyBatis3Simple:類似 MyBatis3,不生成 XXXBySample
            MyBatis3DynamicSql、Ibatis2Java2、Ibatis2Java5
        introspectedColumnImpl:值為類的全限定名,用於擴展 MBG -->
    <context id="DMySQLTables" defaultModelType="conditional" targetRuntime="MyBatis3">
        <!--默認false,為true將分隔SQL關鍵字(如果它們在表中用作列名)。 MBG維護了不同數據庫的SQL關鍵字列表(SqlReservedWords),如特定關鍵字不在MBG的列表中,可使用<columnOverride>分隔-->
        <property name="autoDelimitKeywords" value="false"/>

        <!-- 指明數據庫的用於標記數據庫對象名的符號,如ORACLE是雙引號",MYSQL是反引號` -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 生成 Java 文件的編碼格式,有關有效編碼的信息參閱 java.nio.charset.Charset -->
        <property name="javaFileEncoding" value="UTF-8"/>

        <!-- Java代碼格式化程序的全類名,該類須實現org.mybatis.generator.api.JavaFormatter,並有無參數構造函數,MBG 默認 org.mybatis.generator.api.dom.DefaultJavaFormatter -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- XML代碼格式化,須實現org.mybatis.generator.api.XmlFormatter,並有無參數構造函數,MBG 默認 org.mybatis.generator.api.dom.DefaultXmlFormatter -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <commentGenerator>
            <!-- 指定 MBG 是否將在生成的代碼中包含任何 coments -->
            <property name="suppressAllComments" value="true" />
            <!-- 指定 MBG 是否將在生成的註釋中包含生成時間戳 -->
            <property name="suppressDate" value="true"/>
        </commentGenerator>


        <!-- 指定數據庫連接的屬性,MBG 使用 JDBC 的 DatabaseMetaData 類來發現配置中指定表的屬性, 每個 context 元素都需要一個 connectionFactory 或 jdbcConnection 元素 -->
        <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.jdbcUrl}" userId="${jdbc.user}" password="${jdbc.password}"/>


        <!-- javaTypeResolver:處理數據庫中的類型到 Java 中的類型,默認使用 org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl
                type:指定用戶提供的 Java Type Resolver。該類必須實現 org.mybatis.generator.api.JavaTypeResolver 接口,並必須有公共默認構造函數。可寫 DEFAULT-->
        <javaTypeResolver type="DEFAULT">
            <!-- forceBigDecimals:MBG 是否強制對 DECIMAL 和 NUMERIC 字段使用 java.math.BigDecimal,而不是在可能時替換整數類型
                    true:如果數據庫列的類型為 DECIMAL 或 NUMERIC,則 Java 類型解析程序將始終使用 java.math.BigDecimal
                    false:默認,
                        scale > 0 或 length > 18 使用 BigDecimal
                        scale = 0 且 length [10,18] 使用 Long
                        scale = 0 且 length [5,9] 使用 Integer
                        scale = 0 且 length < 5 使用 Short -->
            <property name="forceBigDecimals" value="false"/>

            <!-- useJSR310Types:指定 MyBatis Generator 是否應強制在 DATE,TIME 和 TIMESTAMP 字段中使用 JSR-310 數據類型,而不是使用 java.util.Date
                    true:則類型將按如下方式解析:
                        DATE    java.time.LocalDate
                        TIME    java.time.LocalTime
                        TIMESTAMP    java.time.LocalDateTime
                註意:類型解析器將始終解析以下JSR-310類型,無論此屬性的值如何:
                    TIME_WITH_TIMEZONE    java.time.OffsetTime
                    TIMESTAMP_WITH_TIMEZONE    java.time.OffsetDateTime -->
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>


        <!-- javaModelGenerator:Java模型生成器,此元素是 context 元素的必需子元素,負責:1,key類(見context的defaultModelType);2,java類;3,查詢類
            targetPackage:生成的類將被放置的包,真實的包受 enableSubPackages 屬性控制
            targetProject:目標項目,指定一個存在的本地文件系統目錄,生成的內容會放到指定目錄中,如果目錄不存在,MBG 不會自動建目錄 -->
        <javaModelGenerator targetPackage="test.model" targetProject="src/main/java">
            <!-- constructorBased:是否為每一個生成的類創建一個全參構造方法,且構建 SQL 結果映射以使用構造函數,而不是每個字段的“setter”,屬性僅適用於MyBatis3。
                如果“immutable”屬性設置為 true,則忽略此屬性(並強制為 true)。默認值為 false。<table>元素中的相應屬性可覆蓋此屬性 -->
            <property name="constructorBased" value="false"/>

            <!-- enableSubPackages:是否在 targetPackage 的基礎上,根據數據庫的 schema 再生成一層 package,最終生成的類放在這個 package 下,默認為false
                假設 MYSCHMA 中的表為 MYTABLE,targetPackage 屬性為“com.mycompany”。如果此屬性為true,則類放在“com.mycompany.myschema”中。 false,則類放在“com.mycompany” -->
            <property name="enableSubPackages" value="false"/>

            <!-- immutable:是否創建不可變類,默認 false,如果為true,MBG 會創建一個全參構造方法,類沒有“setter”方法,忽略“constructorBased”屬性
                屬性僅適用於MyBatis3,<table>元素中的相應屬性可以覆蓋此屬性。-->
            <property name="immutable" value="false"/>

            <!-- rootClass:設置一個根對象(全類名),生成的 keyClass 或者 recordClass 會繼承這個類;在Table的rootClass屬性中可以覆蓋該選項
                 註意:如果在key class或者record class中有root class相同的屬性,MBG就不會重新生成這些屬性了 -->
            <!--<property name="rootClass" value=""/>-->

            <!-- trimStrings:設置是否在getter方法中,對String類型字段調用trim()方法,默認false。可以使用<table>或<columnOverride>元素中的trimStrings屬性覆蓋。 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- sqlMapGenerator:SQL Map的XML文件生成器,如果指定sqlMapGenerator,MBG 生成SQL映射XML文件和模型classess。如果未指定sqlMapGenerator,則僅生成模型類。
            在Mybatis3之後,我們可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),或者使用 Mapper 接口加 Annotation,所以,如果 javaClientGenerator 配置中配置了需要生成 XML 的話,這個元素就必須配置
            targetPackage/targetProject:同 javaModelGenerator -->
        <sqlMapGenerator targetPackage="test.xml" targetProject="src/main/java">
            <!-- 同 javaModelGenerator 中的 enableSubPackages-->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>


        <!-- javaClientGenerator:即生成 Mapper 接口,如果沒有配置該元素,那麽默認不會生成 Mapper 接口
            targetPackage/targetProject:同javaModelGenerator
            type:Java客戶端生成器,指定用戶提供的Java客戶端生成器。用戶提供的 DAO 生成器必須擴展 org.mybatis.generator.codegen.AbstractJavaClientGenerator 類,並且必須具有公共默認構造函數。
                如果 <context> targetRuntime 是 MyBatis3
                    1,ANNOTATEDMAPPER:會生成使用Mapper接口+Annotation的方式創建(SQL生成在annotation中),不會生成對應的XML
                    2,MIXEDMAPPER:使用混合配置,會生成Mapper接口,並適當添加合適的Annotation,但是XML會生成在XML中
                    3,XMLMAPPER:會生成Mapper接口,接口完全依賴XML
                如果 <context> targetRuntime 是 MyBatis3Simple
                    ANNOTATEDMAPPER/XMLMAPPER
                如果 <context> targetRuntime 是 Ibatis2Java2 或 Ibatis2Java5
                    IBATIS/GENERIC-CI/GENERIC-SI/SPRING
            implementationPackage:如果指定,實現類將放在此包中 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="src/main/java" implementationPackage="test.dao">
            <!-- enableSubPackages:控制實際包路徑的計算方式
                    true,則計算的包將是表的目錄和模式的 implementationPackage 加子包(如果存在)
                    false(默認值),則計算的包將與implementationPackage屬性中指定的完全相同。 MBG 將根據生成的包創建文件夾 -->
            <property name="enableSubPackages" value="false"/>

            <!-- exampleMethodVisibility:設置不同“ByExample”方法的可見性 - selectByExample,deleteByExample等。不指定,方法將是公共的,並在界面中聲明
                    public 默認值:實現類中生成的方法將是public,並且將在接口中聲明方法
                    private:實現類中生成的方法將是私有的,並且不會在接口中聲明方法
                    protected:實現類中生成的方法將受到保護,並且不會在接口中聲明方法
                    default:實現類中生成的方法將具有默認(包)可見性,並且不會在接口中聲明方法
                如果目標運行時為 MyBatis3,則忽略此屬性 -->
            <property name="exampleMethodVisibility" value="public"/>

            <!-- methodNameCalculator:選擇方法名稱計算器。方法名稱計算器可用於為 DAO 方法提供不同的名稱。可以選擇預定義值,也可以指定實現 org.mybatis.generator.api.DAOMethodNameCalculator 接口類的全類名
                    default 默認值:生成的方法名稱將非常簡單(“insert”,“updateByPrimaryKey”等)
                    extended:生成的方法名稱將包含與方法關聯的域對象的名稱(“insertWidget”,“updateWidgetByPrimaryKey”等)
                如果目標運行時為MyBatis3,則忽略此屬性。-->
            <property name="methodNameCalculator" value="default"/>

            <!-- rootInterface:為所有生成的接口對象指定超級接口。 可以通過在Table配置上指定rootInterface屬性來覆蓋此值
                MBG不驗證接口是否存在,或者是否是有效的Java接口。屬性的值為全類名 -->
            <!--<property name="rootInterface" value=""/>-->

            <!--true,則帶註釋的客戶端將使用 MyBatis 中的 SqlBuilder 生成動態SQL。使用 MyBatis 3.2 及更高版本時,不推薦使用該構建器以支持新的SQL類。
                false,MBG 將生成使用新 SQL 構建器的客戶端。默認 false -->
            <property name="useLegacyBuilder" value="false"/>
        </javaClientGenerator>

        <!-- 指定要逆向分析哪些表,根據表創建 javaBean -->
        <table tableName="dept" domainObjectName="Dept"/>
    </context>
</generatorConfiguration>

運行

技術分享圖片

使用

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 外部 properties 配置文件  -->
    <properties resource="db.properties"/>

    <!--  settings包含很多重要的設置項,setting:用來設置每一個設置項。name:設置項名,value:設置項取值 -->
    <settings>
        <!-- 開啟全局二級緩存 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 本地(一級)緩存作用域,默認 SESSION,會緩存一個會話(SqlSession)中執行的所有查詢。 設置為 STATEMENT,會話僅作用在語句執行上,對 SqlSession 的調用將不會共享數據,可認為是禁用一級緩存 -->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 控制臺打印SQL -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

    <!-- typeAliases:別名處理器:可以為我們的java類型起別名,別名不區分大小寫 -->
    <typeAliases>
        <!-- typeAlias:為某個java類型起別名,type:指定要起別名的類型全類名;默認別名就是類名小寫,alias:指定新的別名 -->
         <!--<typeAlias type="com.bean.MyUser" alias="myUser"/>-->
        <!-- package:為某個包下的所有類批量起別名,name:指定包名,為當前包以及下面所有的後代包的每一個類都起一個默認別名(類名小寫) -->
        <package name="test.model"/>
        <!-- 批量起別名的情況下,可以在 Bean 上使用 @Alias 註解為某個類指定新的別名 -->
    </typeAliases>

    <!-- environments:環境配置,default 指定使用某種環境
            environment:配置一個具體的環境信息;必須有兩個標簽;id代表當前環境的唯一標識
                transactionManager:事務管理器
                type:事務管理器的類型 JDBC(JdbcTransactionFactory) | MANAGED(ManagedTransactionFactory)自定義事務管理器:實現 TransactionFactory 接口,type 為全類名
                dataSource:數據源
                    type:數據源類型 UNPOOLED(UnpooledDataSourceFactory) | POOLED(PooledDataSourceFactory)| JNDI(JndiDataSourceFactory)
                    自定義數據源:實現 DataSourceFactory 接口,type 為全類名
        配置註冊類:org.apache.ibatis.session.Configuration -->
    <environments default="development-mysql">
        <environment id="development-mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.8.136:3306/mybatis?allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <environment id="development-oracle">
            <transactionManager type="MANAGED"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- databaseIdProvider:支持多數據庫廠商;
        type="DB_VENDOR":VendorDatabaseIdProvider 作用就是得到數據庫廠商的標識(getDatabaseProductName()),mybatis就能根據數據庫廠商標識來執行不同的 SQL -->
    <databaseIdProvider type="DB_VENDOR">
        <!-- 為不同的數據庫廠商起別名 -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>

    <!-- mappers:將 SQL 映射文件註冊到全局配置中 -->
    <mappers>
        <!-- 引用類路徑下的 SQL 映射文件 -->
        <mapper resource="test/xml/DeptMapper.xml"/>

        <!-- 引用網路路徑或者磁盤路徑下的sql映射文件 -->
        <!--<mapper url="file:///var/mappers/AuthorMapper.xml"/>-->

        <!-- 引用 Class 接口註冊,沒有 SQL 映射文件,所有的 SQL 都是利用註解寫在接口上 -->
        <!--<mapper class="com.dao.MyUserMapperAnnotation"/>-->

        <!-- 批量註冊,有 SQL 映射文件,映射文件名必須和接口同名,並且放在與接口同一目錄下 -->
        <!--<package name="test.xml"/>-->
    </mappers>
</configuration>

測試方法

public static void main(String[] args) throws IOException {
    SqlSession session = null;
    try {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        session = sqlSessionFactory.openSession();
        DeptMapper mapper = session.getMapper(DeptMapper.class);

        // 查詢所有
        System.out.println(mapper.selectByExample(null));

        // 條件查詢
        DeptExample deptExample = new DeptExample();
        DeptExample.Criteria criteria = deptExample.createCriteria();
        criteria.andIdEqualTo(1);
        System.out.println(mapper.selectByExample(deptExample));
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

技術分享圖片


官方配置文檔

https://www.cnblogs.com/ygjlch/p/6471924.html

xxxExample類的使用

https://blog.csdn.net/biandous/article/details/65630783

11、MyBatis-generator-Maven方式