MyBatis的前身叫iBatis,本是apache的一個開源項目, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis。MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成數據庫中的記錄。java
Mybatis的功能架構分爲三層mysql
1) API接口層:提供給外部使用的接口API,開發人員經過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。sql
2) 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操做。數據庫
3) 基礎支撐層:負責最基礎的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來做爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。apache
如今來看看三個重要的類
緩存
SqlSessionFactoryBuilder安全
每個MyBatis的應用程序的入口是SqlSessionFactoryBuilder,它的做用是經過XML配置文件建立Configuration對象(固然也能夠在程序中自行建立),而後經過build方法建立SqlSessionFactory對象。沒有必要每次訪問Mybatis就建立一次SqlSessionFactoryBuilder,一般的作法是建立一個全局的對象就能夠了。session
SqlSessionFactorymybatis
SqlSessionFactory對象由SqlSessionFactoryBuilder建立。它的主要功能是建立SqlSession對象,和SqlSessionFactoryBuilder對象同樣,沒有必要每次訪問Mybatis就建立一次SqlSessionFactory,一般的作法是建立一個全局的對象就能夠了。SqlSessionFactory對象一個必要的屬性是Configuration對象,它是保存Mybatis全局配置的一個配置對象,一般由SqlSessionFactoryBuilder從XML配置文件建立架構
SqlSession
SqlSession對象的主要功能是完成一次數據庫的訪問和結果的映射,它相似於數據庫的session概念,因爲不是線程安全的,因此SqlSession對象的做用域需限制方法內。SqlSession的默認實現類是DefaultSqlSession,它有兩個必須配置的屬性:Configuration和Executor。Configuration前文已經描述這裏再也不多說。SqlSession對數據庫的操做都是經過Executor來完成的,Executor的具體功能在下一小節在描述。
到目前爲止,咱們看到的都是mybatis的流程,咱們的應用程序在什麼地方插入到這個流程中並得到咱們想要的結果呢?就是SqlSession這裏。SqlSession有一個重要的方法getMapper,顧名思義,這個方式是用來獲取Mapper對象的。什麼是Mapper對象?根據Mybatis的官方手冊,應用程序除了要初始並啓動Mybatis以外,還須要定義一些接口,接口裏定義訪問數據庫的方法,存放接口的包路徑下須要放置同名的XML配置文件。SqlSession的getMapper方法是聯繫應用程序和Mybatis紐帶,應用程序訪問getMapper時,Mybatis會根據傳入的接口類型和對應的XML配置文件生成一個代理對象,這個代理對象就叫Mapper對象。應用程序得到Mapper對象後,就應該經過這個Mapper對象來訪問Mybatis的SqlSession對象,這樣就達到裏插入到Mybatis流程的目的
package org.heinrich.app; import java.io.Reader; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.heinrich.app.dao.IUserDao; import org.heinrich.app.domain.User; public class MyBatisTest { public static void main(String[] args) throws Exception { Reader reader = Resources.getResourceAsReader("MyBatisConfig.xml");//獲取資源文件 //建立sqlSessionFactoy對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //獲取並打開session SqlSession openSession = sqlSessionFactory.openSession(); IUserDao mapper = openSession.getMapper(IUserDao.class); List<User> all = mapper.getAll(); System.out.println(all); } }
上面就是用到三個最爲重要的類
如今配置兩個重要的文件MyBatisConfig.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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/fk_test" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="org/heinrich/app/dao/userMapper.xml"/> </mappers> </configuration>
userMaper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.heinrich.app.dao.IUserDao"> </mapper>
一個很是重要的接口,對應的是IUserDao對應的是userMapper.xml文件,一個表對應一個mapper.xml文件
package org.heinrich.app.dao; import java.util.List; import org.apache.ibatis.annotations.Select; import org.heinrich.app.domain.User; public interface IUserDao { @Select("SELECT* from user") public List<User> getAll(); }
上面用annotation註解方式
package org.heinrich.app; import java.io.Reader; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.heinrich.app.dao.IUserDao; import org.heinrich.app.domain.User; public class MyBatisTest { public static void main(String[] args) throws Exception { Reader reader = Resources.getResourceAsReader("MyBatisConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession openSession = sqlSessionFactory.openSession(); IUserDao mapper = openSession.getMapper(IUserDao.class); List<User> all = mapper.getAll(); System.out.println(all); } }
一個簡單的mybatis就搞定了
打印的值[org.heinrich.app.domain.User@54f45574, org.heinrich.app.domain.User@75165e3e]