Mybatis學習(一)——概述

一、什麼是Mybatis

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

二、mybatis 最重要的三個類

每個Mybatis 都是以SqlSessionFactory 爲中心的,他可以通過SqlSessionFactoryBuilder來構建

InputStream in = Resources.getResourceAsStream(configFile);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);

1.SqlSessionFactoryBuild

局部的對象,僅在於加載XML配置文件,從XML 配置文件讀取MyBatis 的配置:事務、連接池、datasource、mybatis 的sql映射文件的路徑。
這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 實例的最佳範圍是方法範圍(也就是局部方法變量)。你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但是最好還是不要讓其一直存在以保證所有的 XML 解析資源開放給更重要的事情。

SqlSessionFactory

建議全局只出現一份SqlSessionFactory的實例,建議用單例模式來實現。
SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次,多次重建 SqlSessionFactory 被視爲一種代碼“壞味道(bad smell)”。因此  SqlSessionFactory 的最佳範圍是應用範圍。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的範圍是請求或方法範圍。
絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。也絕不能將 SqlSession 實例的引用放在任何類型的管理範圍中,比如 Serlvet 架構中的 HttpSession。如果你現在正在使用一種 Web 框架,要考慮 SqlSession 放在一個和 HTTP 請求對象相似的範圍中。換句話說,每次收到的 HTTP 請求,就可以打開一個 SqlSession,返回一個響應,就關閉它。這個關閉操作是很重要的,你應該把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。

三、mybatis 加載映射文件的三種方式

1.通過資源路徑加載
如果你的映射文件在資源文件夾下,那麼就可一通過這種方式來加載文件

<mapper resource="mapper1/studentMapper.xml"/>
//resource 後面的參數資源文件下的路徑

2.通過加載接口類來加載映射文件
如果你的配置映射文件和接口文件在同一個包下且同名,就可以這樣加載映射文件

<mapper class = "com.tulun.dao.OrderMapper"/>
//class 後面的參數是接口的全路徑

3.批量加載類接口和映射文件
這種方式可以掃描整個包的mapper 文件,需要映射文件和接口文件在一個包裏且同名

<package name = "com.tulun.dao"/>
 //name 後面的參數是映射文件所在的包名

四、一個簡單的小例子

需求:通過id 查找一個學生的信息
這是我們的數據表,student(d_id 指的是部門 id)
在這裏插入圖片描述
對應這張表,我們需要一個javaBean

public class Student {
    private Integer id;
    private String name;
    private String passward;
    private Dept  dept;

    public Student(){

    }
    public Student(Integer id ,String name,String passward) {
        this.id = id;
        this.name = name;
        this.passward = passward;
    }

    public Student(Integer id ,String name,String passward,Dept dept) {
        this.id = id;
        this.name = name;
        this.passward = passward;
        this.dept = dept;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDid(Dept dept) {
        this.dept = dept;
    }

    public String getName() {
        return name;
    }

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

    public Integer getId() {
        return id;
    }

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

    public String getPassward() {
        return passward;
}

    public void setPassward(String passward) {
        this.passward = passward;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + passward + '\'' +
                '}';
    }
}

我們需要一個接口以及一個接口映射文件

public interface StudentMapper {

    /**
     * 通過指定的id 查找一個學生
     * @param id
     * @return
     */
    public Student getStuById(Integer id);
}

映射文件

<?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="com.tulun.dao.StudentMapper">
    <select id="getStuById" resultType="com.tulun.bean.Student">
      select * from student where id = #{id}
  </select>
</mapper>

我們需要寫一個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>
    
    <!--
    setting 是一個全局的配置文件
    -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
            <setting name="logImpl" value="STDOUT_LOGGING" />
        </settings>
    <!--配置運行的環境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- allowMultiQueries :允許以;作爲SQL語句的分隔符 -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
<!--
        將我們寫好的sql映射文件註冊到全局文件
        -->
    <mappers>
        <mapper resource="mapper1/studentMapper.xml"/>
    </mappers>
</configuration>
public class Mybatisutils {
    /**
     * 1.根據XML文件(全局映射文件),獲取SqlSessionFactory對象
     * 有數據源一些運行環境信息
     * 2.SQL映射文件:配置了每一個SQL以及SQL的封裝規則
     * 3.將SQL 映射文件註冊到全局配置文件中
     * 4.寫代碼:
     * 1.根據全局配置文件得到SqlSessionFactory對象
     * 2.使用SqlSessionFactory獲取到SqlSession對象來執行增刪改查
     * 一個SqlSession就代表和數據庫的一次會話,用完關閉
     * 3.使用sql的唯一標識來告訴mybatis執行那個sql
     */
    public SqlSession getsession() throws IOException {
        String resource = "mybatis-conf.xml";
        //通過Resource 獲取mybatis 流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //獲取SqlSessionFactory 實例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //我們就可以從中獲得 SqlSession 的實例了。
        // SqlSession 完全包含了面向數據庫執行 SQL 命令所需的所有方法。
        // 你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }
}

這個例子就完成啦,我們來測試一下這個。

 public static void main(String[] args){
            Mybatisutils mybatisutils = new Mybatisutils();
            SqlSession session = null;
            try {
               session = mybatisutils.getsession();
               StudentMapper studentMapper = session.getMapper(StudentMapper.class);
                //單個參數查找測試
            Student student  = studentMapper.getStuById(1);
            System.out.println(student); 
                //手動提交
                session.commit();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(session != null){
                    session.close();
                }

            }
        }

在這裏插入圖片描述
我們總結一下:
1.寫與數據表相對應的javaBean
2.寫操作數據庫的接口
3.寫接口的映射文件,映射文件裏面包含操作數據庫需要得到SQL語句
4.寫Mybatis 配置文件,配置文件裏面配置了數據源,事務以及映射文件的路徑
5.加載配置文件,獲取接口實例。執行相應的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章