mybatics細(xì)節(jié)問(wèn)題

最近在學(xué)習(xí)基于springboot的SSM項(xiàng)目的后臺(tái)程序,期間遇到很多問(wèn)題,也解決很多問(wèn)題,簡(jiǎn)單介紹下。

1 mybatics genatator

對(duì)于 mybatics genatator是mybatics為了簡(jiǎn)化工作量,根據(jù)數(shù)據(jù)庫(kù)表自動(dòng)映射出mapper.xml文件,POJO實(shí)體類和DAO層類,減少了很多工作量。介紹mybatics genatator的使用文章很多。這里介紹一個(gè)介紹很詳細(xì)的博客地址:https://blog.csdn.net/testcs_dn/article/details/79295065
構(gòu)建步驟有很多需要注意的地方:

  1. 大多數(shù)項(xiàng)目使用很主流的版本管理器maven構(gòu)建,網(wǎng)上很多介紹在引入mybatics genatator時(shí)候,寫的不全。具體POM的插件項(xiàng)配置如下:
            <!--mybatis逆向生產(chǎn)-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <configurationFile>src/main/resources/Mybatics/GenerateConfig</configurationFile>
                    <overwrite>true</overwrite> <!--是否在運(yùn)行時(shí)候重寫POJO和配置文件-->
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.16</version> <!--即使在上面的依賴已經(jīng)添加了mysql-connector-java
                                                    也必須再次添加,而且必須加版本號(hào),版本號(hào)去包里找-->
                    </dependency>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.6</version> <!--核心依賴庫(kù),最好添加上,注意版本對(duì)應(yīng)-->
                    </dependency>
                </dependencies>
            </plugin>
  1. 接著就是配置GenerateConfig.xml,這里面的配置項(xiàng)很多,每個(gè)屬性的詳解見(jiàn)以上的鏈接。它分為總體配置和對(duì)每個(gè)表的單獨(dú)配置。總體配置如下:
<generatorConfiguration>
    <context id="Mysql"  defaultModelType="flat">

        <!-- 是否去除自動(dòng)生成的注釋 true:是 : false:否 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="false"/>
        </commentGenerator>

        <!--數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)類,URL,用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/數(shù)據(jù)庫(kù)名稱?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"
                        userId="用戶"
                        password="密碼">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成(實(shí)體)模型的包名和位置-->
        <javaModelGenerator targetPackage="oil.oil_test.POJO" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成XML映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="Mybatics.Mapper" targetProject="src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO接口的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="oil.oil_test.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
  1. 對(duì)于表的配置。最好按照小編的配置,tableName是列名,domainObjectName是根據(jù)該表生成的實(shí)體的名稱。很多false選項(xiàng)是指把自動(dòng)生成的SQL語(yǔ)言給除去掉(寫的亂,不如自己寫)。useActualColumnNames是指按照數(shù)據(jù)每張表里的列名,生成實(shí)體類里的屬性名,詳細(xì)解釋見(jiàn)鏈接里。
       <table tableName="apply_table" domainObjectName="Apply"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false" enableInsert="false">
            <property name="useActualColumnNames" value="true"/>
        </table>

小編就是在這里遇到的問(wèn)題,遇到了數(shù)據(jù)庫(kù)表生成的實(shí)體對(duì)應(yīng)屬性不對(duì),莫名其妙多了一些屬性,有一些實(shí)體就少了一些屬性。估計(jì)是mybatics genatator映射到其他表去了,但是原因一直找不到。摸索很久,找到解決辦法:1.建立數(shù)據(jù)庫(kù)的時(shí)候,表名后面加些后綴(例如:_table)等等,如果把用戶表直接寫user,很可能出錯(cuò),因?yàn)槲铱春笈_(tái)仿佛mybatics genatator找表的時(shí)候,貌似是SQL里的模糊查詢方式。2,數(shù)據(jù)庫(kù)的列名,最好按照javabean規(guī)則,寫成駝峰樣子(如:userName,userPassword),注意首字母不要大寫。

2 mybatics聯(lián)表查詢

大家肯定遇到過(guò)需要查詢數(shù)據(jù)庫(kù)里某幾張表聯(lián)合起來(lái)的結(jié)果,比如把學(xué)生表的信息和學(xué)生所在班級(jí)的信息聯(lián)合查詢并顯示(因?yàn)閿?shù)據(jù)庫(kù)搭建時(shí),學(xué)生表里只會(huì)存一個(gè)班級(jí)的唯一ID,不會(huì)存關(guān)于這個(gè)班級(jí)的其余信息),所以我們要使用聯(lián)合查詢。這點(diǎn)不同于hibernate,因?yàn)槲覀兛梢宰约簩慡QL語(yǔ)句。這里介紹步驟如下:
1 建立對(duì)應(yīng)的POJO類。有很多人嫌麻煩,不肯建立,真有那么煩么?這里推薦一個(gè)做法,比如要顯示學(xué)生(包括班級(jí),愛(ài)好的所有信息)直接新建一個(gè)類,繼承學(xué)生類,在private引入班級(jí)類和愛(ài)好類就完事了。如下:

public class UserAll extends User {
    private Class  userClass;
    private Favourate favourate;
    然后get與set。。。
}

2.對(duì)應(yīng)mapper里的.xml怎么寫也很方便,把幾個(gè)類的mapper里自動(dòng)生成的基本resultmap拼在一起就好了。
注意兩個(gè)關(guān)鍵字就行:association是一對(duì)一連接的,collection是一對(duì)多連接的。

<!--column不做限制,可以為任意表的字段,而property須為type 定義的pojo屬性-->
<resultMap id="唯一的標(biāo)識(shí)" type="映射的pojo對(duì)象">
  <id column="表的主鍵字段,或者可以為查詢語(yǔ)句中的別名字段" jdbcType="字段類型" property="映射pojo對(duì)象的主鍵屬性" />
  <result column="表的一個(gè)字段(可以為任意表的一個(gè)字段)" jdbcType="字段類型" property="映射到pojo對(duì)象的一個(gè)屬性(須為type定義的pojo對(duì)象中的一個(gè)屬性)"/>
  <association property="pojo的一個(gè)對(duì)象屬性" javaType="pojo關(guān)聯(lián)的pojo對(duì)象">
    <id column="關(guān)聯(lián)pojo對(duì)象對(duì)應(yīng)表的主鍵字段" jdbcType="字段類型" property="關(guān)聯(lián)pojo對(duì)象的主席屬性"/>
    <result  column="任意表的字段" jdbcType="字段類型" property="關(guān)聯(lián)pojo對(duì)象的屬性"/>
  </association>
  <!-- 集合中的property須為oftype定義的pojo對(duì)象的屬性-->
  <collection property="pojo的集合屬性" ofType="集合中的pojo對(duì)象">
    <id column="集合中pojo對(duì)象對(duì)應(yīng)的表的主鍵字段" jdbcType="字段類型" property="集合中pojo對(duì)象的主鍵屬性" />
    <result column="可以為任意表的字段" jdbcType="字段類型" property="集合中的pojo對(duì)象的屬性" />  
  </collection>
</resultMap>

3.接下來(lái)就是SQL語(yǔ)句,使用左右拼接的方式(left join)


image.png
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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