MyBatis學習(三)--Mybatis編寫方式

MyBatis學習(三)–Mybatis編寫方式

標籤(空格分隔): MyBatis學習


MyBatis有兩種編寫模式,分別是傳統的DAO模式和Mapper模式。在介紹這兩者編寫方式之前,先簡單介紹下兩個比較關鍵的對象,分別是:SqlSessionFactory和SqlSession

SqlSessionFactory

SqlSessionFactory是一個接口,接口中定義了不同的openSession方法用來創建會話工廠。
單例模式,一旦創建作用於整個應用運行期間,主要通過全局配置文件SqlMaperConfig.xml創建

SqlSession

會話工程,是一個面向用戶(程序員)的接口,定義了很多數據庫操作方法,默認的實現是DefaultSqlSession。

執行過程如下:
1、加載數據源等配置信息
2、創建數據庫對象
3、創建事務
4、創建Executor,執行數據庫操作

每一個線程都有一個自己的SqlSession實例。是一個線程不安全的類,每次打開一個sqlSession。都需要執行關閉sqlsession

MyBatis環境搭建

1、導入依賴jar包

<!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

2、創建全局配置文件

<?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>
    <!-- 和spring整合後 environments配置將廢除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事務管理-->
            <transactionManager type="JDBC" />
        <!-- 數據庫連接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="mysql" />
            </dataSource>
        </environment>
    </environments>

    <mappers> 
        <mapper resource="/mapper/User.xml"/>
    </mappers>
</configuration>

3、創建mapper文件

<mapper namespace="test">
<!-- 根據id獲取用戶信息 -->
    <select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
        select * from user where id = #{id}
    </select>
    <!-- 自定義條件查詢用戶列表 -->
    <select id="findUserByUsername" parameterType="java.lang.String" 
            resultType="cn.itcast.mybatis.po.User">
       select * from user where username like '%${value}%' 
    </select>
</mapper>

開發方式一:原始Dao的開發方式

需要編寫一個Dao接口類和一個Dao實現類

創建DAO接口和實現類

接口:

Public interface UserDao {
    public User getUserById(int id) throws Exception;
}

實現類:

Public class UserDaoImpl implements UserDao {

    //注入SqlSessionFactory
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.setSqlSessionFactory(sqlSessionFactory);
    }

    private SqlSessionFactory sqlSessionFactory;
    @Override
    public User getUserById(int id) throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        User user = null;
        try {
            //通過sqlsession調用selectOne方法獲取一條結果集
            //參數1:指定定義的statement的id,參數2:指定向statement中傳遞的參數
            user = session.selectOne("test.findUserById", 1);
            System.out.println(user);

        } finally{
            session.close();
        }
        return user;
    }

}

總結

存在以下問題:
1、Dao方法存在重複代碼,通過SqlSessionFactory創建會話,以及關閉會話等操作
2、在數據庫操作方法中,明確指定了執行方法的statement id。存在硬編碼操作,不利於維護

開發方式二:Mapper動態代理

實現原理

Mapper接口開發方法只需要程序員編寫Mapper接口(相當於Dao接口),由MyBatis框架根據接口定義創建接口的動態代理對象,代理對象方法如同Dao的實現類。但是要實現接口的動態代理對象,我們需要遵循一定的規範,如下:

1、Mapper.xml文件中的namespace於mapper接口的類路徑相同
2、Mapper的方法名和Mapper.xml中定義的statement id相同
3、Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql的輸入參數類型相同
4、接口中定義的輸入參數和mapper.xml的sql的輸出參數也保持相同

舉例說明

在上述的環境搭建中,已經創建了一個接口和mapper.xml。只需要保證遵循了上述規範,即可測試。

總結

selectOne和selectList
動態代理對象調用sqlSession.selectOne()和sqlSession.selectList()是根據mapper接口方法的返回值決定,如果返回list則調用selectList方法,如果返回單個對象則調用selectOne方法。

namespace
mybatis官方推薦使用mapper代理方法開發mapper接口,程序員不用編寫mapper接口實現類,使用mapper代理方法時,輸入參數可以使用pojo包裝對象或map對象,保證dao的通用性。

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