項目結構:
數據庫測試數據:
db.properties 數據庫配置文件:
# mysql 配置
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis
mysql.username=root
mysql.password=root
# oracle 配置
oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:orcl
oracle.username=scott
oracle.password=tiger
mybatis.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>
<!--
加載 src 路徑下的 配置文件(db.properties);
下面通過 ${ 鍵 } 獲取對應的值;
-->
<properties resource="db.properties"/>
<!--
設置類型別名:在映射文件中所有的 com.mybatis.demo.Student 類型都可以使用 student 代替
-->
<typeAliases>
<typeAlias type="com.mybatis.demo.Student" alias="student"/>
</typeAliases>
<!-- 設置一個默認的連接環境信息 -->
<environments default="mysql_developer">
<!-- 連接環境信息:取一個任意唯一的名字 -->
<environment id="mysql_developer">
<!-- mybatis 使用 jdbc 事務管理方式 -->
<transactionManager type="jdbc"/>
<!-- mybatis 使用連接池方式來獲取連接 -->
<dataSource type="pooled">
<!--
配置與數據庫交互的4個必要屬性 ;
${mysql.driver}:表示獲取 db.properties 配置文件中 mysql.driver 的值;
-->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
<!-- 連接環境信息:取一個任意唯一的名字 -->
<environment id="oracle_developer">
<!-- mybatis 使用 jdbc 事務管理方式 -->
<transactionManager type="jdbc"/>
<!-- mybatis 使用連接池方式來獲取連接 -->
<dataSource type="pooled">
<!-- 配置與數據庫交互的4個必要屬性 -->
<property name="driver" value="${oracle.driver}"/>
<property name="url" value="${oracle.url}"/>
<property name="username" value="${oracle.username}"/>
<property name="password" value="${oracle.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加載映射文件 -->
<mappers>
<mapper resource="com/mybatis/demo/StudentMapper.xml"/>
</mappers>
</configuration>
StudentMapper.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">
<!-- namespace 是名稱空間,理論上可以隨便寫,但必須保證唯一 -->
<mapper namespace="studentNamespace">
<!--
resultMap 標籤:映射實體與表的關係;
當實體類中的屬性名 和 表中的字段名 不一樣的時候,<resultMap> 標籤表示的映射關係必須要寫;
但是如果 實體類中的屬性名 和 表中的字段名 完全一樣的時候,<resultMap> 標籤可以省略不寫;
id:爲實體類與表的映射 取一個任意的唯一編號;
type:實體類的全路徑名;
-->
<resultMap id="studentMap" type="com.mybatis.demo.Student">
<!-- property:表示實體類中的屬性; column:表示表中的字段 -->
<id property="sid" column="id"/>
<result property="sname" column="name"/>
<result property="ssal" column="sal"/>
</resultMap>
<!--
分頁查詢:
parameterType:表示執行此 SQL 語句時傳入的參數類型;
resultType:表示執行此 SQL 語句時返回的數據類型;
理論上應該返回 List 集合類型,但這裏只需要寫 list 集合中 元素的類型即可;
resultMap:表示將查詢出來的記錄根據 <resultMap> 標籤中的映射關係 自動封裝到對應的實體類中;
注意:
SQL 語句中的佔位符只需要寫 map 集合中的 key 即可,mybatis 能夠根據 key 自動獲取 value;
-->
<select id="findAllWithPage" parameterType="map" resultType="com.mybatis.demo.Student" resultMap="studentMap">
select * from students limit #{pageStart}, #{pageSize}
</select>
</mapper>
Student.java 實體類:
package com.mybatis.demo;
/**
* 實體類
*/
public class Student {
private int sid;
private String sname;
private Double ssal;
public Student() {
}
public Student(int sid, String sname, Double ssal) {
this.sid = sid;
this.sname = sname;
this.ssal = ssal;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Double getSsal() {
return ssal;
}
public void setSsal(Double ssal) {
this.ssal = ssal;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", ssal=" + ssal +
'}';
}
}
MybatisUtils.java 工具類:
package com.mybatis.demo;
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 java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
/**
* 工具類
*/
public class MybatisUtils {
/**
* 禁止外界通過 new 方法創建 工具類對象:構造方法私有化;
*/
private MybatisUtils(){}
/**
* 創建一個線程對象,目的是將 SqlSession 和當前線程綁定到一起,線程結束,SqlSession 銷燬;
*/
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
/**
* SqlSession 工廠
*/
private static SqlSessionFactory sqlSessionFactory;
/**
* 類加載的時候 自動加載 src/mybatis.xml 配置文件
*/
static {
try {
// 加載配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
// 根據配置文件構造 SqlSession 工廠
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 獲取 SqlSession
*/
public static SqlSession getSession() {
// 從當前線程中獲取 SqlSession
SqlSession sqlSession = threadLocal.get();
// 如果線程中沒有 SqlSession 的話
if (sqlSession == null) {
// 找 SessionFactory 創建一個 SqlSession
sqlSession = sqlSessionFactory.openSession();
// 將當前線程與 SqlSession 綁定到一起
threadLocal.set(sqlSession);
}
// 返回 SqlSession 對象
return sqlSession;
}
/**
* 關閉 SqlSession,並與當前線程分離
*/
public static void closeSqlSession() {
// 從當前線程中獲取 SqlSession
SqlSession sqlSession = getSession();
// 如果有的話就關閉
if (sqlSession != null) {
// 關閉
sqlSession.close();
// 分離當前線程與 SqlSession,目的是讓 GC 儘早回收
threadLocal.remove();
}
}
/**
* 測試是否連接成功
*/
public static void main(String[] args){
Connection connection = MybatisUtils.getSession().getConnection();
System.out.println(connection);
}
}
StudentDao.java 測試類:
package com.mybatis.demo;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 持久層:測試分頁查詢
*/
public class StudentDao {
/**
* 分頁查詢
* @param pageStart 當前頁顯示的第一條記錄的索引
* @param pageSize 當前頁顯示的記錄個數
*/
public int findAllWithPage(int pageStart, int pageSize) throws Exception{
// 獲取 SqlSession 對象
SqlSession sqlSession = MybatisUtils.getSession();
try {
// 封裝分頁參數
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("pageStart", pageStart);
map.put("pageSize", pageSize);
/**
* 執行 StudentMapper.xml 配置文件中的分頁 SQL 語句:
* 傳入參數類型(Map)在配置文件中用 parameterType 屬性指定;
* 返回參數類型(List<Student>)在配置文件中用 resultType 屬性指定;
* 注意:用 resultType 屬性指定返回值類型的時候,理論上應該返回 list 類型,
* 但是 mybatis 中只要指定 list 集合中的 元素的類型即可;
*/
List<Student> list = sqlSession.selectList("studentNamespace.findAllWithPage", map);
for(Student student : list)
System.out.println(student);
return 0;
}catch (Exception e){
e.printStackTrace();
throw e;
}finally {
MybatisUtils.closeSqlSession(); // 關閉
}
}
public static void main(String[] args) throws Exception{
StudentDao dao = new StudentDao();
// 分頁查詢
System.out.println("********** 第一頁 *************");
int ret = dao.findAllWithPage(0, 3);
System.out.println("********** 第二頁 *************");
ret = dao.findAllWithPage(3, 3);
System.out.println("********** 第三頁 *************");
ret = dao.findAllWithPage(6, 3);
}
}
測試結果: