Mybatis第一篇【介紹、快速入門、工做流程】

什麼是MyBatis

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis。是一個基於Java的持久層框架java

爲何咱們要用Mybatis?

不管是Mybatis、Hibernate都是ORM的一種實現框架,都是對JDBC的一種封裝!mysql

這裏寫圖片描述

到目前爲止,咱們已經在持久層中學了幾種技術了…sql

  • Hibernate
  • jdbc
  • SpringDAO

那咱們爲啥還要學Mybatis呢???如今Mybatis在業內大行其道,那爲啥他能那麼火呢??數據庫

Hibernate是一個比較老舊的框架,用過他的同窗都知道,只要你會用,用起來十分舒服…啥sql代碼都不用寫…可是呢,它也是有的缺點::處理複雜業務時,靈活度差, 複雜的HQL難寫難理解,例如多表查詢的HQL語句apache

而JDBC很容易理解,就那麼幾個固定的步驟,就是開發起來太麻煩了,由於什麼都要咱們本身幹..markdown

而SpringDAO其實就是JDBC的一層封裝,就相似於dbutils同樣,沒有特別出彩的地方….session

咱們能夠認爲,Mybatis就是jdbc和Hibernate之間的一個平衡點…畢竟如今業界都是用這個框架,咱們也不能不學呀!mybatis


Mybatis快速入門

其實咱們已經學過了Hibernate了,對於Mybatis入門其實就很是相似的。所以就很簡單就能掌握基本的開發了…oracle

導入開發包

導入Mybatis開發包app

  • mybatis-3.1.1.jar
  • commons-logging-1.1.1.jar
  • log4j-1.2.16.jar
  • cglib-2.2.2.jar
  • asm-3.3.1.jar

導入mysql/oracle開發包

  • mysql-connector-java-5.1.7-bin.jar
  • Oracle 11g 11.2.0.1.0 JDBC_ojdbc6.jar

準備測試工做

建立一張表

create table students( id int(5) primary key, name varchar(10), sal double(8,2) );

建立實體:

/** * Created by ozc on 2017/7/21. */

public class Student {
    private Integer id;
    private String name;
    private Double sal;

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }
}

建立mybatis配置文件

建立mybatis的配置文件,配置數據庫的信息….數據庫咱們能夠配置多個,可是默認的只能用一個…

<?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="db.properties"/>

    <!-- 設置一個默認的鏈接環境信息 -->
    <environments default="mysql_developer">
        <!-- 鏈接環境信息,取一個任意惟一的名字 -->
        <environment id="mysql_developer">
            <!-- mybatis使用jdbc事務管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使用鏈接池方式來獲取鏈接 -->
            <dataSource type="pooled">
                <!-- 配置與數據庫交互的4個必要屬性 -->
                <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>


</configuration>

編寫工具類測試是否獲取到鏈接

使用Mybatis的API來建立一個工具類,經過mybatis配置文件與數據庫的信息,獲得Connection對象

package cn.itcast.javaee.mybatis.util;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/** * 工具類 * @author AdminTC */
public class MybatisUtil {
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sqlSessionFactory;
    /** * 加載位於src/mybatis.xml配置文件 */
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    /** * 禁止外界經過new方法建立 */
    private MybatisUtil(){}
    /** * 獲取SqlSession */
    public static SqlSession getSqlSession(){
        //從當前線程中獲取SqlSession對象
        SqlSession sqlSession = threadLocal.get();
        //若是SqlSession對象爲空
        if(sqlSession == null){
            //在SqlSessionFactory非空的狀況下,獲取SqlSession對象
            sqlSession = sqlSessionFactory.openSession();
            //將SqlSession對象與當前線程綁定在一塊兒
            threadLocal.set(sqlSession);
        }
        //返回SqlSession對象
        return sqlSession;
    }
    /** * 關閉SqlSession與當前線程分開 */
    public static void closeSqlSession(){
        //從當前線程中獲取SqlSession對象
        SqlSession sqlSession = threadLocal.get();
        //若是SqlSession對象非空
        if(sqlSession != null){
            //關閉SqlSession對象
            sqlSession.close();
            //分開當前線程與SqlSession對象的關係,目的是讓GC儘早回收
            threadLocal.remove();
        }
    }   
    /** * 測試 */
    public static void main(String[] args) {
        Connection conn = MybatisUtil.getSqlSession().getConnection();
        System.out.println(conn!=null?"鏈接成功":"鏈接失敗");
    }
}

建立實體與映射關係文件

配置實體與表的映射關係

<?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="cn.itcast.javaee.mybatis.app04.Student"> 

    <!-- resultMap標籤:映射實體與表 type屬性:表示實體全路徑名 id屬性:爲實體與表的映射取一個任意的惟一的名字 -->
    <resultMap type="student" id="studentMap">
        <!-- id標籤:映射主鍵屬性 result標籤:映射非主鍵屬性 property屬性:實體的屬性名 column屬性:表的字段名 -->                         
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sal" column="sal"/>
    </resultMap>

</mapper>

如今咱們已經有了Mybatis的配置文件和表與實體以前的映射文件了,所以咱們要將配置文件和映射文件關聯起來

<mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>

在測試類上,咱們是能夠獲取獲得鏈接的

這裏寫圖片描述


編寫DAO

public class StudentDao {


    public void add(Student student) throws Exception {
        //獲得鏈接對象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        sqlSession.insert();
    }

    public static void main(String[] args) throws Exception {

        StudentDao studentDao = new StudentDao();

        Student student = new Student(1, "zhongfucheng", 10000D);
        studentDao.add(student);

    }
}

到如今爲止,咱們實體與表的映射文件僅僅映射了實體屬性與表的字段的關係…

咱們在Hibernate中若是想要插入數據什麼的,只要調用save()方法就好了。Hibernate是自動化屏蔽掉了數據庫的差別,而咱們Mybatis是須要本身手動編寫SQL代碼的

那麼SQL代碼是寫在哪裏的呢???明顯地,咱們做爲一個框架,不可能在程序中寫SQL,咱們是在實體與表的映射文件中寫的!

Mybatis實體與表的映射文件中提供了insert標籤【SQL代碼片斷】供咱們使用

//在JDBC中咱們一般使用?號做爲佔位符,而在Mybatis中,咱們是使用#{}做爲佔位符
    //parameterType咱們指定了傳入參數的類型
    //#{}實際上就是調用了Student屬性的get方法

    <insert id="add" parameterType="Student">

        INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal});
    </insert>

在程序中調用映射文件的SQL代碼片斷

public void add(Student student) throws Exception {
        //獲得鏈接對象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        try{
            //映射文件的命名空間.SQL片斷的ID,就能夠調用對應的映射文件中的SQL
            sqlSession.insert("StudentID.add", student);
            sqlSession.commit();
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }

值得注意的是:Mybatis中的事務是默認開啓的,所以咱們在完成操做之後,須要咱們手動去提交事務!


Mybatis工做流程

  • 經過Reader對象讀取Mybatis映射文件
  • 經過SqlSessionFactoryBuilder對象建立SqlSessionFactory對象
  • 獲取當前線程的SQLSession
  • 事務默認開啓
  • 經過SQLSession讀取映射文件中的操做編號,從而讀取SQL語句
  • 提交事務
  • 關閉資源
相關文章
相關標籤/搜索