MyBatis初識
- 下載下傳jar包、建庫建表、建立項目
- 建立 MyBatis 的配置檔案
- 建立持久化類
- 建立接口和映射檔案
- 建立測試類
- mybatis入門手冊
要使用 MyBatis, 隻需将 mybatis-x.x.x.jar 檔案置于 classpath 中即可。
下載下傳jar包、建庫建表、建立項目
Mybatis jar包下載下傳位址:https://github.com/mybatis/mybatis-3/releases.
此次使用3.4.5版本jar包。
Mysql的jar包,https://dev.mysql.com/downloads/j/
建庫建表插入資料:
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`age` varchar(20) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `mybatis`.`users` (`id`, `name`, `age`, `sex`) VALUES ('1', '小美', '10', '女');

通過IDE建立一個JAVA項目,導入下列jar包
項目結構如下圖所示:
建立 MyBatis 的配置檔案
在 src 目錄下建立 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>
<!-- MySQL資料庫驅動 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 連接配接資料庫的URL -->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
<!-- 連接配接資料庫的使用者 -->
<property name="username" value="root"/>
<!-- 連接配接資料庫的密碼 -->
<property name="password" value="password"/>
</properties>
<!-- 配置mybatis運作環境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC的事務管理 -->
<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>
<!-- 将mapper檔案加入到配置檔案中 -->
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
上述映射檔案和配置檔案都不需要完全手動編寫,都可以從 MyBatis 使用手冊中複制,然後做簡單修改。
首先通過DOCTYPE導入mybatis-3-config.dtd,然後alt+/即可自動出現<configuration>節點,
<properties> JDBC連接配接資料庫的四個屬性:驅動、位址、使用者名、密碼。
<environments>配置環境,其子節點<environment>可有多個。
<dataSource>資料庫源配置
最後将<mappers>檔案加入到配置檔案中,使後面一步配置mapper檔案生效 ,該節點可配置多個<mapper>。
上述配置檔案還包括其他例如:<typeHandlers>、<typeAliases>、<objectFactory>等屬性,此處不詳細說明。
建立持久化類
在 src 目錄下建立一個名為 com.mybatis.pojo 的包,,在該包中建立持久化類 User,注意在類中聲明的屬性與資料表 users 的字段一緻。
User 的代碼如下:
package com.mybatis.pojo;
/**
* 資料庫中users表的持久類
*/
public class User {
private int id;// 主鍵
private String name;
private String age;
private String sex;
// getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
+ sex + "]";
}
}
建立接口和映射檔案
在 src 目錄下建立一個名為 com.mybatis.mapper 的包,在該包中建立接口UserMapper.java和映射檔案 UserMapper.xml。其中UserMapper.java就是一個對資料庫的通路接口,不用去實作。相當于MVC模式裡的UserDao.java檔案。
UserMapper.java代碼:
package com.mybatis.mapper;
import com.mybatis.pojo.User;
public interface UserMapper {
User getUserById(int id);
}
UserMapper.xml可以了解為在MVC裡的UserDao.java的實作類UserDaoImpl.java。Mybatis架構通過反射和XML解析把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="com.mybatis.mapper.UserMapper">
<select id="getUserById" resultType="com.mybatis.pojo.User">
select * from users where id = #{id}
</select>
</mapper>
上述檔案主要作用是:編寫需要執行的SQL指令。
先導入Dtd,即<!DOCTYPE…>這一長串代碼,之後alt+/ 即可自動彈出該xml的标簽。
元素是配置檔案的根元素,它包含了一個 namespace 屬性,該屬性值通常設定為“包名+SQL映射檔案名”,指定了唯一的命名空間。
子元素 <select> (包括:<insert>、<update> 以及 <delete> )中的資訊是用于執行查詢(添加、修改以及删除)操作的配置。在定義的 SQL 語句中,“#{}”表示一個占位符,相當于JAVA中的“?”,而“#{id}”表示該占位符待接收參數的名稱為 id。
需要注意的地方是,
第5行的namespace:可了解為實作類的全路徑(包名+類名)。此處須定義成mapper.xml檔案對應的mapper接口(此處即UserMapper.java檔案)。如果不寫接口的話,則可随意定義,例如定義成:a.b,則a包下的b類。
第6行的id:方法名。必須是mapper接口的方法名稱(此處即getUserById方法)。若沒定義接口,則可自行定義名稱。
resultType:傳回類型。在這裡必須是User類的絕對路徑(此處查詢的是一個User加粗樣式類)。如果方法傳回值是list,在resultType中寫List的泛型,因為Mybatis對jdbc封裝 一行一行讀取資料。由于架構的反射機制,resultType不能直接寫類名,而要求必須寫類的全路徑,即:com.mybatis.pojo.User。SQL語句中查出的列名,即自動映射到實體類中的屬性,若屬性與列名不同,則會傳回Null,解決方法可将此處的sql查詢出的列名取别名 例如實體類中的name改成userName則mapper.xml中的sql須改成select id,name userName,… from users。
parameterType:定義參數類型,此處沒寫出。
第7行#{id}的“id”即映射mapper接口中getUserById方法的參數。
建立測試類
在 src 目錄下建立一個名為 com.mybatis.test 的包,導入JUnit的jar包後,在該包中建立 MyTest 測試類。
mybatis的核心: 每個MyBatis應用都以一個SqlSessionFactory為核心。一個SqlSessionFactory執行個體能夠通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder能夠從XML配置檔案或者從配置類建構一個SqlSessionFactory執行個體。
SqlSession由SqlSessionFactory建立,SqlSessionFactory是一個接口,其實作類有DefaultSqlSessionFactory和SqlSessionManager,然而DefaultSqlSessionFactory構造方法需要一個configuration參數。當某些類進行執行個體化比較複雜時,可使用了build(建構者)模式(即:SqlSessionFactoryBuilder())進行建構對象,SqlSessionFactoryBuilder()的build(Reader reader)方法的參數是字元流基類。
在測試類中首先使用輸入流讀取配置檔案,然後根據配置資訊建構 SqlSessionFactory 對象。
接下來通過 SqlSessionFactory 對象建立 SqlSession 對象,并使用 SqlSession 對象的方法執行資料庫操作。
MyBatisTest 測試類的代碼如下:
package com.mybatis.test;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;
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 org.junit.Test;
public class MyTest {
@Test
public void test(){
try {
// 讀取配置檔案 mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
// 根據配置檔案建構SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
// 通過 SqlSessionFactory 建立 SqlSession
SqlSession ss = ssf.openSession();
// SqlSession執行映射檔案中定義的SQL,并傳回映射結果
UserMapper userMapper = ss.getMapper(UserMapper.class);
// 查詢id=1的使用者
User user = userMapper.getUserById(1);
System.out.println(user);
// 送出事務
//ss.commit();
// 關閉 SqlSession
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
右擊運作進行測試,結果如下:
每個MyBatis應用都以一個SqlSessionFactory為核心,可建立一個util包,可進行将建立 SqlSession進行封裝。
SessionFactory 代碼如下:
package com.mybatis.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;
/**
* 擷取SqlSession執行個體
*/
public class SessionFactory {
public static SqlSession getSqlSession(String resource) throws IOException{
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
之後的測試類可改成:
package com.mybatis.test;
import static org.junit.Assert.*;
import java.io.IOException;
import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;
import com.mybatis.util.SessionFactory;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MyTest {
@Test
public void test() throws IOException {
String resource = "mybatis-config.xml"; //擷取mybatis配置檔案路徑
SqlSession sqlSession = SessionFactory.getSqlSession(resource); //通過SessionFactory工具類(此工具類為自己構造即util包中的SessionFactory)構造SqlSession
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
System.out.println(user);
}
}
測試結果:
測試結果相同。
mybatis的第一個入門demo程式完成。
mybatis入門手冊
傳送門:https://mybatis.org/mybatis-3/zh/getting-started.html