1、MyBatis簡介
MyBatis是這個框架現在的名字,而此框架最早的名字是IBatis,其名字的含義是“internet”、“abatis”兩個單詞的組合,是在2002年的時候開始的一個開源項目,在2010年6月16日Apache將項目交與Google進行管理,更名MyBatis。所以2010年之后,MyBatis框架逐漸成為主流,比Hibernate發展更快。
IBatis和MyBatis兩者的操作原理是相同的。IBatis變為了MyBatis之后,核心操作沒有改變,但是配置部分有部分變化。
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
持久層發展:實體Bean的設計思想 → JDO → Hibernate → MyBatis → JPA標准。MyBatis的性能優於Hibernate。
MyBatis官網:http://www.mybatis.org/mybatis-3/
2、第一個MyBatis程序
本次使用Eclipse的Maven進行項目的構建,在pom.xml文件中添加如下代碼;如果使用普通Java項目按需添加Jar包即可。
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency>
在項目下新建目錄:config,將config目錄添加到classpath中(Build Path)。
范例:配置數據庫信息config/dbconfig.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF8 username=root password=mysqladmin
范例:MyBatis核心配置文件config/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="dbconfig.properties"/> <environments default="development"> <!-- 定義數據庫連接池 --> <environment id="development"> <!-- 一個數據庫的資源配置 --> <transactionManager type="JDBC"/> <!-- 進行事務管理 --> <dataSource type="POOLED"> <!-- 配置數據源 --> <!-- 數據庫的驅動程序路徑,配置的mysql驅動包中的類名稱 --> <property name="driver" value="${driver}"/> <!-- 數據庫的連接地址 --> <property name="url" value="${url}"/> <!-- 數據庫連接的用戶名 --> <property name="username" value="${username}"/> <!-- 數據庫的連接密碼 --> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 配置的是每一張表的映射文件 --> <mappers> <!-- 映射文件路徑, 與POJO類同包 --> <mapper resource="com/github/logsave/pojo/EmpMapper.xml"/> </mappers> </configuration>
對於一些配置做如下解釋:
- 關於“<transactionManager type="jdbc" /> ”配置
此處表示進行事務的配置,但是在MyBatis中有兩種事務配置方式:- JDBC :表示使用 JDBC 這種比較簡單的方式進行事務的提交或回滾,同時它依賴於從數據源得到的連接來管理事務形式;
- MANAGED:此配置幾乎沒有什么用處,它即不提交事務也不回滾事務,而是讓容器來管理整個生命周期(例如:Spring 就是一個容器,負責所有對象的生命周期的控制) 。
- 關於“<dataSource type="POOLED"> ”配置
dataSource 主要使用基本的 JDBC 數據源接口來配置 JDBC 連接對象。而在 MyBatis 之中提供有三種可用的數據源配置類型:- UNPOOLED:這個數據源的實現是每次請求時簡單打開和關閉連接操作。不過它的性能有一些慢,如果是一些簡單的應用程序可以適用,因為它不需要及時取得可用連接。不過不同的數據庫對此操作的表現也有所不同,所以對某些數據庫來說配置數據源不重要,那么使用的機會也就少了,幾乎不用;
- POOLED :是 JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例時必要的初始連接和認證時間,速度會快一些,這個是現在開發之中主要使用的形式;
- JNDI:使用一些容器里面配置的數據庫連接池,此處就是配置一個名稱引用。
- 關於“<mappers> ”配置
這塊為 MyBatis 的核心配置,主要是利用它來決定操作的數據表。
建立一張emp表,創建對應的簡單Java類也是Emp類。
范例:建立數據庫腳本
-- 創建'mybatis'數據庫 CREATE DATABASE mybatis CHARACTER SET UTF8; -- 創建'emp'數據表 CREATE TABLE emp ( empno INT(4), ename VARCHAR(10) NOT NULL , job VARCHAR(9) , mgr INT(4) , hiredate DATE , sal DOUBLE(7,2) , PRIMARY KEY (empno) );
范例:定義簡單Java類--Emp.java
package com.github.logsave.pojo; import java.util.Date; public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private Date hiredate; private double sal; public Integer getEmpno() { return empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public Integer getMgr() { return mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } @Override public String toString() { return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal=" + sal + "]"; } }
此時雖然建立了Java類,但是簡單Java類一定需要一個與它配合的映射文件。數據庫Emp表對應的簡單Java類是Emp.java,與Java類同一路徑下新建EmpMapper.xml文件。
范例:定義EmpMapper.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"> <!-- 每個POJO都對應MyBatis的一個命名空間,不能重復。 設置命名空間,可以與不同表的同類型操作進行區分,使用時以“namespace.id”的方式調用。
命名空間任意命名,均可正常調用,確保唯一性,一般按表名稱實體類或表名稱。 resultType使用全路徑。 --> <mapper namespace="com.github.logsave.pojo.EmpMapper"> <select id="selOne" resultType="com.github.logsave.pojo.Emp"> SELECT * FROM emp WHERE empno = #{empno} </select> <insert id="creatOne" parameterType="com.github.logsave.pojo.Emp"> INSERT INTO emp(empno,ename,job,mgr,hiredate,sal) VALUES (#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal}) </insert> </mapper>
增加操作之中是針對於簡單Java類之中的內容進行取出並填充,所以在訪問屬性的時候使用“#{屬性名稱}”,編寫SQL語句時最后一定不要加“;”。
多個XML配置文件及POJO之間相互引用,初學MyBatis容易出錯。配置文件之間的引用關系如下圖:
范例:編寫程序完成數據增加操作
package com.github.logsave.test; import java.io.IOException; import java.io.Reader; import java.util.Date; 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 com.github.logsave.pojo.Emp; public class Test01 { public static void creat(SqlSession sqlSession) { Emp emp = new Emp(); /** * 測試時運行第二次會報錯:Duplicate entry '7499' for key 'PRIMARY' * 原因是主鍵沖突了,修改Empno即可。 */ emp.setEmpno(7499); emp.setEname("ALLEN"); emp.setJob("SALESMAN"); emp.setMgr(7695); emp.setHiredate(new Date()); emp.setSal(1600.00); System.out.println("數據更新行數:" + sqlSession.insert("com.github.logsave.pojo.EmpMapper.creatOne",emp)); sqlSession.commit(); // 事務提交 } public static void selectByEmpNo(SqlSession sqlSession,int empno) { System.out.println(sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.selOne",empno)); } public static void main(String[] args) { try { // 1、取得操作的SqlSession對象 String resource = "mybatis-config.xml"; // MyBatis配置文件路徑 Reader reader = Resources.getResourceAsReader(resource); // 當前配置文件輸入流 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 數據庫會話工廠 SqlSession sqlSession = sqlSessionFactory.openSession(); // 取得連接 // 2、操作簡單Java類 // creat(sqlSession); // 增加數據 selectByEmpNo(sqlSession,7499); // 按empno查詢數據 sqlSession.close(); // 關閉連接 } catch(IOException e) { e.printStackTrace(); } } }
此時數據庫之中已經正常保存了我們添加的數據。
總結一下MyBatis操作的步驟:
- 通過 Resources 取得配置文件(mybatis-config.xml )的信息,通過 Resource 取得一個 Reader 對象路徑;
- 通過此 Reader對象肯定要讀取配置,讀取的配置用於實例化 SqlSessionFactoryBuilder 類對象,通過 SqlSessionBuilder 來建立 SqlSessionFactory 類對象;
- 利用 SqlSessionFactory 打開 SqlSession 對象;
- 利用 SqlSession 來實現數據的 CRUD 操作;
- 如果是更新則提交事務后關閉連接。