MyBatis(一) 入門

z1340954953發表於2018-07-03

ORM模型

java中的物件和資料庫中的表建立對映關係,通過pojo物件能夠訪問到資料庫中的表,而且資料庫的中表能

對映為pojo物件。

Hibernate缺點

* 做為全表對映框架,比如更新時候需要傳送所有的欄位更新

* 無法根據不同的條件組裝不同的SQL

* 多表關聯的查詢支援較差,並不支援儲存過程呼叫

* 雖然有HQL,但效能較差。大型網際網路系統需要優化SQL,而hibernate做不到。

MyBatis

為了解決Hibernate的不足,一個半自動對映的框架產生。mybatis的對映檔案包含以下三個部分

* SQL

* 對映規則

* PJO

MyBatis的基本構成

MyBatis的核心元件

* SqlSessionFactoryBuilder(構造器): 它會根據配置資訊或者程式碼來生成SqlSessionFactory(工廠介面)

* SqlSessionFactory: 依靠工廠來生成SqlSession(會話)。

* SqlSession: 是一個既可以傳送SQL去執行並返回結果,也可以獲取Mapper的介面

* SQL Mapper: 它是MyBatis新設計的元件,由一個Java介面和XML檔案構成,需要給出對應的SQL和對映規則。

負責傳送SQL去執行,並返回出結果。

構建SqlSessionFactory

每個MyBatis的應用都是以SqlSessionFactory的例項為中心的,SqlSessionFactory的例項可以通過

SqlSessionFactoryBuilder獲得,SqlSessionFactory是一個工程介面而不是一個實現類,它的任務是建立

SqlSession.SqlSession類似於一個JDBC的Connection物件。

Configuration類物件中存放配置了Mybatis的資訊,在MyBatis中提供了兩個實現類,DefaultSQLSessionFactory(預設使用)和SqlSessionManager


* 使用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">
      <!-- 採用JDBC的事務管理方式 -->
      <transactionManager type="JDBC"/>
      <!-- 配置資料庫的連結資訊 -->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 定義對映器,引入的xml檔案的作用是,提供了SQL和SQL對POJO的對映規則定義,
       它包含了對映器裡面的資訊,Mybatis將會為我們解析這個xml生成對映器
   -->
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

可以自己建立一個流讀取xml檔案,交給builder

public static SqlSessionFactory getSqlSessionFactory(){
		InputStream input = null;
		SqlSessionFactory factory = null;
		try {
			input = Resources.getResourceAsStream("mybatis-config.xml");
			factory = new SqlSessionFactoryBuilder().build(input);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return factory;
	}

實際上,MyBatis解析程式將會將這個配置檔案讀取到configuration物件中,然後利用sqlsessionfactorybuilder讀取這個物件來建立

SQLSessionFactory。

*  使用程式碼的方式進行構建(不建議)

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

構建SqlSession

類似於jdbc的Connection的物件,SqlSession是一個介面類,真正執行的是Executor介面,SqlSession只是接受資訊並返回結果。

SqlSession session = null;
try{
	session = factory.openSession();
	//some code ...
	session.commit();
}catch(Exception e){
	e.printStackTrace();
	session.rollback();
}finally{
	//確保資源被關閉
	if(session!=null){
		session.close();
	}
}
對映器

對映器是由Java介面和XML檔案(或者註解),它的作用如下:

* 定義引數型別

* 描述快取

* 描述SQL語句

* 定義查詢結果和pojo對映關係

xml建立

1. 建立介面

public interface StudentService {
	public Student queryStudentInfo(Integer id);
}

2. 建立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="cn.bing.mapper.StudentMapper">
  <select id="queryStudentInfo" resultType="student">
    select stu_id as stuId,stu_age as stuAge,stu_sex as stuSex,stu_name as stuName 
    from student_info where stu_id = #{id}
  </select>
</mapper>

*  namespace的值,必須和定義的介面的全限定名一致

* id 表示介面的方法名,resultType表示返回的資料型別,可以是物件的全限定名或者是別名

在mybatis-config.xml中定義別名,上面的就可以改為resultType= "Student"

<!-- 定義別名 -->
  <typeAliases>
  	<typeAlias alias="Student" type="cn.bing.pojo.Student"/>
  </typeAliases>

* parameterType:定義傳入引數的型別

* 定義的pojo,必須符合javaBean的規範

* SQL列的列名和pojo的屬性名保持一致,就會將結果對映到屬性上,在這裡都是使用了和pojo物件屬性相同的別名

生命週期

1. SqlSessionFactoryBuilder

builder負責利用讀取的xml檔案資訊來構建SqlSessionFactory,一旦構建完畢就可以回收,因而它的生命週期只是存在方法的區域性,作用只是用來建立factory物件。

2. SqlSessionFactory

SqlSessionFactory的作用就是建立SqlSession,而SqlSession就是一個會話,每次訪問資料庫都需要通過SqlSessionFactory來建立SqlSession,因而SqlSessionFactory是存在MyBatis的整個生命週期內的,並且SqlSessionFactory的建立設計為單例的

3. SqlSession

SqlSession是一個會話,生命週期是資料庫的一個事務請求過程中,而且每次使用完畢,都必須關閉,如前面在finally中關閉。

4. Mapper

Mapper是一個介面,它的作用就是傳送SQL,然後返回我們需要的結果。因而它的生命週期在一個SqlSession的事務方法之內,最大的範圍和SqlSession一致。當SqlSession銷燬的時候,對應的Mapper也會去銷燬



相關文章