1. 程式人生 > >MyBatis開發Dao的原始Dao開發和Mapper動態代理開發

MyBatis開發Dao的原始Dao開發和Mapper動態代理開發

目錄

  • 咳咳...初學者看文字(Mapper介面開發四個規範)屬實有點費勁,博主我就廢了點勁做了如下圖,方便理解:
  • 原始Dao開發方式
    • 1. 編寫對映檔案
    • 3.編寫Dao實現類
    • 4.編寫Dao測試
  • Mapper動態代理方式
    • 1.定義Mapper.xml(對映檔案)
    • 2、編寫UserMapper.xml配置檔案內容:
    • 3.編寫UserMapper(介面檔案)
    • 4.載入UserMapper.xml檔案
    • 5.編寫測試

@
使用MyBatis開發Dao,通常有兩個方法,即原始Dao開發方法和Mapper動態代理開發方法。原始Dao開發中存在以下問題:
Dao方法體存在重複程式碼:通過SqlSessionFactory建立SqlSession,呼叫SqlSession的資料庫操作方法

呼叫sqlSession的資料庫操作方法需要指定statement的id,這裡存在硬編碼,不得於開發維護。

而動態代理開發中Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),由

Mybatis框架根據介面定義建立介面的動態代理物件,代理物件的方法體同上邊Dao介面實現類方法。

使用mapper代理的方法來開發dao時,程式設計師只需要幹兩件事即可:

1、編寫mapper.xml對映檔案
2、編寫mapper介面(相當於dao介面)

Mapper介面開發需要遵循以下四個規範(建議初學者結合下圖理解):
1、Mapper.xml檔案中的namespace與mapper介面的類路徑相同。
2、Mapper介面方法名和Mapper.xml中定義的每個statement的id相同
3、Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同
4、Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同

咳咳...初學者看文字(Mapper介面開發四個規範)屬實有點費勁,博主我就廢了點勁做了如下圖,方便理解:

原始Dao開發方式

原始Dao開發方法需要程式設計師編寫Dao介面和Dao實現類。

1. 編寫對映檔案

編寫對映檔案如下:(也可以使用入門程式完成的對映檔案)

<?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:名稱空間,用於隔離sql,還有一個很重要的作用,後面會講 -->
<mapper namespace="test">

    <!-- 根據id查詢使用者 -->
    <select id="queryUserById" parameterType="int"
        resultType="com.gx.mybatis.pojo.User">
        select * from user where id = #{id}
    </select>

    <!-- 根據username模糊查詢使用者 -->
    <select id="queryUserByUsername" parameterType="string"
        resultType="com.gx.mybatis.pojo.User">
        select * from user where username like '%${value}%'
    </select>

    <!-- 儲存使用者 -->
    <insert id="saveUser" parameterType="com.gx.mybatis.pojo.User">
        <selectKey keyProperty="id" keyColumn="id" order="AFTER"
            resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address})
    </insert>

</mapper>

### 2. 編寫Dao介面

先進行DAO的介面開發,編碼如下:

public interface UserDao {
    /**
     * 根據id查詢使用者
     * 
     * @param id
     * @return
     */
    User queryUserById(int id);

    /**
     * 根據使用者名稱模糊查詢使用者
     * 
     * @param username
     * @return
     */
    List<User> queryUserByUsername(String username);

    /**
     * 儲存使用者
     * 
     * @param user
     */
    void saveUser(User user);
}

3.編寫Dao實現類

編寫的Dao實現類如下

public class UserDaoImpl implements UserDao {
    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        super();
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User queryUserById(int id) {
        // 建立SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 執行查詢邏輯
        User user = sqlSession.selectOne("queryUserById", id);
        // 釋放資源
        sqlSession.close();

        return user;
    }

    @Override
    public List<User> queryUserByUsername(String username) {
        // 建立SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();

        // 執行查詢邏輯
        List<User> list = sqlSession.selectList("queryUserByUsername", username);
        // 釋放資源
        sqlSession.close();
        return list;
    }

    @Override
    public void saveUser(User user) {
        // 建立SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();

        // 執行儲存邏輯
        sqlSession.insert("saveUser", user);
        // 提交事務
        sqlSession.commit();
        // 釋放資源
        sqlSession.close();
    }
}

4.編寫Dao測試

建立一個JUnit的測試類,對UserDao進行測試(充當main方法),測試程式碼如下:

public class UserDaoTest {
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws Exception {
        // 建立SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 載入SqlMapConfig.xml配置檔案
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 建立SqlsessionFactory
        this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void testQueryUserById() {
        // 建立DAO
        UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
        // 執行查詢
        User user = userDao.queryUserById(1);
        System.out.println(user);
    }

    @Test
    public void testQueryUserByUsername() {
        // 建立DAO

        UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
        // 執行查詢
        List<User> list = userDao.queryUserByUsername("五");
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public void testSaveUser() {
        // 建立DAO
        UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);

        // 建立儲存物件
        User user = new User();
        user.setUsername("孫尚香腸");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("蜀國");
        // 執行儲存
        userDao.saveUser(user);

        System.out.println(user);
    }
}

Mapper動態代理方式

1.定義Mapper.xml(對映檔案)

定義mapper對映檔案UserMapper.xml
將UserMapper.xml放在config下mapper目錄下,效果如下:

2、編寫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">
<!-- namespace:名稱空間,用於隔離sql -->
<!-- 還有一個很重要的作用,使用動態代理開發DAO,1. namespace必須和Mapper介面類路徑一致 -->
<mapper namespace="com.gx.mybatis.mapper.UserMapper">
    <!-- 根據使用者id查詢使用者 -->
    <!-- 2. id必須和Mapper介面方法名一致 -->
    <!-- 3. parameterType必須和介面方法引數型別一致 -->
    <!-- 4. resultType必須和介面方法返回值型別一致 -->
    <select id="queryUserById" parameterType="int"
        resultType="com.gx.mybatis.pojo.User">
        select * from user where id = #{id}
    </select>

    <!-- 根據使用者名稱查詢使用者 -->
    <select id="queryUserByUsername" parameterType="string"
        resultType="com.gx.mybatis.pojo.User">
        select * from user where username like '%${value}%'
    </select>

    <!-- 儲存使用者 -->
    <insert id="saveUser" parameterType="com.gx.mybatis.pojo.User">
        <selectKey keyProperty="id" keyColumn="id" order="AFTER"
            resultType="int">
            select last_insert_id()
        </selectKey>
        insert into user(username,birthday,sex,address) values
        (#{username},#{birthday},#{sex},#{address});
    </insert>

</mapper>

3.編寫UserMapper(介面檔案)

建立UserMapper介面程式碼如下:

public interface UserMapper {
    /**
     * 根據id查詢
     * 
     * @param id
     * @return
     */
    User queryUserById(int id);

    /**
     * 根據使用者名稱查詢使用者
     * 
     * @param username
     * @return
     */
    List<User> queryUserByUsername(String username);

    /**
     * 儲存使用者
     * 
     * @param user
     */
    void saveUser(User user);
}

4.載入UserMapper.xml檔案

修改SqlMapConfig.xml檔案,新增以下所示的內容:

    <!-- 載入對映檔案 -->
    <mappers>
        <mapper resource="sqlmap/User.xml" />
        <mapper resource="mapper/UserMapper.xml" />
    </mappers>

5.編寫測試

編寫的測試方法如下:

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws Exception {
        // 建立SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 載入SqlMapConfig.xml配置檔案
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 建立SqlsessionFactory
        this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void testQueryUserById() {
        // 獲取sqlSession,和spring整合後由spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();

        // 從sqlSession中獲取Mapper介面的代理物件
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 執行查詢方法
        User user = userMapper.queryUserById(1);
        System.out.println(user);

        // 和spring整合後由spring管理
        sqlSession.close();
    }

    @Test
    public void testQueryUserByUsername() {
        // 獲取sqlSession,和spring整合後由spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();

        // 從sqlSession中獲取Mapper介面的代理物件
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 執行查詢方法
        List<User> list = userMapper.queryUserByUsername("五");
        for (User user : list) {
            System.out.println(user);
        }

        // 和spring整合後由spring管理
        sqlSession.close();
    }

    @Test
    public void testSaveUser() {
        // 獲取sqlSession,和spring整合後由spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();

        // 從sqlSession中獲取Mapper介面的代理物件
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 建立儲存物件
        User user = new User();
        user.setUsername("劉備胎");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("鼠國");
        // 執行查詢方法
        userMapper.saveUser(user);
        System.out.println(user);


        // 和spring整合後由spring管理
        sqlSession.commit();
        sqlSession.close();
    }
}

如果本文對你有一點點幫助,那麼請點個讚唄,謝謝~

最後,若有不足或者不正之處,歡迎指正批評,感激不盡!如果有疑問歡迎留言,絕對第一時間回覆!

歡迎各位關注我的公眾號,一起探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...

相關推薦

MyBatis開發Dao原始Dao開發Mapper動態代理開發

目錄 咳咳...初學者看文字(Mapper介面開發四個規範)屬實有點費勁,博主我就廢了點勁做了如下圖,方便理解: 原始Dao開發方式 1. 編寫對映檔案 3.編寫Dao實現類 4.編寫Dao測

Mybatis框架三:DAO開發Mapper動態代理開發

urn 測試類 new post 綁定 def 情況下 asstream implement 這裏是最基本的搭建:http://www.cnblogs.com/xuyiqing/p/8600888.html 接下來做到了簡單的增刪改查:http://www.cnblogs.

MyBatis使用Mapper動態代理開發Dao

開發規範 Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),由Mybatis框架根據介面定義建立介面的動態代理物件,代理物件的方法體同原始Dao介面實現類方法。 Mapper介面開發需要遵循以下規範: Mapper.xml檔案中的name

mybatis---Mapper動態代理開發

UserMapper介面: package com.it.mybaties.mapper; import com.it.mybaties.pojo.User; public interface UserMapper { public User getUserById(Integer i

mybatis與Spring三種開發方式詳解(二&三)Mapper動態代理開發&Mapper動態代理掃描包形式開發

mybatis與Spring三種開發方式詳解(二)Mapper動態代理開發 之前我們說到傳統的dao層開發,今天我們來談談第二種mybatis與Spring的開發方式,Mapper動態代理開發。 首先這裡上一波@test測試程式碼,大家先看一下mybat

mapper動態代理開發

batis close Coding dbcp ng- factor 文件的 pass -- <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework

Mapper動態代理開發所要遵循的四個原則

①.介面方法名與對映檔案中Mapper.xml中id名一致。 ②.返回值型別與Mapper.xml檔案中返回值型別一致 ③.方法的入參型別與Mapper.xml中的入參的型別一致 ④.名稱空間 繫結此介面 例如 public interface UserMapper { public User findUs

【轉】Mybatis學習---MyBatis知識、原始Dao開發mapper代理開發

結果集 檢索 cat 用戶 隔離 pst 定義 otl oom 【原文】https://www.toutiao.com/i6594610137560777223/ 一、什麽是MyBatis MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。

mybatis--開發Dao--原始dao方式Mapper代理方式

它的作用只是通過配置檔案建立SqlSessionFactory,所以只要創建出SqlSessionFactory,它就可以銷燬了。 所以說,它的生命週期是在方法之內。  SqlSessionFactory 它的作用是建立SqlSession的工廠,工廠一旦建立,除非應用停掉,不要銷燬。 所以說它的生命週期是

mybatis入門之原始dao開發mapper代理開發

前言: 相信很多朋友和筆者一樣,在開始學習mybatis的時候,看完一遍mybatis相關知識,並沒有記住多少,理解深刻就更談不上,渴求一個簡單的demo來測試一下自己到底瞭解多少,掌握多少以及mybatis到底是怎麼玩的,那麼機會來了,筆者將自己之前學習過程中練習的demo重新整理了下,並記錄

02.MyBatisDAO開發使用的Mapper動態代理方式

.get div 技術 before nco mes session list http   在實際開發中,Mybatis作用於DAO層,那麽Service層該如何調用Mybatis   Mybatis鼓勵使用Mapper動態代理的方式   Mapper接口開發方法只需要程

MyBatis開發Dao層的兩種方式(Mapper動態代理方式)

  MyBatis開發原始Dao層請閱讀我的上一篇部落格:MyBatis開發Dao層的兩種方式(原始Dao層開發)   接上一篇部落格繼續介紹MyBatis開發Dao層的第二種方式:Mapper動態代理方式   Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),由Mybat

java-mybaits-00202-DAO-原始DAO開發方法

click ring res ide print dao spa 變量 source 原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。 原本的ibatis的 需要在dao實現類中註入一個SqlSessionFactory工廠。 1.思路

Spring boot 自動生成mybatisdao、model、mapper

1、pom.xml新增內容,最下邊新增plugin <build> <pluginManagement> <plugins> <plugin> <groupId>org.springfr

Dao開發Mapper動態代理方式)

動態代理物件呼叫sqlSession.selectOne()和sqlSession.selectList()是根據mapper介面方法的返回值決定,如果返回list則呼叫selectList方法,如果返回單個物件則呼叫selectOne方法。

mapper動態代理方式的crud(MyBatis介面的開發

二、mapper動態代理方式的crud(MyBatis介面的開發): 原則:約定優於配置 abc.java name 配置方式:abc.xml          <name>myproject</name>

mybatis 使用mapper實現動態代理 -開發規範

程式設計師編寫mapper介面需要遵循一些開發規範,mybatis可以自動生成mapper介面實現類代理物件。 開發規範: 1、在mapper.xml中namespace等於mapper介面地址 2、mapper.java介面中的方法名和mapper.xml中s

使用mybatis反向自動生成實體類mapper映射文件接口文件

http 實體類 pos -- cti 連接 rule ima app 問題描述: 最近在做web的東西,想要從數據庫中生成實體類,然後操作數據庫,然後做一些增刪改查的工作, 發現可以直接使用mybatis直接生成javabean,還有可以直接生成mapper的映射文件。具

Mybatis動態代理開發

ace 返回值 就是 原則 map find 文件中 ati import package com.itheima.mybatis.mapper; import com.itheima.mybatis.pojo.User; public interface UserMapp

IDEA2018中maven工程使用mybatis.generator逆向工程獲取pojo mapper

宣告:使用 JDK9,  idea2018.2 ,資料庫版本Mysql8 ,建立maven工程進行測試;  之前用eclipse ,現在使用 maven工程來使用mybatis.generator逆向工程;  步驟:①安裝 Mybatis plugin 外掛,重啟 IDE