【MyBatis】 MyBatis入門


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>

對於一些配置做如下解釋:

  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'數據庫
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 操作;
  • 如果是更新則提交事務后關閉連接。

程序源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM