天天看點

MyBatis學習系列(三)--------Mapper動态代理開發DAO

前言

    在傳統的DAO接口開發中,我們如果使用mybatis開發,存在以下問題:

  • DAO方法存在重複代碼,在通過sqlSessionFactory建立sqlSession時,調用sqlSession來操作資料庫.
  • 調用sqlSession操作資料庫時,需要制定statement的id,存在寫死,不利于維護.

    是以,我們可以使用mybatis的Mapper動态代理的方式來進行開發,下面來看看這種開發方式的具體過程.

正文

    Mapper接口開發需要程式員編寫mapper接口,由Mybats架構根據接口定義建立接口的動态代理對象,代理對象的方法其實就是原始DAO開發時實作類的方法.

使用Mapper開發要遵循以下規範:

- Mapper.xml檔案中的namespace要和mapper接口的類路徑一緻.

- Mapper接口的方法名稱要和Mapper.xml中定義的statement的id相同.

- mapper接口的方法輸入參數類型要和mapper.xml中每個sql的parameterType的類型相同

- mapper接口的方法的輸出參數類型要和mapper.xml中每個sql的resultType的類型相同

首先,我們先建立一個名詞為UserMapper的接口,并且按照以上的規範建立2個方法:

package com.mybatis.mapper;

import java.util.List;

import com.mybatis.po.User;

public interface UserMapper {


    public User findUserById(int id);

    public List<User> findUserByName(String username);

    public void insertUser(User user);
}
           

接着,我們将上文中的User.xml檔案改名為UserMapper.xml,更改這個檔案中的namespace

<mapper namespace="com.mybatis.mapper.UserMapper">
    ....
    ....
</mapper>
           

注意,這裡的namespace對應的是前面建立接口的全路徑.

接下來建立對應的測試類測試接口的方法:

package com.mybatis.test;

import static org.junit.Assert.*;

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

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.Before;
import org.junit.Test;

import com.mybatis.mapper.UserMapper;
import com.mybatis.po.User;

public class UserMapperTest {


    private  SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }


    @Test
    public void testFindUserById() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findUserById();
        System.out.println(user);
    }

    @Test
    public void testFindUserByName() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.findUserByName("張");
        for (User user : list) {
            System.out.println(user);
        }

    }

    @Test
    public void testInsertUser() {
    }

}
           

下面是查詢的結果:

MyBatis學習系列(三)--------Mapper動态代理開發DAO
MyBatis學習系列(三)--------Mapper動态代理開發DAO

可以看到,已經查詢出了我們需要的資料.

總結

  • 動态代理對象根據mapper接口的方法的傳回值來決定調用sqlSession.selectOne()或者sqlSession.selectList(),如果傳回單個對象,則調用selectOne(),如果傳回多個對象,則傳回selectList().
  • 在開發中,推薦使用mapper動态代理的方式來進行開發,我們不用編寫接口的實作類,在使用這個方法時,輸入參數可以選擇pojo對象或者map,友善通用.

繼續閱讀