Mybatis 學習筆記(三)——使用Mapper代理的方式實現資料增刪改查
阿新 • • 發佈:2018-12-15
一、介紹
Mapper代理的方式只需要程式設計師編寫 Mapper.xml 檔案及 Mapper介面。
本文是基於上一篇文章:Mybatis 學習筆記——原生DAO實現資料增刪改查,所以接下來的內容是以其為基礎的,如果有什麼不懂的請留言或檢視上一篇。所以SqlMapConfig.xml 檔案、User.xml檔案延用不編寫,我們需要編寫UserMapper.java介面和測試類。
二、使用Mapper代理的開發規範
程式設計師編寫mapper介面需要遵循一些開發規範,mybatis可以自動生成mapper介面實現類代理物件。
使用Mapper代理開發規範:
1、在 Mapper.xml 中 namespace 等於 mapper 介面地址;
2、Mapper.java 介面中的方法名 和 Mapper.xml 中 statement 的 id 一致;
3、Mapper.java 介面中的方法輸入引數型別和 Mapper.xm l中 statement 的parameterType 指定的型別一致;
4、Mapper.java 介面中的方法返回值型別和 Mapper.xml 中 statement 的 resultType 指定的型別一致。
三、根據開發規範編寫UserMapper.java介面
package com.mapper; import java.util.List; import com.po.User; /** * 描述:mapper代理介面,管理使用者 * @author 歐陽 * @since 2018年10月9日 */ public interface UserMapper { //根據id查詢使用者資訊 public User findUserById(int id) throws Exception; //根據username查詢使用者資訊 public List<User> findUserByName(String name) throws Exception; //插入使用者資訊 public void insertUser(User user) throws Exception; //根據id刪除使用者資訊 public void deleteUserById(int id) throws Exception; //更新使用者資訊 public void updateUser(User user) throws Exception; }
四、編寫測試類
package com.mapper; 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.dao.UserDao; import com.dao.UserDaoImpl; import com.po.User; public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; //此方法是在執行testFindUserById之前執行 @Before public void setUp() throws Exception { String resource = "config/SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 建立會話工廠 this.sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserById() { SqlSession sqlSession = sqlSessionFactory.openSession(); //建立userMapper物件,mybatis自動生成mapper代理物件 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); try { User user = userMapper.findUserById(3); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } @Test public void testFindUserByName() { UserDao userDao = new UserDaoImpl(this.sqlSessionFactory); try { List<User> users = userDao.findUserByName("小"); System.out.println(users.size()); } catch (Exception e) { e.printStackTrace(); } } @Test public void testInsertUser() { UserDao userDao = new UserDaoImpl(this.sqlSessionFactory); try { //插入使用者物件 User user = new User(); user.setUsername("歐陽"); user.setAddress("山東"); userDao.insertUser(user); } catch (Exception e) { e.printStackTrace(); } } @Test public void testDeleteUserById() { UserDao userDao = new UserDaoImpl(this.sqlSessionFactory); try { userDao.deleteUserById(17); } catch (Exception e) { e.printStackTrace(); } } @Test public void testUpdateUser() { UserDao userDao = new UserDaoImpl(this.sqlSessionFactory); try { //插入使用者物件 User user = new User(); user.setId(3); user.setUsername("歐陽"); user.setAddress("山東"); userDao.updateUser(user); } catch (Exception e) { e.printStackTrace(); } } }
五、問題的思考
- 在代理物件內部何時呼叫selectOne方法?又何時呼叫selectList方法?
答:Mybatis 根據 Mapper 方法的返回值自動進行判斷,如果返回單個pojo物件(非集合物件),則代理物件內部通過selectOne查詢資料庫;返回集合物件,代理物件內部通過selectList查詢資料庫。 - Mapper 介面方法引數只能有一個是否影響系統開發?
答:不影響,如果有多個引數,我們可以使用 POJO 包裝各引數來滿足業務的需求。