【mybatis】關於使用mybatis框架的幾點說明

#1-> 配置文件MyBatisConfg.xml

在配置文件中的<configuration>裏的標籤有嚴格的標籤擺放順序,如果順序不對,會報錯。

例如,我之前把<settings>標籤放在了<properties>標籤之前,系統報錯如下

 <configuration>標籤裏的嚴格順序應該是:

properties -> settings -> typeAliases -> typeHandlers -> objectFactory -> objectWrapperFactory -> reflectorFactory -> plugins -> environments -> databaseIdProvider -> mappers

-> MyBatisConfg.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="mysqlconfg.properties"/>
    <!--日誌配置-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--配置mysql的環境-->
    <environments default="mysql">
        <environment id="mysql">
            <!--配置事務類型-->
            <transactionManager type="JDBC"/>
            <!--配置連接池/數據源類型-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射關係-->
    <mappers>
        <mapper resource="com/yy/dao/IUserMapper.xml"/>
    </mappers>
</configuration>

-> mysqlconfg.properties

注意MySQL6以後的driver寫法和5之前的有點區別。

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost/maven_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username = root
password = 1007

#2-> 映射文件IUserMapper.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.yy.dao.IUserMapper">

    <select id="findAll" resultType="com.yy.domain.User">
        select * from user;
    </select>

</mapper>

需要注意的是這裏的resultType必須指定全限定類名,不能寫別稱,之前的項目可以寫別稱是因爲添加了掃描機制。

#3-> mybatis框架執行過程中對應的設計模式

這是一個@TestmybatisTest(),一個完整的通過mybatis框架從數據庫中獲取數據放到List<User>並打印輸出的demo。

    @Test
    public void mybatisTest() throws IOException {
        // 1.讀取配置文件    
        InputStream inputStream = Resources.getResourceAsStream("MyBatisConfg.xml");
        // 2.創建SQLSessionFactory工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);
        // 3.使用工廠生產SQLSession對象
        SqlSession session = factory.openSession();
        // 4.使用sqlsession創建Dao接口(Mapper)的代理對象
        IUserMapper userMapper = session.getMapper(IUserMapper.class);
        // 5.使用代理對象執行方法
        List<User> users = userMapper.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        // 6.釋放資源
        session.close();
        inputStream.close();
    }

(1)讀取配置文件

InputStream inputStream = Resources.getResourceAsStream("MyBatisConfg.xml");

#-> 關於讀取配置文件的傳統方式,(現在開發中一般都不用)
絕對路徑:E:\IdeaProjects\MyBatis\mybatis_01\src\main\resources\MyBatisConfg.xml
相對路徑:src\main\resources\MyBatisConfg.xml
#-> 開發中採取的方式是
第一個:使用類加載器,它只能讀取類路徑的配置文件
第二個:使用ServletContext對象的getRealPath() 

(2)創建SqlSessionFactory工廠

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

創建SqlSessionFactory工廠mybatis使用了[構建者模式],builder就是構建者。
構建者模式-優點:把對象的創建細節隱藏,讓使用者直接調用方法即可拿到對象。 

(3)使用工廠生產SqlSession對象

SqlSession session = factory.openSession();

生產SqlSession使用了[工廠模式]。
工廠模式-優點:解耦——降低類之間的依賴關係。 

(4)使用sqlsession創建Dao接口(Mapper)的代理對象

 IUserMapper userMapper = session.getMapper(IUserMapper.class);

創建Dao接口實現類使用了[代理模式]。
代理模式-優點:不修改源碼的基礎上對已有方法增強。 

完整的MyBatisTest()

package com.yy.test;

import com.yy.dao.IUserMapper;
import com.yy.domain.User;
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 org.junit.Test;

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

public class MyBatisTest {

    @Test
    public void mybatisTest() throws IOException {
        // 1.讀取配置文件
        /* #-> 關於讀取配置文件的傳統方式,開發中一般都不用
        * 絕對路徑:E:\IdeaProjects\MyBatis\mybatis_01\src\main\resources\MyBatisConfg.xml
        * 相對路徑:src\main\resources\MyBatisConfg.xml
        * #-> 開發中採取的方式是
        * 第一個:使用類加載器,它只能讀取類路徑的配置文件
        * 第二個:使用ServletContext對象的getRealPath()
        * */
        InputStream inputStream = Resources.getResourceAsStream("MyBatisConfg.xml");
        // 2.創建SQLSessionFactory工廠
        /* 創建工廠mybatis使用了[構建者模式],builder就是構建者。
        *  構建者模式-優點:把對象的創建細節隱藏,讓使用者直接調用方法即可拿到對象 */
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);
        // 3.使用工廠生產SQLSession對象
        /* 生產SqlSession使用了工廠模式,
        *  工廠模式-優點:解耦——降低類之間的依賴關係 */
        SqlSession session = factory.openSession();
        // 4.使用sqlsession創建Dao接口(Mapper)的代理對象
        /* 創建Dao接口實現類使用了[代理模式]
        *  代理模式-優點:不修改源碼的基礎上對已有方法增強 */
        IUserMapper userMapper = session.getMapper(IUserMapper.class);
        // 5.使用代理對象執行方法
        List<User> users = userMapper.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        // 6.釋放資源
        session.close();
        inputStream.close();
    }
}

 

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