【MyBatis】 MyBatis入門

一、MyBatis簡介

MyBatis是這個框架如今的名字,而此框架最先的名字是IBatis,其名字的含義是「internet」、「abatis」兩個單詞的組合,是在2002年的時候開始的一個開源項目,在2010年6月16日Apache將項目交與Google進行管理,改名MyBatis。因此2010年以後,MyBatis框架逐漸成爲主流,比Hibernate發展更快。java

IBatis和MyBatis二者的操做原理是相同的。IBatis變爲了MyBatis以後,核心操做沒有改變,可是配置部分有部分變化。mysql

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 能夠使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。git

持久層發展:實體Bean的設計思想 → JDO → Hibernate → MyBatis → JPA標準。MyBatis的性能優於Hibernate。github

MyBatis官網:http://www.mybatis.org/mybatis-3/sql

二、第一個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)。apache

範例:配置數據庫信息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>

對於一些配置作以下解釋:session

  1. 關於「<transactionManager type="jdbc" /> 」配置
    此處表示進行事務的配置,可是在MyBatis中有兩種事務配置方式:
    • JDBC :表示使用 JDBC 這種比較簡單的方式進行事務的提交或回滾,同時它依賴於從數據源獲得的鏈接來管理事務形式;
    • MANAGED:此配置幾乎沒有什麼用處,它即不提交事務也不回滾事務,而是讓容器來管理整個生命週期(例如:Spring 就是一個容器,負責全部對象的生命週期的控制) 。
  2. 關於「<dataSource type="POOLED"> 」配置
    dataSource 主要使用基本的 JDBC 數據源接口來配置 JDBC 鏈接對象。而在 MyBatis 之中提供有三種可用的數據源配置類型:
    • UNPOOLED:這個數據源的實現是每次請求時簡單打開和關閉鏈接操做。不過它的性能有一些慢,若是是一些簡單的應用程序能夠適用,由於它不須要及時取得可用鏈接。不過不一樣的數據庫對此操做的表現也有所不一樣,因此對某些數據庫來講配置數據源不重要,那麼使用的機會也就少了,幾乎不用;
    • POOLED :是 JDBC 鏈接對象的數據源鏈接池的實現,用來避免建立新的鏈接實例時必要的初始鏈接和認證時間,速度會快一些,這個是如今開發之中主要使用的形式;
    • JNDI:使用一些容器裏面配置的數據庫鏈接池,此處就是配置一個名稱引用。
  3. 關於「<mappers> 」配置
    這塊爲 MyBatis 的核心配置,主要是利用它來決定操做的數據表。

創建一張emp表,建立對應的簡單Java類也是Emp類。mybatis

範例:創建數據庫腳本

-- 建立'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文件。app

範例:定義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 { // 一、取得操做的SqlSession對象
            String resource = "mybatis-config.xml";                  // MyBatis配置文件路徑
            Reader reader = Resources.getResourceAsReader(resource); // 當前配置文件輸入流
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 數據庫會話工廠
            SqlSession sqlSession = sqlSessionFactory.openSession(); // 取得鏈接 // 二、操做簡單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 操做;
  • 若是是更新則提交事務後關閉鏈接。

程序源碼

相關文章
相關標籤/搜索