1. 程式人生 > >.Net轉Java自學之路—Mybatis框架篇二(SqlSession、原始開發、代理開發)

.Net轉Java自學之路—Mybatis框架篇二(SqlSession、原始開發、代理開發)

bat 包裝 version 輸出結果 except 方法註入 用戶 eas 同名

SqlSession範圍:

  1、SqlSessionFactoryBuilder:通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory。
    將SqlSessionFactory當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder,在需要創建SqlSessionFactory時,只需要new一次SqlSessionFactoryBuilder即可。

  2、SqlSessionFactory:通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory。在Mybatis和spring整合後,使用單例模式管理SqlSessionFactory。

  3、SqlSession:
    SqlSession是一個面向用戶的接口。它提供了很多的操作數據庫方法。
    SqlSession是線程不安全的,在SqlSession實現類中除了有接口中的方法,還有數據域屬性。
    SqlSession最佳應用場合在方法體內。定義成局部變量使用。

原始開發方式:

  程序需要編寫dao接口和dao實現類。在dao的實現類中需要註入SqlSessionFactory,在方法體內通過SqlSessionFactory創建SqlSession。

public class TestDaoImpl implements TestDao {
    
//通過構造函數方法註入SqlSessionFactory private SqlSessionFactory sqlSessionFactory; public TestDaoImpl(SqlSessionFactory sqlSessionFactory){ this.sqlSessionFactory=sqlSessionFactory; } public User findUserById(int id) throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); User user
=sqlSession.selectOne("test.findUserById",id); sqlSession.close(); return user; } public List<User> findUserByName(String username) throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); List<User> list = sqlSession.selectList("test.findUserByName",username); sqlSession.close(); return list; } ...... }

  由上述實例可發現原始開發方式存在的問題:
    1、dao接口實現類方法中存在大量模板方法。若將這些代碼提取,將大大降低工作量。
    2、調用SqlSession方法時將statement的id實施了硬編碼。
    3、調用sqlSession方法時傳入的變量,由於sqlSession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,所以不利於開發。

代理開發方式:

  1、配置mapper.xml映射文件。同時需要在SqlMapConfig.xml中加載UserMapper.xml。

  2、編寫mapper接口,需要遵循的一些開發規範,mybatis可以自動生成mapper接口實現類代理對象
    開發規範:
      》在mapper.xml中namespace的屬性值為mapper接口地址。

<?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接口的地址 -->
<mapper namespace="cn.ccir.mybatis.entity.UserMapper">

</mapper>

      》mapper接口中的方法名和mapper.xml中statement的id一致。
      》mapper接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。
      》mapper接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。

public interface UserMapper{
    public User findUserById(int id) thorws Exception;
    public List<User> findUserByName(String name) throws Exception;
}


public class UserMapperTest{

    private SqlSessionFactory sqlSessionFactory;
    
    //指定測試方法前執行。
    @Before
    public void setUp() throws Exception{
        String resource="SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsString(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    public void testFindUserById(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //創建UserMapper對象,Mybatis自動生成mapper代理對象。
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findUserById(1);
    }
}

    mapper接口方法參數只能有一個參數。在系統框架中,dao層的代碼是被業務層公用的。即使mapper接口只有一個參數,也可以使用包裝類型的pojo來滿足不同的業務方法的需求。

    註:持久層方法的參數可以包裝類型map,但service方法中不建議使用包裝類型。因為不利於業務層的擴展。

Mybatis配置文件SqlMapConfig.xml:

  Mybatis的全局配置文件,配置內容如下:

    properties:屬性。
      Mybatis將按照下面的順序來加載屬性:
        1、在properties元素體內定義的屬性首先被讀取。
        2、然後讀取properties元素中resource/url加載的屬性,它會覆蓋已讀取的同名屬性。
        3、最後讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
      建議:
        不要在properties元素體內添加任何屬性值,只將屬性值定義在properties文件中。在properties文件中定義屬性名要有一定的特殊性。

    settings:全局參數配置。
      Mybatis框架在運行時可以調整一些運行參數。如:開啟二級緩存、開啟延遲加載等。全局參數將會影響Mybatis的運行行為。

    typeAliases:類型別名。
      如:在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入參數的類型,需要resultType指定輸出結果的映射類型。
      若在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterType或resultType指定的類型定義一些別名,在mapper.xml中通過別名定義,方便開發。
      Mybatis有一些默認的別名(URL),而pojo的類型定義別名則需要定義別名:

<!-- 定義別名 -->
<typeAliases>
    <!-- 針對單個別名定義 -->
    <typeAlias type="cn.ccir.mybatis.entity.User" alias="user">
    <!-- 批量別名定義 
        指定包名,mybatis自動掃描包中的類,自動定義別名,別名就是類型 -->
    <package name="cn.ccir.mybatis.entity"/>
</typeAliases>

    typeHandlers:類型處理器。
      Mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。
      Mybatis默認支持的類型處理器:
        通常情況下,mybatis提供的類型處理器已經滿足日常需要,不需要自定義。

    objectFactory:對象工廠

    pluglns:插件

    environments:環境集合屬性對象
      > environment:環境子屬性對象
        > transactionManager:事務管理
        > dataSource:數據源

    mappers:映射配置

<mappers>
    <!-- 一次加載一個映射文件 -->
    <mapper resource="sqlmap/User.xml"/>
    <!-- 通過mapper接口加載單個映射文件
        遵循的一些規範:
            需要將mapper接口類型和mapper.xml映射文件名稱保持一致,且在一個目錄中。
        遵循的規範的前提:使用的時mapper代理方法 -->
    <mapper resource="cn.ccir.mybatis.entity.TestDaoMapper"/>
    <!-- 批量加載mapper 
        指定mapper接口包名。mybatis自動掃描包下百年所有mapper接口進行加載。
        遵循的一些規範:
            需要將mapper接口類型和mapper.xml映射文件名稱保持一致,且在一個目錄中。-->
    <mapper resource="cn.ccir.mybatis.entity"/>
</mappers>

.Net轉Java自學之路—Mybatis框架篇二(SqlSession、原始開發、代理開發)