1. 程式人生 > >MyBatis入門案例及全域性配置檔案

MyBatis入門案例及全域性配置檔案

簡介

1. 什麼是 MyBatis ?

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

2. Mybatis架構

  1. MyBatis配置
    • mybatis.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊

    • mapper.xml檔案即sql對映檔案
      ,檔案中配置了操作資料庫的sql語句。此檔案需要在SqlMapConfig.xml中對映載入
  2. 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠

  3. 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行

  4. mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器,一個是快取執行器。
  5. Mapped Statement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個Mapped Statement物件,sql的id即是Mapped statement的id。

  6. Mapped Statement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是jdbc程式設計中對preparedStatement設定引數。

  7. Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本型別、pojo,Executor

下載jar包地址https://github.com/mybatis/mybatis-3

官方文件地址http://www.mybatis.org/mybatis-3/zh/index.html

 

一、簡單入門例項 :MyBatis3.4.6  

要使用 MyBatis, 只需將 mybatis-x.x.x.jar 檔案置於 classpath 中即可。

這裡使用 Maven 來構建專案,則需引入依賴即可:

1、pom.xml中引入 mybatis 依賴 

	<dependencies>
<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>
<!-- mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.46</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
	</dependencies>

日誌檔案:log4j.properties

log4j.rootLogger = debug,stdout, D
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p %m%n
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ./log4j.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d %p %m%n

資源配置檔案:application.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_demo?useUnicode=true&characterEncoding=utf8&useSSL=true
jdbc.user=root
jdbc.password=123456

2、新建mybatis的全域性配置檔案mybatis.xml (官方文件入門部分有demo,複製)

<?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>
	<!-- 1. 匯入資原始檔 -->
	<properties resource="application.properties"></properties>
	<settings>
		<!-- 開啟自動駝峰命名規則對映,即從經典資料庫列名 A_COLUMN 到POJO類屬性名 aColumn的類似對映。 -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>	

 	<!-- 2. 配置資料庫的連線環境(default為id的值),即預設載入的資料庫環境	 -->
	<environments default="mysql">
		<environment id="mysql"> 		<!-- 配置具體的資料庫環境    id唯一	 -->
			<transactionManager type="JDBC" />  <!-- 指定使用的事務處理管理器 -->
			<dataSource type="POOLED">  	<!-- 指定使用的資料來源連線池		 -->
				<property name="driver" value="${jdbc.driverClass}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.user}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 3. 引入mapper對映檔案 -->
	<mappers>
		<mapper resource="cn/jq/mybatis/dao/UserMapper.xml" />
	</mappers>
</configuration>

3、建立POJO物件和Dao類

model類: User

public class User {
	private int id;
	private String username;
	private String pazzword;
	private Integer state; //0:禁用,1:正常
	private Date regDate; //使用者註冊時間
...
}

Dao介面: UserMapper

public interface UserMapper {
	/**
	 * 根據id獲取一條記錄
	 */
	public User getUser(Integer id);
}

4、 新建mybatis的sql對映檔案(官方文件入門部分有demo,複製),即將Dao層介面中的方法和該檔案中的標籤對映

<?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">

<!-- namespace - 名稱空間對應介面的全限定名 -->  
<mapper namespace="cn.jq.mybatis.dao.UserMapper">
	<!-- id - 對應介面中的方法 名稱
  	     resultType - 從這條語句中返回的期望型別的類的完全限定名或別名
   -->
	<!-- <select id="getUser" resultType="u"> -->
	<select id="getUser" resultType="cn.jq.mybatis.model.User">
		select * from t_user where id = #{id}
	</select>
</mapper>

5、新建測試方法

public class MybatisTest {
	@Test
	public void test() throws IOException {
		//1. 建立SqlSessionFacotry工廠類物件,根據讀取全域性配置檔案
                Resources.setCharset(Charset.forName("utf-8"));//設定編碼格式
		InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//2. 開啟資料庫連線會話
		SqlSession session = sqlSessionFactory.openSession();
		
		try {
			//3.通過會話操作sql 返回的是代理物件 jdk動態代理
			UserMapper userMapper = session.getMapper(UserMapper.class);
			//4.呼叫查詢一條記錄的方法
			User user = userMapper.getUser(1);
			System.out.println(user);
		} finally {
			//關閉會話
			session.close();
		}		
	}
}

User [id=1, username=admin, pazzword=172eee54aa664e9dd0536b063796e54e, state=1, regDate=Sun Oct 14 00:00:00 CST 2018]

  

注意:POJO類的屬性名和資料表的欄位名不一致時,不要使用*號,通過別名來建立關聯(不推薦)

mybatis 使用 <settings> 標籤的mapUnderscoreToCamelCase引數來配置

 

二、MyBatis 的全域性配置檔案:mybatis.xml

MyBatis 的配置檔案包含了會深深影響 MyBatis 行為的設定(settings)和屬性(properties)資訊。文件的頂層結構如下:

1、properties :主要作用是讀取外面的properties屬性檔案

注意:瞭解一下即可,因為在專案和spring整合時,資料來源是要交個spring管理的,所有肯定不會用這個配置的

2、settings:詳細引數見官方文件

這是 MyBatis 中極為重要的調整設定,它們會改變 MyBatis 的執行時行為。下表描述了設定中各項的意圖、預設值等。

mapUnderscoreToCamelCase 是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。 true | false False

一個配置完整的 settings 元素的示例如下:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

3、typeAliases

類型別名是為 Java 型別設定一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減少類完全限定名的冗餘。

 1)全域性對映檔案

	<typeAliases>
		<!-- 配置別名 
			type - 原來的型別名
			name - 別名 	 -->
		<typeAlias type="cn.jq.mybatis.model.User" alias="uu"/> 
		<!-- 定義一個包 
			在沒有註解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 若有註解,則別名為其註解值 -->
		<package name="cn.jq.mybatis.model"/>
	</typeAliases>

 2)sql對映檔案

<mapper namespace="cn.jq.mybatis.dao.UserMapper">
<!-- 	<select id="getUser" resultType="u11">  -->
	<select id="getUser" resultType="uu"> 
		select * from t_user where id = #{id}
	</select>
</mapper>

 3)POJO類

@Alias("u11")
public class User {
...}

注意:Mybatis已經為一些常見的 Java 型別內建的相應的類型別名。它們都是大小寫不敏感的,我們的別名不能和它們重複

4、配置環境(environments:瞭解

MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同的 SQL 對映。許多類似的用例。

不過要記住:儘管可以配置多個環境,每個 SqlSessionFactory 例項只能選擇其一

環境元素environment定義瞭如何配置環境。

 1)事務管理器(transactionManager

在 MyBatis 中有兩種型別的事務管理器(也就是 type=”[JDBC|MANAGED]”):

  • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
  • MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。

 2)資料來源(dataSource

dataSource 元素使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。

  • 許多 MyBatis 的應用程式會按示例中的例子來配置資料來源。雖然這是可選的,但為了使用延遲載入,資料來源是必須配置的。

有三種內建的資料來源型別(也就是 type=”[UNPOOLED|POOLED|JNDI]”):

UNPOOLED– 這個資料來源的實現只是每次被請求時開啟和關閉連線。雖然有點慢,但對於在資料庫連線可用性方面沒有太高要求的簡單應用程式來說,是一個很好的選擇。 不同的資料庫在效能方面的表現也是不一樣的,對於某些資料庫來說,使用連線池並不重要,這個配置就很適合這種情形。

POOLED– 這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來,避免了建立新的連線例項時所必需的初始化和認證時間。 這是一種使得併發 Web 應用快速響應請求的流行處理方式。

JNDI – 這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。

注意: 在專案和spring整合時,資料來源是要交個spring管理的,比如c3p0

5、對映器(mappers

既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 對映語句了。但是首先我們需要告訴 MyBatis 到哪裡去找到這些語句。 Java 在自動查詢這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裡去找對映檔案。你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。

1)使用相對於類路徑的資源引用

	<mappers>
		<mapper resource="cn/jq/mybatis/dao/UserMapper.xml" />
	</mappers>

2)使用對映器介面實現類的完全限定類名

	<mappers>
		<mapper class="cn.jq.mybatis.dao.UserMapper" />
	</mappers>

注意:使用class屬性來講mapper檔案注入到全部配置檔案裡,就必須保證mapper的檔名和介面的檔名一樣,只是字尾不一樣,且必須都在一個包目錄裡才ok。

使用class屬性來配置,還可以使用註解的方式來關聯sql語句,不需要寫UserDao.xml,只需要在介面的方法上使用註解@Select

public interface UserMapper {
	@Select("select * from t_user where id = #{id}")
	public User getUser(Integer id);
}

在專案開發中,註解上的sql往往是比較簡單的和不怎麼會修改的,才會使用註解,因為打包釋出後,java檔案是不能修改的,比較複雜和重要的,可能會修改的sql語句,放到xml配置檔案裡,這樣便於以後維護,兩者配合使用。

 3)將包內的對映器介面實現全部註冊為對映器(推薦使用

	<mappers>
		<package name="cn.jq.mybatis.dao" /> 
	</mappers>

注意:xml檔案和介面必須同名,且在同一個包裡才得行!或者介面和xml檔案不在同一個包,必須新建一個資原始檔夾,並在新建一個和介面類所在的包名,一樣的包,xml檔案和介面同名,把xml檔案放這裡,就可以搞定!視覺上號上不在一起,但釋出後在classes這個類路徑下看到還是在同一個包裡的。

 

xml全域性配置檔案 就說到這裡, 一般配置好之後,不會修改該檔案。