最近要學習使用MyBatis,參照網上的資料和官方的教程,根據自己的了解,記錄一下。
MyBatisJar包下載下傳位址:http://download.csdn.net/detail/jolingogo/5220163
官方教程:http://mybatis.github.com/mybatis-3/zh/index.htm
一.什麼是MyBatis
MyBatis 是支援普通 SQL 查詢,存儲過程和進階映射的優秀持久層架構。MyBatis 消除 了幾乎所有的 JDBC 代碼和參數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 對象)映射成資料庫中的記錄。
以前學習過Hibernate,在網上查了一下,說MyBatis是半自動化的,需要自己寫SQL語句,這樣就可以根據需要自己優化SQL了。
Hibernate可以根據配置檔案或者注解自動生成表,省去了自己寫建表語句,在網上找了一下,MyBatis好像不可以。Google提供了generator,可以根據表結構生成實體類和映射檔案,試了一下,還不錯,以後會寫一下。
二.配置檔案
這些架構什麼的,基本上都需要配置檔案。MyBatis的XML 配置檔案包含對 MyBatis 系統的核心設定,包含擷取資料庫連接配接執行個體的資料源和 決定事務範圍和控制的事務管理器。
mybatis-config.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>
<!-- 資料庫相關屬性檔案,這裡不寫的話,也會自動加載 -->
<properties resource="config.properties"></properties>
<!-- 環境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 資料庫連接配接相關配置 ,這裡動态擷取config.properties檔案中的内容-->
<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>
<!-- 映射檔案 ,我們還沒有,這裡什麼都不寫-->
<mappers>
</mappers>
</configuration>
config.properties
三.從 XML 中建構 SqlSessionFactory
每 一 個 MyBatis 的 應 用 程 序 都 以 一 個 SqlSessionFactory 對 象 的 實 例 為 核 心 。 SqlSessionFactory 對 象 的 實 例 可 以 通 過 SqlSessionFactoryBuilder 對 象 來 獲 得 。 SqlSessionFactoryBuilder 對象可以從 XML 配置檔案,或從 Configuration 類的習慣準備的實 例中建構 SqlSessionFactory 對象。
這裡的SqlSessionFactory和Hibernate中的SessionFactory是一樣的,我們可以通過factory,擷取session。
package org.ygy.util;
import java.io.IOException;
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;
/**
* MyBatis的工具類
* @author yuguiyang
*
*/
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
/**
* 初始化Session工廠
* @throws IOException
*/
private static void initialFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 擷取Session
* @return
*/
public static SqlSession getSession() {
if(sqlSessionFactory == null) {
try {
initialFactory();
} catch (IOException e) {
e.printStackTrace();
}
}
return sqlSessionFactory.openSession();
}
}
接下來,我們測試一下,看看配置是否正确:
package org.ygy.model;
import static org.junit.Assert.*;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.ygy.util.MyBatisUtil;
public class ModelTest {
@Test
public void testGetSession() {
SqlSession session = MyBatisUtil.getSession();
assertNotNull(session);
if(session != null) {
session.close();
session = null;
}
}
}
貌似,想當然的悲劇了,這樣測試好像不行,剛才忘記添加資料庫驅動了,結果運作一樣成功了,如果不執行SQL語句的話,MyBatis好像不會去連接配接資料庫,測試還是等一下吧
。
既然這樣的話,我們就先寫一個映射檔案。
首先,我們要建一張表,就來一個使用者表吧(t_user),我用的SqlServer,語句就省略了吧
然後,和表對應的實體類:
package org.ygy.model;
/**
* 使用者
* @author yuguiyang
*
*/
public class User {
private Integer id;//自動增長的ID
private String name;//使用者名
private String password;//密碼
private String email;//郵箱
private Integer age;//年齡
private Integer gender;//性别,0-男 ; 1-女
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ ", email=" + email + ", age=" + age + ", gender=" + gender
+ "]";
}
}
接下來,是映射檔案:UserMapper.xml
<?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="org.ygy.mapper.UserMapper">
<insert id="insert" parameterType="org.ygy.model.User" useGeneratedKeys="true">
insert into t_user(name , password , email , gender , age)
values(#{name} , #{password} , #{email} , #{gender} , #{age})
</insert>
<select id="selectUser" resultType="org.ygy.model.User">
select * from t_user
</select>
</mapper>
最後,在mybatis-config.xml配置檔案中添加映射檔案:
<!-- 映射檔案 -->
<mappers>
<mapper resource="org/ygy/mapper/UserMapper.xml"/>
</mappers>
好了,這下,我們可以測試了:
package org.ygy.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.ygy.util.MyBatisUtil;
public class ModelTest {
private SqlSession session = null;
@Before
public void before() {
session = MyBatisUtil.getSession();
}
@After
public void after() {
session.commit();
session.close();
}
@Test
public void testGetSession() {
assertNotNull(session);
if(session != null) {
session.close();
session = null;
}
}
@Test
public void testSelectUser() {
List<User> userList = session.selectList("org.ygy.mapper.UserMapper.selectUser");
for(User each : userList) {
System.out.println("each->" + each);
}
}
@Test
public void testInsert() {
User user = new User();
user.setName("路飛");
user.setPassword("lufei");
user.setEmail("[email protected]");
user.setAge(23);
user.setGender(0);
int result = session.insert("org.ygy.mapper.UserMapper.insert" , user);
assertEquals(1 , result);
}
}
,這樣,一個入門的示例,就差不多了。
拓展:
1.别名
在mybatis-config.xml中可以配置别名 (typeAliases)
類型别名是為 Java 類型命名一個短的名字。它隻和 XML 配置有關,隻用來減少類完全限定名的多餘部分。
看看上面UserMapper.xml中
隻要在mybatis-config.xml中添加
<!-- 配置别名 -->
<typeAliases>
<typeAlias type="org.ygy.model.User" alias="User"/>
</typeAliases>
就可以了。