mybatis 入門(轉載老師講義,博主只圖檢視方便)
Mybatis
引言
一、介紹
MyBatis 的前身是 iBATIS , 是 Clinton Begin 在 2001 年發起的一個開源專案,最初側重於密碼軟體的開發 , 後來發展成為一款基於 Java 的持久層框架。 2 004 年, C linton 將 iBATIS 的名字和原始碼捐贈給了 Apache 軟體基金會,接下來的 6 年中,開源軟體世界發生了巨大的變化, 一切開發實踐、基礎設施、許可,甚至資料庫技術都徹底改變了 。 2010 年,核心開發團隊決定離開 Apache 軟體基金會,井且將 iBATIS 改名為 MyBatis oMyBatis 是一款優秀的支援自定義 SQL 查詢、儲存過程和高階對映的持久層框架,消除了幾乎所有的 JDBC 程式碼和引數的手動設定以及結果集的檢索 。 MyBatis 可以使用 XML 或註解進行配置和對映, MyBatis 通過將引數對映到配置的 S QL 形成最終執行的 S QL 語句 ,最後將執行SQL 的 結果對映成 Java 物件返回。與其他的 ORM (物件關係對映)框架不同, MyB atis 並沒有將 Java 物件與資料庫表關聯起來,而是將 Java 方法與 SQL 語句關聯。 MyBatis 允許使用者充分利用資料庫的各種功能,例如儲存過程、檢視、各種複雜的查詢以及某資料庫的專有特性 。如果要對遺留資料庫、不規範的資料庫進行操作 , 或者要完全控制 SQL 的執行, MyBatis 將會是一個不錯的選擇。與 JDBC 相比, MyBatis 簡化 了相關程式碼, S QL 語句在一行程式碼中就能執行 。 MyBatis 提供了一個對映引擎 , 宣告式地將 SQL 語句的執行結果與物件樹對映起來。通過使用 一種內建的類XML 表示式語言, SQL 語句可以被動態生成。MyBatis 支援宣告式資料快取( declarative data caching ) 。當 一條 SQL 語句被標記為“可快取”後,首次執行它時從資料庫獲取的所有資料會被儲存在快取記憶體中,後面再執行這條語句時就會從快取記憶體中讀取結果,而不是再次命中資料庫 。 MyBatis 提供了預設情況下基於 Java HashMap 的快取實現,以及用於與 OS Cache 、 Eh cache 、 Haze least 和 Memcached 連線的預設聯結器,同時還提供了 API 供其他快取實現使用。
1執行原理
l mybatis配置檔案,包括Mybatis全域性配置檔案和Mybatis對映檔案,其中全域性配置檔案配置了資料來源、事務等資訊;對映檔案配置了SQL執行相關的 資訊。
l mybatis通過讀取配置檔案資訊(全域性配置檔案和對映檔案),構造出SqlSessionFactory,即會話工廠。
l 通過SqlSessionFactory,可以建立SqlSession即會話。Mybatis是通過SqlSession來操作資料庫的。
l SqlSession本身不能直接操作資料庫,它是通過底層的Executor執行器介面來操作資料庫的。Executor介面有兩個實現類,一個是普通執行器,一個是快取執行器(預設)。
l Executor執行器要處理的SQL資訊是封裝到一個底層物件MappedStatement中。該物件包括:SQL語句、輸入引數對映資訊、輸出結果集對映資訊。其中輸入引數和輸出結果的對映型別包括java的簡單型別、HashMap集合物件、POJO物件型別。
二、快速入門
1 準備資料庫 ( mybaits )
CREATE TABLE `tb_employee` ( `emp_no` int(11) NOT NULL AUTO_INCREMENT, `emp_name` varchar(50) DEFAULT NULL, `emp_tel` varchar(50) DEFAULT NULL, `emp_address` varchar(50) DEFAULT NULL, PRIMARY KEY (`emp_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2 建立maven工程 ( 引入依賴 )
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>
3配置Mapper檔案
配置 MyBatis 有多種方式,本節使用最基礎最常用的 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="EmpMapper">
<select id="selectAll" resultType="com.xingxue.mybatis.domain.EmployeeModel" >
select emp_no as empNo,emp_name empName,emp_tel as empTel,emp_address as empAddress from tb_employee;
</select>
</mapper>
4配置 mybaits核心配置檔案
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/EmpMapper.xml"/>
</mappers>
</configuration>
5測試
@Test
public void test(){
try {
// 建立並獲得 mybaits核心配置檔案 的Reader流
Reader reader = Resources.getResourceAsReader("configer/mybatis.xml");
// 建立 SqlSessionFactory (回話工廠) 物件,需要一個Reader流
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 建立一個SqlSession (會話)
SqlSession session = sessionFactory.openSession();
// 查詢資料
List<Object> list = session.selectList("selectAll");
System.out.println(list);
// 關閉會話
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
三、核心配置檔案
1、基礎配置 說明
<?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>
<!-- 環境配置 -->
<environments default="development">
<!--具體連線環境 可配置多個, 由父級標籤選擇 -->
<environment id="development">
<!--配置 事務管理-->
<transactionManager type="JDBC"/>
<!--配置資料來源 POOLED mybaits 自帶連線池-->
<dataSource type="POOLED">
<!-- 資料庫連線資訊 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 引入mapper 檔案 -->
<mappers>
<!--具體mapper 檔案 resource: 檔案路徑 -->
<mapper resource="mapper/EmpMapper.xml"/>
</mappers>
</configuration>
2、properties配置
<properties resource="configer/db.properties"></properties>
使用 <properties> 標籤把資料庫連線資訊分離到 db.properties中單獨維護
3、settingp配置
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
詳細配置參考 http://www.mybatis.org/mybatis-3/zh/configuration.html#settings
4、typeAliases配置
類型別名是為 Java 型別設定一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減少類完全限定名的冗餘。
-
單個配置
<typeAliases> <typeAlias alias="Emp" type="com.xingxue.mybatis.domain.EmpModel"/> <typeAlias alias="Dept" type="com.xingxue.mybatis.domain.Department"/> </typeAliases>
-
包配置(推薦 ,別名就是簡單類名)
<typeAliases> <package name="com.xingxue.mybatis.domain"/> </typeAliases>
-
註解配置( 前提必須開啟 包別名配置 )
@Alias("Emp") public class EmpModel { }
這是一些為常見的 Java 型別內建的相應的類型別名。它們都是大小寫不敏感的,需要注意的是由基本型別名稱重複導致的特殊處理。
別名 對映的型別 _byte byte _long long _short short _int int _integer int _double double _float float _boolean boolean string String byte Byte long Long short Short int Integer integer Integer double Double float Float boolean Boolean date Date decimal BigDecimal bigdecimal BigDecimal object Object map Map hashmap HashMap list List arraylist ArrayList collection Collection iterator Iterator
四、Mapper對映檔案
<?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: 名稱空間,沒有使用Mapper代理時可以隨意,
如果使用Mapper代理方式,那麼它的取值必須為對應Mapper介面的類路徑
-->
<mapper namespace="EmpMapper">
<!--
select : 處理查詢sql語句
id : 命名該sql語句,是唯一的。
resultType: 返回型別:java中的資料型別,這裡是一個模型
-->
<select id="selectall" resultType="com.xingxue.mybatis.domain.EmpModel">
select emp_no AS empNo, emp_name AS empName, emp_tel as empTel , emp_address as empAddress from tb_employee;
</select>
</mapper>
<select> 標籤: 查詢SQL語句
<insert> 標籤:插入SQL語句
<update>標籤:修改SQL語句
<delete> 標籤:刪除SQL語句
五、使用Mapper介面
mybatis官方推薦的使用方式,使用Mapper介面呼叫Mapper XML 中的方法,該方法採用的是動態代理的方法,Mapper檔案和 Dao介面繫結後,呼叫Dao介面(這裡mybatis官方建議叫xxMapper 這只是一種風格)方法時,mybatis會自動建立Dao介面的實現類的代理物件(類似曾經的 xxxDaoImpl),該代理物件呼叫Mapper xml 檔案中對應的方法。
-
定義Mapper介面
package com.xingxue.mybatis.dao; import com.xingxue.mybatis.domain.EmpModel; import java.util.List; public interface EmpMapper { public int add(EmpModel model) throws Exception; public List<EmpModel> list() throws Exception; }
-
編寫Mappper檔案
<?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 必須是介面的全類名--> <mapper namespace="com.xingxue.mybatis.dao.EmpMapper"> <insert id="add" > insert into tb_employee(emp_no,emp_name,emp_tel,emp_address) values( #{empNo},#{empName},#{empTel},#{empAddress} ); </insert> <select id="list" resultType="com.xingxue.mybatis.domain.EmpModel" > SELECT * FROM tb_employee; </select> </mapper>
-
測試
@Test public void test(){ try { // 建立並獲得 mybaits核心配置檔案 的Reader流 Reader reader = Resources.getResourceAsReader("configer/mybatis.xml"); // 建立 SqlSessionFactory (回話工廠) 物件,需要一個Reader流 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); // 建立一個SqlSession (會話) SqlSession session = sessionFactory.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); //List<EmpModel> list = mapper.list(); //System.out.println(list); int row= mapper. add ( new EmpModel(108,"六六","北京","19939399") ); System.out.println("================="row+"===================="); session.commit(); session.close(); } catch (Exception e) { e.printStackTrace(); } }
-
六、動態SQL
MyBatis 的強大特性之一便是它的動態 SQL 。使用過 JDB C 或其他類似框架的人都會知道,根據不同條件拼接 SQL 語句時不僅不能忘了必要的空格,還要注意省略掉列名列表最後的逗號,處理方式麻煩且凌亂。 MyBatis 的動態 SQL 則能讓我們擺脫這種痛苦。在 MyBatis 3 之前的版本中,使用動態 SQL 需要學習和了解非常多的標籤,現在 MyBatis採用了功能強大的 OGNL ( Object-Graph Navigation Language )表示式語言消除了許多其他標籤,以下是 MyBatis 的動態 SQL在 XML 中支援的幾種標籤。
if
choose (when 、 oterwise)
where 、 set
trim
foreach
bind (瞭解)
1 if 標籤
-
查詢<select>中使用 if
<select id="getEmpWithCondition" resultType="EmpModel" > select * from tb_employee where 1=1 <if test="empNo != null"> and emp_no=#{empNo} </if> <if test="empName != null and empName !='' "> and emp_name=#{empName} </if> <if test="empTel != null and empTel != '' "> and emp_tel=#{empTel} </if> </select>
EmpModel md=new EmpModel(); md.setEmpNo(123); //md.setEmpName("java"); // md.setEmpTel("188xx"); md.setEmpAddress("北京"); mapper.getEmpWithCondition(md); ==> Preparing: select * from tb_employee where 1=1 and emp_no=? ==> Parameters: 123(Integer) <== Total: 0
-
更新<update>中使用 if
<update id="updateWithModel"> update tb_employee set <if test="empName != null and empName !='' "> emp_name=#{empName}, </if> <if test="empTel != null and empTel !='' "> emp_tel=#{empTel}, </if> <if test="empAddress != null and empAddress !='' "> emp_address=#{empAddress}, </if> emp_no=#{empNo} where emp_no=#{empNo} </update>
EmpModel md=new EmpModel(); md.setEmpNo(101); md.setEmpName("java"); md.setEmpTel("188xx"); // md.setEmpAddress("北京"); mapper.updateWithModel(md); ==> Preparing: update tb_employee set emp_name=?, emp_tel=?, emp_no=? where emp_no=? ==> Parameters: java(String), 188xx(String), 101(Integer), 101(Integer) <== Updates: 1
-
插入<insert>中使用 if
<insert id="insertWidthModel" > insert into tb_employee(emp_no,emp_name <if test="empTel != null and empTel != '' "> ,emp_tel </if> <if test="empAddress != null and empAddress != '' "> ,emp_address </if> ) values( #{empNo},#{empName} <if test="empTel != null and empTel != '' "> ,#{empTel} </if> <if test="empAddress != null and empAddress != '' "> ,#{empAddress} </if> ) </insert>
EmpModel md=new EmpModel(); md.setEmpNo(404); md.setEmpName("小張"); //md.setEmpTel("188xx"); md.setEmpAddress("北京"); mapper.insertWidthModel(md); ==> Preparing: insert into tb_employee(emp_no,emp_name ,emp_address ) values( ?,? ,? ) ==> Parameters: 404(Integer), 小張(String), 北京(String) <== Updates: 1
2 choose-when-therwise標籤
<select id="getEmpByIdOrName" resultType="EmpModel">
select * from tb_employee where
<choose>
<when test="empNo !=null ">
emp_no=#{empNo}
</when>
<otherwise>
emp_name=#{empName}
</otherwise>
</choose>
</select>
EmpModel md=new EmpModel();
//md.setEmpNo(404);
md.setEmpName("小張");
mapper.getEmpByIdOrName(md);
==> Preparing: select * from tb_employee where emp_name=?
==> Parameters: 小張(String)
<== Columns: emp_no, emp_name, emp_tel, emp_address
<== Row: 404, 小張, null, 北京
<== Total: 1
3 where 標籤
where 標籤的作用:如果該標籤包含的元素中有返回值,就插入一個 where ;如果 where後面的字串是以 AND 和 OR 開頭的,就將它們剔除。
<select id="getEmpWithCondition" resultType="EmpModel" >
select * from tb_employee
<where>
<if test="empNo != null">
and emp_no=#{empNo},
</if>
<if test="empName != null and empName !='' ">
and emp_name=#{empName},
</if>
<if test="empTel != null and empTel != '' ">
and emp_tel=#{empTel}
</if>
</where>
</select>
EmpModel md=new EmpModel();
//md.setEmpNo(404);
//md.setEmpName("小張");
md.setEmpTel("188xx");
mapper.getEmpWithCondition(md);
<== Columns: emp_no, emp_name, emp_tel, emp_address
<== Row: 101, java, 188xx, 重慶
<== Total: 1
5 set標籤
set 標籤的作用:如果該標籤包含的元素中有返回值,就插入一個 set :如果 set 後面的字串是 以逗號結尾的,就將這個逗號剔除 。
<update id="updateWithModel">
update tb_employee
<set>
<if test="empName != null and empName !='' ">
emp_name=#{empName},
</if>
<if test="empTel != null and empTel !='' ">
emp_tel=#{empTel},
</if>
<if test="empAddress != null and empAddress !='' ">
emp_address=#{empAddress},
</if>
</set>
where emp_no=#{empNo}
</update>
EmpModel md=new EmpModel();
md.setEmpNo(404);
md.setEmpName("小紅");
md.setEmpTel("110");
//md.setEmpAddress("重慶");
mapper.updateWithModel(md);
==> Preparing: update tb_employee SET emp_name=?, emp_tel=? where emp_no=?
==> Parameters: 小紅(String), 110(String), 404(Integer)
<== Updates: 1
6 trim標籤
<update id="updateWithModel">
update tb_employee
<trim prefix="set" suffixOverrides=",">
<if test="empName != null and empName !='' ">
emp_name=#{empName},
</if>
<if test="empTel != null and empTel !='' ">
emp_tel=#{empTel},
</if>
<if test="empAddress != null and empAddress !='' ">
emp_address=#{empAddress},
</if>
</trim>
where emp_no=#{empNo}
</update>
7 foreach標籤
<delete id="deleteMany">
delete from tb_employee where emp_no in
<foreach collection="list" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</delete>
List<Integer> ids=new ArrayList<>();
ids.add(101);
ids.add(202);
ids.add(404);
mapper.deleteMany( ids );
==> Preparing: delete from tb_employee where emp_no in ( ? , ? , ? )
==> Parameters: 101(Integer), 202(Integer), 404(Integer)
<== Updates: 3
七、關聯查詢
1 對 1 關聯對映
<resultMap id="EmpDetilMap" type="EmpModel">
<id column="emp_no" property="empNo"/>
<result column="emp_name" property="empName" />
<result column="emp_tel" property="empTel" />
<result column="emp_address" property="empAddress" />
<!--聚合屬性配置-->
<association property="dept" javaType="DeptModel">
<id column="dept_no" property="deptNo"/>
<result column="dept_name" property="deptName"/>
<result column="dept_loc" property="deptLoc"/>
</association>
</resultMap>
<select id="getEmpDetil" resultMap="EmpDetilMap" >
select * from tb_employee e, tb_department d where e.dept_no=d.dept_no and emp_no=#{id};
</select>
<asociation> :用於配置聚合屬性
property:聚合屬性
javaType:聚合和的型別【別名 或 全類名】
1 對 n 關係對映
<resultMap id="DeptDetailMap" type="DeptModel">
<id column="dept_no" property="deptNo"/>
<result column="dept_name" property="deptName"/>
<result column="dept_loc" property="deptLoc"/>
<collection property="emps" ofType="EmpModel">
<id column="emp_no" property="empNo"/>
<result column="emp_name" property="empName" />
<result column="emp_tel" property="empTel" />
<result column="emp_address" property="empAddress" />
</collection>
</resultMap>
<select id="getDeptDetilByID" resultMap="DeptDetailMap">
select * from tb_department d,tb_employee e where e.dept_no=d.dept_no and e.dept_no=#{id};
</select>
n 對1關聯對映:和1 對1 相同 使用 聚合屬性
n 對n 關聯對映 : 和 1 對n 相同使用 聚合集合
nb(牛逼) hashmap對映
public List<Map<String,Object>> getEmpBymaplist() throws Exception;
<select id="getEmpBymaplist" resultType="hashmap">
select * from tb_employee e , tb_department d where e.dept_no= d.dept_no ;
</select>
// 測試
SqlSession session = sqlSessionFactory.openSession();
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Map<String, Object>> data = mapper.getEmpBymaplist();
System.out.println(data);
session.commit();
session.close();
hashmap 對映就是不把資料對映到模型,而是對映到hashmap ,此處此種方法靈活,少配置
八、快取
使用快取可以使應用更快地獲取資料,避免頻繁的資料庫互動 ,尤其是在查詢越多 、快取命中率越高的情況下,使用快取的作用就越明顯 。 MyBatis 作為持久化框架 , 提供了非常強大的查詢快取特性,可以非常方便地配置和定製使用 。一般提到 MyB atis 快取 的時候,都是指二級快取。 一級快取( 也叫 本地快取〉預設會啟用,並且不能控制,因此很少會提到 。
mybaits 一級快取
mybatis一級快取是 回話級別的快取,也就是在同一個sqlsession 會話中的相同查詢,會使用快取資料,並不會在從新發送sql到資料庫,除非快取中沒有資料才會重新發送sql重新查詢。
快取原理: MyBatis 會把執行的方法和引數通過演算法生成快取的鍵值,將鍵值和查詢結果存入一個 Map物件中。如果同一個 SqlSession 中執行的方法和引數完全一致,那麼通過演算法會生成相同的鍵值,當 Map 快取物件中己經存在該鍵值時,則會返回快取中的物件。
mybaits一級快取失效的集中情況:
-
第二次查詢前 呼叫 session.clearCache()
-
兩次查詢 之間執行了更新操作 (INSERT UPDATE DELETE)
-
select 標籤 flushCache="true"
-
session 關閉
mybatis 二級快取
mybatis 二級快取是 namespace 空間級別的快取,跟session 無關,即便在不同的session回話中,呼叫同一名稱空間(namespace)下的方法做相同條件的查詢,都可以使用到快取資料。所以二級快取是跨 session的。mybatis 預設是不啟用二級快取的,使用者可以自行開啟,同時還可以配置第三方的 快取框架。
關於二級快取,mybaits框架本身也有響應的實現,只是比較簡單,通常開發中使用的第三方快取技術包括
ehcache
memcached
redis
開啟 mybatis的方法
mybatis.xml 主配置檔案
<setting name="cacheEnabled" value="true"/>
mapper.xml 對映配置檔案
<mapper namespace="xxxx">
<cache></cache>
</mapper>
對映語句檔案中的所有 select 語句將會被快取。
對映語句檔案中的所有 insert,update 和 delete 語句會重新整理快取。
快取會使用 Least Recently Used(LRU,最近最少使用的)演算法來收回。
根據時間表(比如 no Flush Interval,沒有重新整理間隔), 快取不會以任何時間順序 來重新整理。
快取會儲存列表集合或物件(無論查詢方法返回什麼)的 1024 個引用。
快取會被視為是 read/write(可讀/可寫)的快取,意味著物件檢索不是共享的,而 且可以安全地被呼叫者修改,而不干擾其他呼叫者或執行緒所做的潛在修改。
model 實體類 實現序列化介面
public class GroupModel implements Serializable {
}
配置第三方 快取技術
這裡以ehcache為例,新增依賴
<!-- ehcache 核心包 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.8</version>
</dependency>
<!-- mybatis-ehcache適配包 -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>
ehcache.xml 核心配置檔案( classpath下)
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="E:\new"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
</ehcache>
引用
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
九、mybatis-generate外掛
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="F:\repo\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" />
<context id="mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat" >
<property name="beginningDelimiter" value=" "/>
<property name="endingDelimiter" value=" "/>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql:///test"
userId="root"
password="root">
</jdbcConnection>
<javaModelGenerator targetPackage="com.xingxue.ssm.beans" targetProject="src\main\java" >
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.xingxue.ssm.dao.mapper" targetProject="src\main\java"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.xingxue.ssm.dao" targetProject="src\main\java"/>
<table tableName="%">
<generatedKey column="id" sqlStatement="MySql"/>
</table>
</context>
</generatorConfiguration>
十、PageHeper 外掛
1、介紹
pageHeper是過國內的一個大神基於基於mybatis開發的一款分頁外掛,目前這個開源專案託管到GitHub上,專案地址https://github.com/pagehelper/Mybatis-PageHelper。
2、使用(使用5.x版本)
① Pom檔案中新增依賴
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
②mybaits配置檔案中整合
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="reasonable" value="false"/> <property name="returnPageInfo" value="none"/> </plugin> </plugins>
③程式碼中使用
@Controller @Scope("prototype") public class StrutsAction extends ActionSupport { //依賴服務層 @Autowired private EmpService empService; public String hello(){ try { PageHelper.startPage(2,7,true); List<TbEmployee> list = empService.getAll(); //輸出資料 for (TbEmployee emp :list){ System.out.println(emp); } //獲得詳細的分頁資訊 PageInfo<TbEmployee> pageInfo = new PageInfo<>(list); System.out.println(pageInfo); } catch (Exception e) { e.printStackTrace(); } return "hello"; } }