1. 程式人生 > >2.MyBatis(未完成)

2.MyBatis(未完成)

 

目錄

 

1. 初識MyBatis

1.1 優點和缺點

1.2 MyBatis主要組成

1.3 持久化與ORM

1.3.1 持久化

1.3.2 ORM(Object Relational Mapping)

2. 簡單框架搭建

2.1 核心配置檔案配置

2.2 實體類和對映檔案

2.3. 核心物件的建立

2.3.1 SqlSessionFactoryBuilder

2.3.2 SqlSessionFactory

2.3.3 SqlSession

2.3.4 SqlSession的兩種使用方式


1. 初識MyBatis

 

MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。

官方網站:http://mybatis.org

ORM框架:實體類和SQL語句之間建立對映關係

MyBatis專注於SQL本身,是一個足夠靈活的DAO層解決方案,適用於效能要求較高或者需求多變的網際網路專案

1.1 優點和缺點

優點

  • 簡單的持久化框架,小巧並簡單易學
  • 靈活, 不會對應用程式或者資料庫的現有設計強加任何影響
  • SQL語句封裝在配置檔案中,便於統一管理與維護,降低程式的耦合度
  • 提供XML標籤,支援編寫動態SQL
  • 提供對映標籤,支援物件與資料庫的ORM欄位對映
  • 提供物件關係對映標籤,支援物件關係組建維護

缺點

  • SQL語句編寫工作量大,對開發人員有一定要求
  • 資料庫移植性差

1.2 MyBatis主要組成

  • MyBatis的核心物件
    • SqlSessionFactoryBuilder(構造器)
      • SqlSessionFactory(工廠)
      • SqlSession(類似於JDBC的Connection)
      • SqlMapper(對映器)
  • 配置檔案
    • mybatis-config.xml  系統核心配置檔案
    • mapper.xml  SQL對映檔案

1.3 持久化與ORM

1.3.1 持久化

持久化是程式資料在瞬時狀態和持久狀態間轉換的過程

1.3.2 ORM(Object Relational Mapping)

編寫程式的時候,以面向物件的方式處理資料

儲存資料的時候,卻以關係型資料庫的方式儲存

ORM解決方案包含下面四個部分

  • 在持久化物件上執行基本的增、刪、改、查操作
  • 對持久化物件提供一種查詢語言或者API
  • 物件關係對映工具
  • 提供與事務物件互動、執行檢查、延遲載入以及其他優化功能

2. 簡單框架搭建

注:不是最優化方案,只是一個方便學習的例項。

  1. 下載mybatis-3.2.x.jar包並匯入工程
  2. 編寫MyBatis核心配置檔案
  3. 建立實體類-POJO
  4. DAO層-SQL對映檔案(XxxMapper.xml)
  5. 建立測試類

2.1 核心配置檔案配置

核心檔案

<?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>
	<!-- 載入外部配置檔案(常用),也可以用properties元素的子元素進行配置(不常用) -->
	<properties resource="datasource.properties"></properties>
	<!-- 設定選項,用於設定和改變MyBatis 執行中的行為 -->
	<settings>
		<!-- 日誌配置 -->
		<setting name="logImpl" value="LOG4J" />
		<!-- 設定查詢資料庫超時時間 (預設值:Not Set (null)) -->
		<setting name="defaultStatementTimeout" value="25000" />
		<!-- 指定 MyBatis 是否以及如何自動將列映 射到欄位/屬性。 PARTIAL(預設): 只是自動對映簡單、非巢狀 的結果集。 FULL: 
			將會自動對映任何複雜的(巢狀 或非巢狀)的結果集 -->
		<setting name="autoMappingBehavior" value="FULL" />

		<!-- 除了需求外,以下屬性一般無需特意配置 -->
		<!-- 全域性性地啟用或禁用所有在mapper配置檔案中配置的快取。(預設值:true) -->
		<setting name="cacheEnabled" value="true" />
		<!-- 全域性性地啟用或禁用延遲載入。當禁用時,所有關聯的配置都會立即載入。(預設值:true) -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 允許或禁止從單一的語句返回多個結果集(預設值:true) -->
		<setting name="multipleResultSetsEnabled" value="true" />
		<!-- 使用列的標籤而不是列的名稱(預設值:true) -->
		<setting name="useColumnLabel" value="true" />
		<!-- 允許JDBC自動生成主鍵(預設值:false) -->
		<setting name="useGeneratedKeys" value="false" />
		<!-- 是否啟用位元組碼增強機制 -->
		<setting name="enhancementEnabled" value="false" />
		<!-- 配置預設的執行器(executor)。 SIMPLE(預設):簡單的執行器。 REUSE :重用prepared statements的 
			執行器。 BATCH:重用 statements並且進行批量 更新的執行器。 -->
		<setting name="defaultExecutorType" value="SIMPLE" />
	</settings>
	<!-- 實體類型別名配置,減少輸入多餘的完整類名 -->
	<typeAliases>
		<!-- <typeAlias alias="Student" type="cn.kgc.pojo.Student"/> 別名匹配,比較繁瑣,不推薦使用 -->
		<!-- 包名匹配 -->
		<package name="cn.cs.pojo" />
	</typeAliases>

	<!-- 不常用配置,本例項沒有配置 -->
	<!--typeHandlers:重寫型別處理器(type handlers)後,在此配置對映 -->
	<!-- objectFactory:重寫 ObjectFactory後,在此配置對映 -->

	<!-- 外掛配置:需要時配置 -->
	<plugins>
		<!-- 分頁外掛配置 -->
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			<property name="helperDialect" value="mysql" />
		</plugin>
	</plugins>
	<!-- 執行環境配置。可以配置多個執行環境,但是每個SqlSessionFactory 例項只能選擇一個執行環境。 -->
	<environments default="development">
		<environment id="development">
			<!-- 事物管理器 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 資料來源 -->
			<dataSource type="POOLED">
				<!-- 簡單資料來源配置,詳細配置請自行百度 -->
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- SQL對映類配置,減少輸入多餘的完整類名 -->
	<mappers>
		<!-- <mapper resource="cn/kgc/dao/StudentMapper.xml"/> 全名稱匹配,不推薦使用 -->
		<!-- 包名匹配 -->
		<package name="cn.cs.dao" />
	</mappers>
</configuration>

database.properties資料庫配置

driverClassName=com.mysql.jdbc.Driver
#在和mysql傳遞資料的過程中,使用unicode編碼格式,並且字符集設定為utf-8
url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf-8
username=root
password=root

補充:

屬效能夠被可動態替換(即使用佔位符)的屬性值引用 如:${driver},引用properties配置檔案鍵後的值

2.2 實體類和對映檔案

sql對映檔案

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.kgc.dao.StudentMapper">
    <select id="getStudents" resultType="Student">
        select * from student
    </select>
    <update id="updateStu" parameterType="Student">
        update student set sName=#{sName} where id = #{id}
    </update>
    <delete id="addStu" parameterType="Student">
        insert into student(sName,age,addres) values(#{sName},#{age},#{addres})
    </delete>
    <insert id="delstu">
        delete from student where id = #{id}
    </insert>
</mapper>

實體類

public class Student {
	private int id;
	private String sName;
	private int age;
	private String addres;
	public Student() {
		super();
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getsName() {
		return sName;
	}
	public void setsName(String sName) {
		this.sName = sName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddres() {
		return addres;
	}
	public void setAddres(String addres) {
		this.addres = addres;
	}
	@Override
	public String toString() {
		return "Strudent [id=" + id + ", sName=" + sName + ", age=" + age + ", addres=" + addres + "]";
	}
	
}

  1. 實體類POJO,按照資料庫中對應表的結構編寫
  2. 對映檔案按照給定模板編寫
  3. 根元素mapper,指定namespace
  4. 當屬性名與列名不一致時,定義resultMap進行對映
  5. 定義CRUD標籤(select、insert、delete、update),編寫SQL語句
  6. 每個標籤指定id用於查詢;parameterType屬性指定引數型別;resultMap指定返回值型別

2.3. 核心物件的建立

2.3.1 SqlSessionFactoryBuilder

用過即丟,其生命週期只存在於方法體內

可重用其來建立多個 SqlSessionFactory 例項

負責構建SqlSessionFactory,並提供多個build方法的過載

2.3.2 SqlSessionFactory

SqlSessionFactory是每個MyBatis應用的核心

作用:建立SqlSession例項

作用域:Application

生命週期與應用的生命週期相同

單例:存在於整個應用執行時,並且同時只存在一個物件例項

2.3.3 SqlSession

包含了執行SQL所需的所有方法

對應一次資料庫會話,會話結束必須關閉

執行緒級別,不能共享

MybatisUtils工具類

public class MybatisUtils {
	private static SqlSessionFactory factory;
	// 在static裡,factory只會被建立一次
	static {
		try {
			// 獲取config.xml的輸入流
			InputStream is = Resources.getResourceAsStream("config.xml");
			//工廠建造器build()方法建立sqlSession 工廠
			factory = new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// 建立sqlsession
	public static SqlSession createSqlSession() {
		return factory.openSession(true); // true: 自動提交事物
	}

	// 釋放資源
	public static void close(SqlSession sqlSession) {
		if (null != sqlSession) {
			sqlSession.close();
		}
	}
}

2.3.4 SqlSession的兩種使用方式

StudentMapper介面

public interface StudentMapper {
	  //1.查詢學生表的記錄數
	  public int count();
}

 

通過SqlSession例項直接執行對映的SQL語句

@Test
public void test1() throws IOException {
    SqlSession se=null;
    se=MybatisUtils.createSqlSession();
    //通過SqlSession例項直接執行對映的SQL語句
    int count=se.selectOne("cn.kgc.dao.StudentMapper.count");
    System.out.println(count);
    MybatisUtils.close(se);
}

基於Mapper介面方式操作資料

@Test
public void test2() throws IOException {
    SqlSession se=MybatisUtils.createSqlSession();
    //基於Mapper介面方式操作資料
    int count= se.getMapper(StudentMapper.class).count();
    System.out.println(count);
    MybatisUtils.close(se);
}

注意:方式2要求Mapper介面的名稱必須和對映檔案中mapper元素的namespace屬性完全一致,方式1則無此要求;另外Mapper介面中的方法名需和對映檔案中相應元素的id屬性對應

3. 對映檔案詳解

3.1 select元素詳解

3.2 Insert、 update、 delete 元素詳解

3.3 Sql 元素

3.4 引數( Parameters )

3.5 resultMap 元素

3.5.1 高階結果對映

3.5.2 一對一

3.5.3 一對多

3.6 Cache 元素

3.7 cache-ref 元素

動態SQL