MyBatis是Apache公司開發為解決數據持久化問題的框架。
下面以maven工程為例,來介紹搭建mybatis開發環境(使用mysql數據庫)的一些細節。
要搭建mybatis環境,首先必須的是在pom.xml中配置jar的打包方式,以及mybatis和mysql-connector-java的坐標。(根據需要,增添日志或者測試的坐標)
首先介紹不使用注解方式來搭建環境。
1. 注意持久層接口的映射文件(Dao.xml)的resources路徑必須與java中持久層的接口Dao路徑相匹配,創建路徑時也必須逐層Directory,如果一次性創建,可能並不會創建分層的目錄,路徑就無法匹配。
!!!如果使用注解的方式,一定要移除對應的映射配置文件(Dao.xml)
查詢所有
IUserDao.xml中關於’查詢所有‘這個功能的配置,其關鍵路徑是由namespace的接口路徑
id是接口中定義的方法的名字,返回類型可以通過SqlMapConfig.xml中的package標簽進行簡化,不然也需要全路徑
下面是保存用戶的例子,其中#{}代表了ppst中的占位符,會自動進行java類型和jdbc類型的轉換,填充對象的數據,簡單的傳入單個參數,名稱可以為value也可以任意設置
(下下張圖備注中使用的${}表示的是拼接sql串,但不會進行jdbc類型轉換,但如果是單個參數,名稱必須為value)
注解方式:
沒有了映射文件
只需要在接口定義的方法上直接寫出sql語句:
模糊查詢
如果是模糊查詢有2種配置方式,推薦使用參數占位符的方式,字符串拼接很不安全。
你只需要在輸入參數的地方自己手動加上%就可以了。
測試類中的方法:
注解方式:
沒有了映射文件
只需要在接口定義的方法上直接寫出sql語句,對於參數的寫法使用#{}
條件查詢
mybatis可以使用條件查詢,需要在接口配置文件中進行處理
用where和if標簽去動態增添語句,通過and的sql方式去動態拼接條件。
paremeterPype參數配置
這個標簽屬性,不僅可以設置為基本類型,比如Integer、String等,還可以使用自定義的實體類(POJO)類型,比如自定義一個包裝了user的POJO類:
接口中定義方法為:
接口的配置文件中:
這個方法是遍歷了一組id,去找尋id范圍內的user
resultType參數配置
我們默認的配置,因為domain的類屬性與數據庫表中的column是一致的,所以會實現自動匹配封裝(匹配時,mysql不區分大小寫,所以單純的駝峰命名與默認配置時一致的),但是如果不一致,會無法實現封裝。
如果要自己取別名,而要其實現匹配封裝,有2種方式。
a.需要在配置的語句中自己加上別名
用as的方式,把column屬性與自己定義的名稱一一對應。
b.由於上述方式過於具體,你需要在每一個使用了 別名的方法中更改,比較麻煩,所以還可以采用定義resultMap的方式
之后把所有的resultType更改為resultMap即可
一對一查詢
有多種方式:
a.定義一個包含兩個實體所需信息的實體,那么只需要在返回數據時更改returnType為這個綜合了信息的實體即可。
b.使用resultMap去定義一對一映射的查詢的結果(使用這種方式需要在一對一中,返回類型的一的那一方去添加另一方的對象,重點是重新定義接口類的配置)
注解方式:(一個賬戶對一個用戶)
沒有了映射文件
只需要在接口定義的方法上直接寫出sql語句:
一對多查詢
一個用戶有多個賬戶,如果查詢時該用戶沒有賬戶,仍然需要將該用戶查詢出來,所以用左外連接進行查詢。
配置時,在一的一方的實體類中,添加多的一方的對象集合,並且修改配置文件
注解方式:(一個用戶對多個賬戶)
沒有了映射文件
只需要在接口定義的方法上直接寫出sql語句:
多對多查詢
用戶可以有多個角色,一個角色可以對應多個用戶
多對多其實就是雙向的一對多關系,關鍵在於sql語句比較復雜(使用中間表),仍然是在主動方的實體類中,添加被動方的對象List集合。
另一方的反過來配置即可
注解配置:
多對多就是雙向的一對多,同一對多中的配置。
延遲加載
一般在查詢數據時,對於被動方的使用不是即時性的,所以不需要使用被動方數據時就可以使用懶加載來提高性能(查詢單表比關聯查詢多表的速度快)
以一對一關系(賬戶對用戶)的例子,配置用戶延遲加載
a.使用association參數來配置延遲加載的部分
要使用還需要在SqlMapConfig.xml中添加延遲加載開啟
b.還可以直接使用以前用過的collection標簽來配置延遲加載,但是需要進行改動,使用select和column去實現新的映射
mybatis一級緩存
是SqlSession級別的緩存,只要SqlSession沒有flush或close,它就存在
需要在配置方法時添加useCache參數
只要SqlSession沒有進行flush和close,對同樣的結果集進行查詢時,只會執行一次數據庫操作,第二次查詢時不會向數據庫發出sql語句,而是直接從一級緩存中查詢。
SqlSession的修改添加刪除commit,close都會清空一級緩存。
如果SqlSession執行commit操作,這樣的目的是為了讓緩存中存儲的是最新的信息,避免臟讀。
注解方式:
其實一級緩存是默認開啟的,只是flush和close清空他,所以打開是不需要配置的。
二級緩存
是mapper映射級別的緩存,只要由同一個SqlSessionFactory創建的SqlSession都能共享緩存
需要到SqlMapConfig.xml去添加setttings設置
然后去映射文件中添加,cache標簽就代表該映射將使用二級緩存
然后還需要在具體的語句上去使用useCache標簽
測試類為:
基於注解的配置:
沒有了映射文件
但是SqlMapConfig.xml中的setting開啟也是需要進行的。
只是需要在持久層接口中,使用注解開啟二級緩存
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的形式,不過還是推薦使用配置文件)
為了方便配置,可以在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> <!--<!–type屬性指定實體類的全限定類名。alias屬性指定別名,當指定了別名就不再區分大小寫–>--> <!--<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>
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),如下
為了方便多個測試,可以使用Junit的@Before和@After方法,把資源創建和釋放分開,更便於測試mybatis的各種配置和應用(其中@After方法常常與Mybatis事務提交所組合,在釋放資源前,session.commit();其實事務開啟的開關在openSession()方法中,可設置為true or false)
最后,給上Mybatis的官方使用文檔,中文的
http://www.mybatis.org/mybatis-3/zh/getting-started.html
所有的細節設置都可以在其中學到,希望大家一起進步!