天天看點

Mybatis-原生Mybatis原理分析

MyBatis架構概述

        mybatis是一個優秀的基于java的持久層架構,它内部封裝了jdbc,使開發者隻需要關注sql語句本身,而不需要花費精力去處理加載驅動、建立連接配接、建立statement等繁雜的過程。

        mybatis通過xml或注解的方式将要執行的各種statement配置起來,并通過java對象和statement中sql的動态參數進行映射生成最終執行的sql語句,最後由mybatis架構執行sql并将結果映射為java對象并傳回。

        采用ORM思想解決了實體和資料庫映射的問題,對jdbc進行了封裝,屏蔽了jdbc api底層通路細節,使我們不用與jdbc api打交道,就可以完成對資料庫的持久化操作。 為了我們能夠更好掌握架構運作的内部過程,并且有更好的體驗,下面我們将從自定義Mybatis架構開始來學習架構。此時我們将會體驗架構從無到有的過程體驗,也能夠很好的綜合前面階段所學的基礎。

本文是Mybatis 使用代理dao的方式實作增删改查的原理

首先編寫一個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>

    <!--配置Mybatis的環境-->
        <environments default="mysql">
        <!--配置mysql環境-->
        <environment id="mysql">
            <!--配置事務類型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置資料源,也就是連接配接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm? 
                   characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置mybatis映射的位置-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>
           

在resources目錄下 建立一個mappers目錄,在然後建立一個UserMapper.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">

<mapper namespace="com.jd.dao.UserMapper">

    <select id="findUser" resultType="com.jd.domain.User">
        select id ,userName as userName,birthday as birthday,sex as sex,
        address as address FROM user where yn=1
    </select>

</mapper>
           

建立一個實體類

@Data
public class User {
    private Integer id;
    private Date birthday;
    private String userName;
    private String sex;
    private String address;
    private Integer yn;
}
           

建立一個接口類

public interface UserMapper {
    /**
     * 查詢所用使用者
     */

    public List<User> findUser();

}
           

編寫測試類

public class MybatisTest {

    @Test
    public void test() throws IOException {
        //1、讀取配置檔案
        InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
        //2、建立SqlSessionFactory的建構者對象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3、使用建構者建立工廠對象SqlSessionFactory
        SqlSessionFactory factory= builder.build(in);
        //4、使用SqlSessionFactory建立SqlSession
        SqlSession session=factory.openSession();
        //5、使用SqlSession建立dao接口的代理對象
        UserMapper userDao =session.getMapper(UserMapper.class);
        //6、使用代理對象執行查詢方法
        List<User> list=userDao.findUser();

        for (User user:list){
            System.out.println(user);
        }
        //7、釋放資源
        session.close();
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
      
}
           

接下來分析這個查詢的過程,這其中使用的建構者設計模式、工廠模式、代理模式

1、 InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");  此處使用的是dom4j 解析xml檔案,擷取驅動 連接配接 賬号 密碼 和映射配置檔案

2、//2、建立SqlSessionFactory的建構者對象

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //3、使用建構者建立工廠對象SqlSessionFactory

        SqlSessionFactory factory= builder.build(in);   

此處使用的是建構者設計模式,優勢:把對象的建立細節隐藏,使用者直接調用方法即可拿到對象

3、//4、使用SqlSessionFactory建立SqlSession

        SqlSession session=factory.openSession();

此處使用的是工廠設計模式,生産SqlSession使用了工廠設計模式,優勢:解耦(降低了類之間的依賴關系)

4、//5、使用SqlSession建立dao接口的代理對象

        UserMapper userDao =session.getMapper(UserMapper.class);

建立dao層的接口實作類使用的是代理設計模式,優勢,不修改源碼的基礎上對已有方法的增強

5、根據之前的配置檔案,執行sql語句

<mapper namespace="com.jd.dao.UserMapper">

    <select id="findUser" resultType="com.jd.domain.User">

        select id ,userName as userName,birthday as birthday,sex as sex,

        address as address FROM user where yn=1

    </select>

</mapper>

namespace ,是接口類相同

id 是接口類裡的方法,

resultType,對傳回的結果進行封裝

本文章寫的是使用代理對象方式,調用接口類的方法,執行sql語句

Mybatis-原生Mybatis原理分析

接下來總結一下:Mybatis 使用代理dao的方式實作增删改查的原理,無非就是做了兩件事

1、解析xml,把資料進行封裝

2、建立代理對象,調用selectList方法

繼續閱讀