Mybatis總結(mybatis plus待更新)


MyBatis是Apache公司開發為解決數據持久化問題的框架。

下面以maven工程為例,來介紹搭建mybatis開發環境(使用mysql數據庫)的一些細節。

要搭建mybatis環境,首先必須的是在pom.xml中配置jar的打包方式,以及mybatis和mysql-connector-java的坐標。(根據需要,增添日志或者測試的坐標)

首先介紹不使用注解方式來搭建環境。

1. 注意持久層接口的映射文件(Dao.xml)的resources路徑必須與java中持久層的接口Dao路徑相匹配,創建路徑時也必須逐層Directory,如果一次性創建,可能並不會創建分層的目錄,路徑就無法匹配。

!!!如果使用注解的方式,一定要移除對應的映射配置文件(Dao.xml)

image

 

查詢所有

IUserDao.xml中關於’查詢所有‘這個功能的配置,其關鍵路徑是由namespace的接口路徑

id是接口中定義的方法的名字,返回類型可以通過SqlMapConfig.xml中的package標簽進行簡化,不然也需要全路徑

image

下面是保存用戶的例子,其中#{}代表了ppst中的占位符,會自動進行java類型和jdbc類型的轉換,填充對象的數據,簡單的傳入單個參數,名稱可以為value也可以任意設置

(下下張圖備注中使用的${}表示的是拼接sql串,但不會進行jdbc類型轉換,但如果是單個參數,名稱必須為value)

image

注解方式:

沒有了映射文件

只需要在接口定義的方法上直接寫出sql語句:

image

 

 

模糊查詢

如果是模糊查詢有2種配置方式,推薦使用參數占位符的方式,字符串拼接很不安全。

image

你只需要在輸入參數的地方自己手動加上%就可以了。

接口中定義的方法:image[16]

測試類中的方法:

image

注解方式:

沒有了映射文件

只需要在接口定義的方法上直接寫出sql語句,對於參數的寫法使用#{}

image

 

條件查詢

image

mybatis可以使用條件查詢,需要在接口配置文件中進行處理

image

用where和if標簽去動態增添語句,通過and的sql方式去動態拼接條件。

 

paremeterPype參數配置

這個標簽屬性,不僅可以設置為基本類型,比如Integer、String等,還可以使用自定義的實體類(POJO)類型,比如自定義一個包裝了user的POJO類:

image

接口中定義方法為:

image

接口的配置文件中:

image

這個方法是遍歷了一組id,去找尋id范圍內的user

image

 

resultType參數配置

我們默認的配置,因為domain的類屬性與數據庫表中的column是一致的,所以會實現自動匹配封裝(匹配時,mysql不區分大小寫,所以單純的駝峰命名與默認配置時一致的),但是如果不一致,會無法實現封裝。

如果要自己取別名,而要其實現匹配封裝,有2種方式。

a.需要在配置的語句中自己加上別名

image

用as的方式,把column屬性與自己定義的名稱一一對應。

b.由於上述方式過於具體,你需要在每一個使用了 別名的方法中更改,比較麻煩,所以還可以采用定義resultMap的方式

image

之后把所有的resultType更改為resultMap即可

image

 

一對一查詢

有多種方式:

a.定義一個包含兩個實體所需信息的實體,那么只需要在返回數據時更改returnType為這個綜合了信息的實體即可。

b.使用resultMap去定義一對一映射的查詢的結果(使用這種方式需要在一對一中,返回類型的一的那一方去添加另一方的對象,重點是重新定義接口類的配置)

image

注解方式:(一個賬戶對一個用戶)

沒有了映射文件

只需要在接口定義的方法上直接寫出sql語句:

image

 

一對多查詢

一個用戶有多個賬戶,如果查詢時該用戶沒有賬戶,仍然需要將該用戶查詢出來,所以用左外連接進行查詢。

配置時,在一的一方的實體類中,添加多的一方的對象集合,並且修改配置文件

image

注解方式:(一個用戶對多個賬戶)

沒有了映射文件

只需要在接口定義的方法上直接寫出sql語句:

image

 

多對多查詢

用戶可以有多個角色,一個角色可以對應多個用戶

多對多其實就是雙向的一對多關系,關鍵在於sql語句比較復雜(使用中間表),仍然是在主動方的實體類中,添加被動方的對象List集合。

image

image

另一方的反過來配置即可

image

image

注解配置:

多對多就是雙向的一對多,同一對多中的配置。

 

延遲加載

一般在查詢數據時,對於被動方的使用不是即時性的,所以不需要使用被動方數據時就可以使用懶加載來提高性能(查詢單表比關聯查詢多表的速度快)

以一對一關系(賬戶對用戶)的例子,配置用戶延遲加載

a.使用association參數來配置延遲加載的部分

image

要使用還需要在SqlMapConfig.xml中添加延遲加載開啟

image

b.還可以直接使用以前用過的collection標簽來配置延遲加載,但是需要進行改動,使用select和column去實現新的映射

image

 

mybatis一級緩存

是SqlSession級別的緩存,只要SqlSession沒有flush或close,它就存在

需要在配置方法時添加useCache參數

image

只要SqlSession沒有進行flush和close,對同樣的結果集進行查詢時,只會執行一次數據庫操作,第二次查詢時不會向數據庫發出sql語句,而是直接從一級緩存中查詢。

SqlSession的修改添加刪除commit,close都會清空一級緩存。

如果SqlSession執行commit操作,這樣的目的是為了讓緩存中存儲的是最新的信息,避免臟讀。

注解方式:

其實一級緩存是默認開啟的,只是flush和close清空他,所以打開是不需要配置的。

 

二級緩存

是mapper映射級別的緩存,只要由同一個SqlSessionFactory創建的SqlSession都能共享緩存

需要到SqlMapConfig.xml去添加setttings設置

image

然后去映射文件中添加,cache標簽就代表該映射將使用二級緩存

image

然后還需要在具體的語句上去使用useCache標簽

image

測試類為:

image

基於注解的配置:

沒有了映射文件

但是SqlMapConfig.xml中的setting開啟也是需要進行的。

只是需要在持久層接口中,使用注解開啟二級緩存

image

 

2. resources根目錄下的SqlMapConfig.xml配置文件

一般頭部是默認的mybatis的config約束

<?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的配置細節已經在下面的代碼中全部加上了備注

其中配置連接池的數據的信息,需要引入jdbcConfig.properties(也可以直接指定,寫在properties中,以name value的形式,不過還是推薦使用配置文件)

image

為了方便配置,可以在typeAliases和mappers中使用package標簽,實現實體類的別名指定和接口映射文件的路徑指定。(typeAliases使用package是批量的別名定義,會掃描包下的所有類,必須銀蛇文件名稱相同,且放在同一個目錄中。也可以用typeAlias去細節定義)

 

SqlMapConfig.xml屬性配置

<configuration>
    <!--配置properties
        可以在標簽內部配置連接數據庫的信息,也可以通過屬性引用外部配置文件信息
        resource屬性
            用於指定配置文件的位置,按照類路徑的寫法來寫,必須存在於類路徑下
        url屬性
            是要求按照url的寫法來寫地址
            URL:Uniform Resource Locator 統一資源定位符。它可以唯一地表示一個資源的位置
            like:http://localhost:8080/StoreV5/Servlet
                 協議    主機      端口  URI
            URI:Uniform Resource Identifier 統一資源標識符。它可以在應用中惟一的定位一個資源
    -->
    <properties
            url="file:///D:/WorkSpace/IDEAworkspace/mybatis_base/mybatis_dao/src/main/resources/jdbcConfig.properties"/>
    <!--<properties resource="jdbcConfig.properties"/>-->
    <!--使用typeAliases配置別名,它只能配置domain中類的別名-->
    <typeAliases>
        <!--&lt;!&ndash;type屬性指定實體類的全限定類名。alias屬性指定別名,當指定了別名就不再區分大小寫&ndash;&gt;-->
        <!--<typeAlias type="com.lky.domain.User" alias="user"/>-->

        <!--用於指定要配置別名的包,當指定之后,該包下的實體類都會這冊別名(類名,不區分大小寫)-->
        <package name="com.lky.domain"/>
    </typeAliases>
    <!--配置環境-->
    <environments default="mysql55">
        <!--配置mysql55環境-->
        <environment id="mysql55">
            <!--配置事務-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置連接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射文件位置-->
    <mappers>
        <!--<mapper resource="com/lky/dao/IUserDao.xml"/>-->

        <!--package標簽用於指定dao接口所在的包,當指定了之后就不需要再寫mapper以及resource或者class了-->
        <package name="com.lky.dao"/>
    </mappers>
</configuration>

image

MyBatis 在初始化時, 根據<dataSource>的 type 屬性來創建相應類型的的數據源 DataSource,即:
type=”POOLED”: MyBatis 會創建 PooledDataSource 實例
type=”UNPOOLED” : MyBatis 會創建 UnpooledDataSource 實例
type=”JNDI”: MyBatis 會從 JNDI 服務上查找 DataSource 實例,然后返回使用

 

配置完pom.xml,接口的映射文件Dao.xml,總的配置文件SqlMapConfig.xml,和個人的數據庫連接參數jdbcConfig.properties之后,就可以使用mybatis了。

 

使用mybatis的步驟(簡單的從數據庫查詢所有User),如下

image

為了方便多個測試,可以使用Junit的@Before和@After方法,把資源創建和釋放分開,更便於測試mybatis的各種配置和應用(其中@After方法常常與Mybatis事務提交所組合,在釋放資源前,session.commit();其實事務開啟的開關在openSession()方法中,可設置為true or false)

 

最后,給上Mybatis的官方使用文檔,中文的

http://www.mybatis.org/mybatis-3/zh/getting-started.html

所有的細節設置都可以在其中學到,希望大家一起進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM