前言
在傳統的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() {
}
}
下面是查詢的結果:

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