Mybatis框架的主要做用是讓程序的主要精力都放在sql上,經過my提供的映射,半自動化的生成sql操做數據。經過想PrepareStatement中輸入的參數自動進行輸入映射,將結果集ResultSet映射成java對象做爲輸出映射。html
1、Mybatis運行流程及相關核心類 java
一、SqlMapConfig.xml是Mybatis的全局配置文件,相似於Hibernate中的hibernate.cfg.xml,主要用於配置數據源、事務、加載實體mapper.xml配置文件(同上圖Config.xml)mysql
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理,事務控制由mybatis管理 --> <transactionManager type="JDBC" /> <!-- 數據庫鏈接池 ,由mybatis管理 --> <dataSource type="POOLED"> <property name ="driver" value ="com.mysql.jdbc.Driver" /> <property name ="url" value ="jdbc:mysql://127.0.0.1:3306/mybatisdemo?characterEncoding=utf-8"/> <property name ="username" value ="root" /> <property name ="password" value ="dannyhoo" /> </dataSource> </environment> </environments> <!-- 使用resource方式加載映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers> </configuration>
二、SqlSessionFactory:會話工廠 是每個MyBatis Application必有的,根據config配置文件建立,它主要用於建立Sqlsession會話,由sqlSessionBuilder經過new 的方式建立,SessionFatoryBuider可直接看成一個工具類使用,不須要使用單例進行管理,而由它建立的SqlSessionFactory是最好經過單例模式來建立,保證工廠一旦建立一次,就使用一個SqlSessionFactory實例。而且SqlSessionFactory的做用範圍是應用程序級的,在一個application中可僅有一個SqlSessionFactory,因此用單例控制SqlSessionFactory的建立。sql
三、Sqlsession:會話工廠建立出Sqlsession會話後,回話方可執行DB操做,執行sql語句、事務控制等,執行後可commit提交到數據庫;SqlSession的做用範圍和生命週期須要開發人員特別注意,由於它不是線程安全的,除了操做方法以外,還有數據屬性。因此它的做用範圍最好界定到方法級別,定義爲方法的局部變量,也就是一個方法獨有一個SqlSession實例。數據庫
Exucutor:Mybatis在Sqlsession中提供了Exucutor類(執行器),是SqlSession用於執行sql操做數據庫的接口類apache
Mapped Statement:另外Mapped Statement是底層封裝對象,對操做數據庫的參數進行封裝,包括sql語句、輸入參數、輸出參數緩存
一、properties session
1)以JDBC爲例,若是將上面datasource屬性靈活可配置,例如換一個數據庫鏈接,可將value參數值以${}變量的形式傳入mybatis
抽象db.properties文件以下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/max?characterEncoding=utf-8
jdbc.username=rootjdbc.password=123456
修改datasource 標籤,同時在SqlMapConfig.xml中加載db.properties文件
<properties resouce=」db.properties」/>
.................
<dataSource type="POOLED">
<property name ="driver" value ="${jdbc.dirver}" />
<property name ="url" value ="${jdbc.url"/>
<property name ="username" value ="${jdbc.username}" />
<property name ="password" value ="${jdbc.password}" />
</dataSource>
2)配置讀取優先級問題
若是在db中有一個username參數,同時,在user實體的mapper映射中也有一個username參數,則my存在一個讀取配置優先級問題,properties元素體內定義的屬性優先於properties元素中的resource或url加載的屬性,最後讀取parameterType傳遞的屬性。若是出現同屬性名,則後面讀取的屬性值會覆蓋前面已經讀取的相同屬性名的值。
針對這個問題,首先保證properties resource加載的文件中屬性名具備必定特殊性,如jdbc.username;其次,不要再properties元素體內添加其餘屬性值,均將它定義到.properties文件中,統一加載。
二、settings
Mybatis的全局配置參數,用於添加延遲加載、緩存配置信息。後面詳細介紹
三、aliase
別名的使用場景也很是普遍,例如在輸入、輸出映射中,若是輸入pojo類型,則須要填寫這個pojo的全路徑,這時能夠把這些pojo類使用別名標記,簡化開發;
1)自定義別名
<typeAliases> <typeAliase type=」cn.max.po.User」 alias=」user」/> </typeAliases>在resultType中引用別名
<!-- 查詢--> <select id="findUserById" parameterType="int" resultType="user"> select * from user where id=#{id} </select>
<typeAliases> <!--自動掃描包中的類,爲每個類定義別名,別名==類名--> <package name=」cn.max.po」/> <package name=」cn.max.server」/> <package name=」cn.max.en」/> </typeAliases>
Mybatis自動提供多中類型處理器,主要用於處理輸入、輸出映射、參數java類型和jdbc數據類型的映射。、
五、mapper映射
1)經過resouce加載單個pojo映射文件
<mapper resource="mapper/UserMapper.xml"/>
2)經過mapper接口class加載
<mapper class=」cn.max.po.UserMapper」/>
經過class加載的好處在於能夠直接寫到包名,如class=「cn.max.po」,則po包下的全部mapper.java接口都會被加載,但這要求mapper.java接口和mapper.xml配置文件在同一目錄下且名稱一致,經過mapper代理可找到該映射信息。
3)經過url加載
<mapper url=」file:///d:\work\map\User.xml」/>-本地全路徑