Mybatis入門(一)
目錄
MyBatis入門
Editor:SimpleWu
MyBatis簡介
- MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
- MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
MyBatis參考資料官網
http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis下載地址
https://github.com/mybatis/mybatis-3
MyBatis的優勢
- 開源的優秀的持久層框架
- SQL語句與程式碼分離
- 面向配置的程式設計
- 良好支援複雜資料對映
- 動態SQL
MyBatis開發步驟
1.新增需要的jar包
1)mybatis-3.3.0 核心包(如果需要日誌操作,可以匯入依賴包)
2)資料庫驅動(mysql-connector-java-5.1.22-bin)
2.建立資料庫,新增測試資料
create table `tal_employee` ( `id` int (11), `last_name` varchar (360), `email` varchar (300), `gender` char (9) );
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('1','韓信','[email protected]','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('2','LiBaihH','[email protected]','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('3','孫尚香',' [email protected]','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('4','安琪拉','[email protected]','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('5','Hello','[email protected]','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('6','Miya','[email protected]','男');
3.建立實體類
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
//此處省略get set toString。。。
}
4.建立實體類對映配置檔案
<?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="EmployeeMapper">
<!-- 定義一個查詢方法 resultType 返回值型別-->
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
select * from tal_employee
</select>
</mapper>
5.建立mybatis主配置檔案
<?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>
<!-- 配置環境 default預設使用環境名字-->
<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/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 載入對映 -->
<mappers>
<mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
</mappers>
</configuration>
編寫程式碼見下文
獲取SqlSessionFactory物件
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
//讀取mybatis主配置檔案
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
/**
* 例項化SqlSessionFactory
* 如果沒有指定預設環境,可以在這裡指定使用的環境ID,比如我先在有個DEV環境
* sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"DEV");
* 我這裡已經使用了預設環境所以我就不用這種方式建立了
*/
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
訪問資料庫
獲取SqlSession物件,作用於與資料庫的一次回話作用於與資料庫的一次回話
SqlSession session = sqlSessionFactory.openSession();
獲取所有員工記錄
EmployeeMapper就是我們實體類對映檔案的名稱空間,findAll就是我們select標籤的ID
List<Employee> employees = session.selectList("EmployeeMapper.findAll");
for (Employee employee : employees) {
System.out.println(employee);
}
訪問結果:
Employee [id=1, lastName=null, [email protected], gender=男]
Employee [id=2, lastName=null, [email protected], gender=男]
Employee [id=3, lastName=null, [email protected], gender=女]
Employee [id=4, lastName=null, [email protected], gender=女]
Employee [id=5, lastName=null, [email protected], gender=男]
Employee [id=6, lastName=null, [email protected], gender=男]
在這裡我們訪問資料庫是正常的,為什麼lastName為空呢?
解決表字段與類屬性名不對應
原因:應為我們這裡實體類上的屬性叫做lastName與資料庫列last_name名字不對應所以獲取的值為空
解決方案1:將實體類對映檔案的中select標籤中的取別名
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
select id,last_name AS lastName,email,gender from tal_employee
</select>
解決方案2:在mybatis主配置檔案中配置駝峰式命名,需要將配置排在前面否則XML報錯
<settings>
<!-- 開啟駝峰式命名規則 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
使用方案2我們類中屬性lastName會匹配資料庫欄位last_name
使用日誌檢視SQL語句等
首先我們需要新增mybatis依賴包
新增log4j.properties
#設定輸出級別和輸出位置
log4j.rootLogger=debug,Console
#設定控制檯相關的引數
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#設定MyBatis的輸出內容
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
這樣我們就可以使用log4j來檢視我們的sql語句啊,傳入的引數啊。。等等
MyBatis的配置檔案
- 通過前面簡單的MyBatis案例,大家應該瞭解到了MyBatis框架的基本結構,和Hibernate一樣,MyBatis包含了一個核心配置檔案和對映檔案。
- 核心配置檔案(mybatis-config.xml):包含了對Mybatis的核心配置,包含連線池資訊,事務,載入對映檔案,引數設定等配置。
- 對映檔案(EmployeeMapper.xml):主要實現實體物件對資料庫的對映,關聯關係,Sql語句等。
核心配置檔案
標籤 | 說明 |
---|---|
配置環境 | |
一些外部屬性,這些屬性可以被替換 | |
Mybatis中極為重要的調整設定,會改變Mybatis的預設行為。 | |
為Java型別設定一個別名,它只和xml配置有關。 | |
對映器,載入MyBatis的對映檔案。 | |
外掛,Mybatis允許使用者在對映的某一點進行攔截。 |
環境配置
- Mybatis可以通過配置多種環境,比如開發環境、測試環境和生產環境等。
- 不過要記住,儘管可以配置多個環境,但是SqlSessionFactory物件只能載入一個。如果你需要同時連線多個數據庫,需要建立多個SqlSessionFactory例項。
事務管理
在 MyBatis 來進行事務的設定,其中有兩種型別的事務管理器。
- JDBC:這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務範圍。
- MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 因為 Spring 模組會使用自帶的管理器來覆蓋前面的配置。
資料來源
使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。有三種資料來源型別
- UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
- POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來, 避免了建立新的連線例項時所必需的初始化和認證時間。
- JNDI:使用JNDI在外部配置資料來源。
properties標籤
properties為外部屬性,比如資料庫連線資訊可以配置到一個單獨的properties檔案中,然後在xml中進行引入。
新增一個db.properties檔案
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
在mybatis主配置檔案中引用
<properties resource="db.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<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>
對映器
通常MyBatis中將對映關係(非必須)和SQL語句寫入到對映檔案中,在配置檔案中需要手動進行載入對映檔案。載入對映檔案使用進行載入。Mybatis中有4種載入方式。
1.使用resource,載入classpath路徑進行載入。
<mappers>
<mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml"/>
</mappers>
2.使用url路徑進行載入。
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
3.使用calss進行載入,註解方式。
<!– 載入class類-->
<mappers>
<mapper class="使用註解的全類名"/>
</mappers>
4.使用package進行載入,註解方式。
<!– 載入某個包下的所有class檔案-->
<mappers>
<package name="com.simple.mybatis.entitys"/>
</mappers>
別名的使用
之前,我們在sql對映xml檔案中的引用實體類時,resultType需要寫上實體類的全類名(包名+類名),如下:
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
select id,last_name AS lastName,email,gender from tal_employee
</select>
在mybatis主配置檔案中加入
<typeAliases>
<typeAlias type=“com.simple.mybatis.entitys.Employee" alias="Employee"/>
</typeAliases>
這樣在resultType中就可以直接使用Employee型別了。這個別名是不區分大小寫的。