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','韓信','hanxin@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('2','LiBaihH','libai@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('3','孫尚香','sunshangxiang@gemail.com','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('4','安琪拉','anqila@gemail.com','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('5','Hello','Hello@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('6','Miya','Miya@gemail.com','男');
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=hanxin@gemail.com, gender=男]
Employee [id=2, lastName=null, email=libai@gemail.com, gender=男]
Employee [id=3, lastName=null, email=sunshangxiang@gemail.com, gender=女]
Employee [id=4, lastName=null, email=anqila@gemail.com, gender=女]
Employee [id=5, lastName=null, email=Hello@gemail.com, gender=男]
Employee [id=6, lastName=null, email=Miya@gemail.com, 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語句寫入到映射文件中,在配置文件中需要手動進行加載映射文件。加載映射文件使用
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類型了。這個別名是不區分大小寫的。