1. 程式人生 > 其它 >MyBatis框架總結一(快速入門)

MyBatis框架總結一(快速入門)

技術標籤:Javamybatismysqljava資料庫

MyBatis框架總結

1.框架概述

1.1 什麼是框架

  • 框架是一個半成品,對於Java語言來說,框架就是封裝了別人的程式碼。在框架的基礎上我們在進一步開發,雖是一種拿來主義,但開發效率較高。

1.2 框架解決什麼問題

  • 解決的是技術整合問題。軟體開發環境和規模都很大,不可能任何一個專案的程式碼都從零開始,此時就需要一個非常優秀的框架把基礎技術整合完畢,我們在他的基礎上進一步開發。提高效能,易擴充套件,易維護,最終提高整個團隊的開發效率。

1.3 怎麼使用框架

Java的框架是具有一些共性:

  • 匯入jar包
  • 框架執行細節定義,也就是編寫配置檔案(xml)
  • 呼叫框架中的api

1.4 原生JDBC案例的問題

  • 頻繁連線,釋放資料庫資源,降低系統性能
  • SQL語句硬編碼,難以維護
  • 引數和佔位符對應問題
  • 結果集解析複雜,列名硬編碼

1.5 MyBatis框架概述

  • Mybatis是一個優秀的持久層框架(Dao層框架),它是對JDBC的封裝,使得開發者只需要關注Sql語句(業務)本身即可,無需開發者處理載入驅動、獲取連線、建立Statement等繁瑣的過程。

  • Mybatis最大的特點是把Sql語句寫在XML配置檔案當中。而且Mybatis執行完Sql語句之後可以以物件形式返回(POJO/POJO集合等)。

  • Mybatis是一個實現了ORM思想的持久層框架。

  • ORM:Object/Relation Mapping 物件/關係對映。

  • ORM思想:將資料庫中的關係資料表對映為JAVA中的物件,把對資料表的操作轉換為對物件的操作,實現面向物件程式設計。因此ORM的目的是使得開發人員以面向物件的思想來操作資料庫。

    比如:原來insert操作使用的是SQL語句"insert into…",如果使用實現了ORM思想的持久層框架,就可以在Java程式中直接呼叫api,比如insert(User),達到操作物件即操作資料庫的效果。Hibernate框架是一個全自動的ORM持久層框架,只需要編寫POJO,在xml中定義好Pojo屬性和資料表字段的對映/對應關係,就可以在java中實現類似 insert(User)的操作。Sql語句都不用寫。但是因為效能等問題,市場佔有率越來越低

    Mybatis框架是一個半自動的ORM持久層框架,也可以在Java中實現類似 insert(User)的操作最終操作資料庫,但是需要我們自己寫Sql語句。Mybatis是目前比較流行的Dao層框架。

2. MyBatis框架快速上手

步驟

  • 匯入MyBatis框架jar包
  • 配置檔案
  • SqlSessionFactoryBuilder,傳入位元組輸入流,構建工廠
  • SqlSessionFactory,建立SqlSession
  • SqlSession執行selectList方法查詢資料

2.1 jar包

需要匯入的jar包如下所示
在這裡插入圖片描述

2.2 配置檔案

在src目錄下匯入配置檔案:SqlMapConfig.xml,UserMapper.xml,配置檔案內容如下

  • SqlMapConfig.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>
    <!--
    environments:執行環境,可以配置多個
    default="development"預設,值=development開發環境

    environment執行環境,配置一個
    id="development" id唯一性的屬性 開發環境
    id = "produce"  生產環境
    id = "test"  測試環境
    -->
    <environments default="development">
        <environment id="development">
            <!--
                transactionManager:事務管理配置
                type="JDBC" 使用的是最原始的JDBC的事務處理機制
            -->
            <transactionManager type="JDBC" />
            <!--
                dataSource 配置資料來源
                type="POOLED"使用連線池
                Mybatis自帶連線池 type="UNPOOLED"不用自帶的連線池

            -->
            <dataSource type="POOLED">
                <!--
                    配置的是資料庫連線的四大資訊
                -->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!--
            配置的是對映關係 ORM Java物件和資料表、
    -->
    <mappers>
        <!--
            單獨的對映關係
            resource資源,對映檔案的路徑
            UserMapper.xml 配置的是資料表User的SQL語句
        -->
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>    

重點要配置的地方有兩處:

 <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8" />

這裡的/mybatis指的是資料庫中表的名稱,必須有相應的表。

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

最後定義的對映關係,表示對映的xml檔案叫做UserMapper.xml,如果是其他xml檔案,就將名字更改或新增新的對映。

  • UserMapper.xml
    UserMapper中定義SQL語句和對映關係,以查詢user表中全部資料為例
<?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名稱空間,屬性值要求唯一,
   整個的SQL語句配置檔案
-->
<mapper namespace="test">

   <!--
      select標籤,配置的是查詢語句
      id屬性:和介面中方法名對應,屬性值在當前檔案中具有唯一性,此處的id="queryList"
      框架執行SQL語句: namespace.queryList

      resultType:查詢的結果集,是pojo物件
      標籤體是SQL語句
   -->
   <select id="queryList" resultType="com.sz.pojo.User">
      select * from user
   </select>
   <!--
      配置主鍵查詢的SQL語句,標籤select
      id 具有唯一性,查詢是有結果集的
      標籤中屬性resultType:配置結果集的型別
      SQL語句有引數
      標籤中屬性 parameterType:SQL語句的引數型別
   -->
   <select id="queryUserById" resultType="com.sz.pojo.User" parameterType="Integer">
      <!--
           SQL語句,引數不能寫問號
           取引數  #{引數名}
           引數名,如果只有一個引數,基本型別及其包裝類和String 任意
      -->
      select * from user where id = #{id}
   </select>
</mapper>

2.3 pojo物件

  • User
package com.sz.pojo;

import java.util.Date;

public class User {

    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

    public User() {
    }

    public User(int id, String username, String sex, Date birthday, String address) {
        this.id = id;
        this.username = username;
        this.sex = sex;
        this.birthday = birthday;
        this.address = address;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday(Date date) {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}

2.4 測試

package com.sz.mybatis;

import com.sz.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * Mybatis框架的快速入門
 * SQL語句,連線資訊,寫在配置檔案中
 * SqlMapConfig.xml配置的是連線資訊
 * UserMapper.xml配置的資料表user的SQL語句
 */
public class Quickstart {

    /**
     * 需求:查詢user表,資料儲存到List集合中
     * 實現步驟:
     *    1:建立物件 SqlSessionFactoryBuilder
     *      工廠的構建者物件,作用:建立SQLSession物件工廠
     *      讀取配置檔案
     *
     *    2:SqlSessionFactory工廠的建立
     *      SqlSession介面實現類物件
     *
     *    3:SqlSession介面實現類物件
     *     呼叫方法 select查詢資料表
     *    4:輸出查詢結果
     *
     *    5:釋放資源
     *
     */
    @Test
    public void myBatisQuickStart(){
        //1:建立物件 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        //使用sqlSessionFactoryBuilder方法build(),建立SqlSessionFactory物件
        // build方法讀取配置檔案,返回SqlSessionFactory物件,需要傳遞流物件,流物件繫結資料庫配置檔案
        InputStream inputStream = Quickstart.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");

        // 2:SqlSessionFactory工廠的建立
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        // 工廠物件,獲取SqlSession介面實現類物件,工廠物件的方法openSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3:SqlSession介面實現類物件,呼叫方法 select查詢資料表
        // selectList方法的引數不是SQL語句,namespace+"."+id鎖定SQL語句 test.queryList
        List<User> users = sqlSession.selectList("test.queryList");

        for (User user:users){
            System.out.println(user);
        }
        // 釋放資源
        sqlSession.close();
    }

}

2.5 快速入門中的不足

需要手動填寫對映關係:

 List<User> users = sqlSession.selectList("test.queryList");