最近抽空學(xué)習(xí)了Mybatis這個(gè)框架,在學(xué)習(xí)的過程中也找了很多的文章,個(gè)人感覺官網(wǎng)上的東西太多太雜,不適合許多希望一步步快速上手的朋友們,當(dāng)然覺得查閱問題的時(shí)候可以直接通過官網(wǎng)找還比較快或者是StackOverflow,鑒于此原因把自己想把自己學(xué)習(xí)過程中的經(jīng)驗(yàn)留作筆記以供分享參考之用,盡量少繞彎路。因?yàn)橄胫苯恿私釳ybatis的使用方式,而網(wǎng)上有許多學(xué)習(xí)文章是Mybatis與Spring的結(jié)合范例,或者說直接在Web Project項(xiàng)目下創(chuàng)立的范例,感覺對于只是純粹想了解那個(gè)東西怎么使用的朋友應(yīng)該不需要那么多附加的條件,所以本系列中直接用最簡單的Java Project作范例演示。
什么是Mybatis,前身iBatis(個(gè)人沒用過,所以沒什么發(fā)言權(quán)),引述官網(wǎng)的原意來說,Mybatis是支持普通SQL查詢,可以更簡單直接的操作SQL,存儲過程和高級映射的一種優(yōu)秀的持久層框架,使用它基本可以消除所有的JDBC大麥和參數(shù)的手工設(shè)置以及結(jié)果集的檢索,其實(shí)個(gè)人使用下來感覺,其實(shí)主要工作都是在配置XML或者注解上,然后將接口和Java的POJO(普通Java對象映射成數(shù)據(jù)庫的記錄),個(gè)人沒用過Java的Hb,所以對于兩者之間的差異性也沒權(quán)限發(fā)表意見,我相信各個(gè)事物的產(chǎn)生總有它自己的目的。
這段時(shí)間學(xué)習(xí)下來,其實(shí)對Mybatis來說主要的過程無法是以下幾步
1. 從XML配置文件中獲取SessionFactory,然后由SessionFactory產(chǎn)生相應(yīng)的Session。
2. 是用Session對象對業(yè)務(wù)數(shù)據(jù)完成相應(yīng)的CRUD操作(增刪改查)和相應(yīng)的事務(wù)控制。
3. 使用完畢后關(guān)閉相應(yīng)的Session,以免過度占用資源
4. 使用配置相應(yīng)的Mapper xml文件進(jìn)行業(yè)務(wù)實(shí)體的JavaBean與數(shù)據(jù)庫表之間做相應(yīng)的Map操作
戰(zhàn)前準(zhǔn)備:
1. 開發(fā)環(huán)境Eclipse JavaEE IDE,JDK 1.6,數(shù)據(jù)庫mysql 5.5
2. 下載相應(yīng)Jar包,以備后用
mybatis-3.2.3.zip 解壓后拿出 mybatis-3.2.3.jar,=> 下載地址: http://code.google.com/p/mybatis/ (Mybatis核心包)
mybatis-generator-core-1.3.1.jar => 下載地址: http://code.google.com/p/mybatis/wiki/Generator (Mybatis自動生成配置文件包)
mysql-connector-java-5.1.26-bin.jar => 下載地址:http://dev.mysql.com/downloads/connector/j/ (Mysql 的jdbc驅(qū)動包)
接下來大家可以再Eclipse下面建一個(gè)名為MybatisDemo的Java Project項(xiàng)目,按照如下圖中所示新建相應(yīng)的包結(jié)構(gòu)和文件夾結(jié)構(gòu),其中config與mapper分別為文件夾,
包david.mybatis.demo與包david.mybatis.model下分別存放相應(yīng)的demo運(yùn)行程序與Javabean對象,lib文件夾下存放剛剛下載的那幾個(gè)第三方j(luò)ar包。

建完下面的目錄,我們可以添加相應(yīng)的Jar包,如下圖


完成后,執(zhí)行下面SQL,建立DEMO所需的表結(jié)構(gòu),分別有3張表,Visitor(訪問者表),Website(網(wǎng)站表),Channel(頻道表)

建表SQL
/*創(chuàng)建Visitor*/
CREATE TABLE Visitor
(
Id INT(11) NOT NULL AUTO_INCREMENT,
Name VARCHAR(1000) NOT NULL,
Email VARCHAR(1000) NOT NULL,
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime,
PRIMARY KEY(Id)
)
/*創(chuàng)建網(wǎng)站表*/
CREATE TABLE Website
(
Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(1000) NOT NULL,
VisitorId INT REFERENCES Visitor(Id),
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime
)
/*創(chuàng)建頻道表*/
CREATE TABLE Channel
(
Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(1000) NOT NULL,
WebsiteId INT REFERENCES Website(Id),
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime
)
所有這些都完成后,我們就要開始動手啦~
就像開頭說的,Mybatis的所有配置都源于一份XML配置文件,我們需要在config文件夾下,新建名為mybatis_demo_config.xml的配置文件,這一份東西就是我們后面所需要操作的核心之一。
在配置這個(gè)文件千萬要注意<configuration>節(jié)點(diǎn)內(nèi)的元素都是有層級順序的要求的,不能夠隨意更換次序,否則在加載xml配置文件的時(shí)候會出現(xiàn)異常而導(dǎo)致后續(xù)操作不成功。
具體的節(jié)點(diǎn)說明大家可以查看http://mybatis.github.io/mybatis-3/zh/configuration.html#,這里只說比較常用的節(jié)點(diǎn),typeAliases,environments,mappers。
1. typeAliases => 別名節(jié)點(diǎn),可以通過設(shè)置這個(gè)節(jié)點(diǎn)的屬性,這樣配置文件中其他需要實(shí)體名字的地方都可以使用此別名而不是完全限定名,例如 <typeAlias type="david.mybatis.model.Visitor" alias="Visitor" />
2. environments => 環(huán)境節(jié)點(diǎn),配置數(shù)據(jù)連接相關(guān)的信息
3. mappers => 配置SQL映射語句。
最簡單的配置如下:

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>
<typeAliases>
<typeAlias type="david.mybatis.model.Visitor" alias="Visitor" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- ?useUnicode=true&characterEncoding=utf8為了支持中文數(shù)據(jù)的寫入 -->
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/mybatis_db?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/VisitorMapper.xml" />
</mappers>
</configuration>
在包david.mybatis.demo下面新建一個(gè)名為MyBatisUtils類,里面存放獲取SqlSession與關(guān)閉SqlSession的方法,提煉出來方便多次復(fù)用。

MybatisUtils類
package david.mybatis.demo;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import david.mybatis.model.CRUD_Enum;
public class MybatisUtils {
private static final String CONFIG_PATH = "config/mybatis_demo_config.xml";
/*
* 獲取數(shù)據(jù)庫訪問鏈接
*/
public static SqlSession getSqlSession() {
SqlSession session = null;
try {
InputStream stream = Resources.getResourceAsStream(CONFIG_PATH);
//可以根據(jù)配置的相應(yīng)環(huán)境讀取相應(yīng)的數(shù)據(jù)庫環(huán)境
// SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(
// stream, "development");
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(stream);
session = factory.openSession();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return session;
}
/*
* 獲取數(shù)據(jù)庫訪問鏈接
*/
public static void closeSession(SqlSession session) {
session.close();
}
/*
* 返回操作記錄消息
*/
public static void showMessages(CRUD_Enum type, int count) {
switch (type) {
case Add:
System.out.println("添加了" + count + "條記錄。");
break;
case Delete:
System.out.println("刪除了" + count + "條記錄。");
break;
case Update:
System.out.println("更新了" + count + "條記錄。");
break;
case Query:
System.out.println("匹配了" + count + "條記錄。");
break;
case List:
System.out.println("共有" + count + "條記錄。");
break;
default:
break;
}
}
}
在包david.mybatis.model下面新建一個(gè)名為Visitor的類,用來作相應(yīng)的OR Mapping。

Visit類
package david.mybatis.model;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Visitor {
private int id;
private String name;
private String email;
private int status;
private Date createTime;
public Visitor() {
// TODO Auto-generated constructor stub
createTime = new Date();
}
public Visitor(String name, String email) {
this.name = name;
this.email = email;
this.status = 1;
this.createTime = new Date();
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public Date getCreateTime() {
return createTime;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return String.format("{Id: %d, Name: %s, CreateTime: %s}", id, name,
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime));
}
}
在包david.mybatis.demo下面新建一個(gè)VisitorMapper.xml,用來映射相應(yīng)SQL語句。
這里要注意namespace=>david.mybatis.demo.IVisitorOperation一定要與對應(yīng)這個(gè)包下面的實(shí)際文件名,IVisitorOperation否則無法成功加載相應(yīng)的映射文件

VisitorMapper配置
<mapper namespace="david.mybatis.demo.IVisitorOperation">
<!-- 此處的resultType就是對應(yīng)剛剛你在typeAlias節(jié)點(diǎn)里面規(guī)定的別名 -->
<select id="basicQuery" parameterType="int" resultType="Visitor">
select * from visitor where id=#{id} and
Status>0 order by Id
</select>
</mapper>
接下來運(yùn)行下面的程序

基本查詢
public static void testBasicQuery(int id) {
SqlSession session = MybatisUtils.getSqlSession();
try {
Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id);
MybatisUtils.closeSession(session);
System.out.println(visitor);
} catch (Exception e) {
// TODO: handle exception
}
}
一個(gè)最簡單的執(zhí)行結(jié)果就出來啦

這算是Mybatis系列的HelloWord,下回會講述關(guān)于使用接口的方式進(jìn)行相應(yīng)操作。