1. 程式人生 > >Mybatis學習第二天——mapper的動態代理

Mybatis學習第二天——mapper的動態代理

參數類型 pub integer map rda 核心 dao層 puts fin

傳統的Dao層開發通過接口與實現類的方式,Mybatis中通過mapper動態代理是需要定義接口。

1.傳統Dao層封裝

技術分享圖片

那麽可以將公共資源提取出來,剩余的封裝成方法來實現。下面是UserDaoImpl.java中對查詢的簡單封裝

 1 package com.mybatis.dao.impl;
 2 
 3 import org.apache.ibatis.session.SqlSession;
 4 import org.apache.ibatis.session.SqlSessionFactory;
 5 
 6 import com.mybatis.dao.UserDao;
 7 import
com.mybatis.pojo.User; 8 9 public class UserDaoImpl implements UserDao { 10 11 //沒有導入Spring,采用傳參的方式獲取 12 SqlSessionFactory sqlSessionFactory ; 13 14 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { 15 super(); 16 this.sqlSessionFactory = sqlSessionFactory; 17 }
18 19 @Override 20 public User findUserById(Integer id) { 21 SqlSession sqlSession = sqlSessionFactory.openSession(); 22 User user = sqlSession.selectOne("test.findUserById",id); 23 24 sqlSession.close(); 25 return user; 26 } 27 28 }

在測試中通過加載公共資源,確定調用的mapper文件(此時表示User.xml)

 1 @Test
 2     public void testName() throws Exception {
 3         /**
 4          *   1. 創建SqlSessionFactoryBuilder對象
 5              2. 加載SqlMapConfig.xml配置文件
 6              3. 創建SqlSessionFactory對象
 7              4. 創建SqlSession對象
 8              5. 執行SqlSession對象執行查詢,獲取結果User
 9              6. 打印結果
10              7. 釋放資源
11          */
12         String resource = "SqlMapConfig.xml";
13         InputStream in = Resources.getResourceAsStream(resource);
14         
15         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
16         
17         UserDao userdao = new UserDaoImpl(sqlSessionFactory);
18         
19         User user = userdao.findUserById(1);
20         
21         System.out.println(user.getUsername());

2.mapper動態代理模式

UserMapper um = sqlSession.getMapper(UserMapper.class);獲取代理,傳入的值為創建的動態代理接口

技術分享圖片(個人理解,有誤希望指正)

在UserMapper接口中,創建的方法需要滿足以下四個原則Mybatis才能進行動態代理操作:

1 public interface UserMapper {
2     //四大原則
3     //1.接口中的方法名與User.xml中對應的id名一致
4     //2.方法中的返回類型與User.xml中的一致
5     //3.傳入的參數類型一致
6     //4.命名空間綁定此接口
7     public User findUserById(Integer id);
8 }

前三個好理解,方法的名字,返回類型,參數類型與User.xml文件中的屬性一致。命名空間綁定此接口,只需要在namesapce上用接口的全路徑。如下:

技術分享圖片

註意:User.xml一定要在核心配置SqlMapConfig.xml中加載

3.mapper映射器

1     <mappers>
2         <!-- 第一種方式只需指定mapper文件路徑即可 -->
3         <mapper resource="sqlmap/User.xml"/>
4         <mapper resource="sqlmap/UserMapper.xml"/>
5         <!-- 第二種方式,需對應接口的路徑,同時mapper文件名需與接口名一致,文件位置必須在同一目錄下 -->
6         <mapper class="com.mybatis.mapper.UserMapper"/>
7         <!-- 第三種方法,指定接口文件的包名,同時mapper文件名需與接口名一致,文件位置必須在同一目錄下 -->
8         <package name="com.mybatis.mapper"/>
9     </mappers>

推薦使用第三種方式。

Mybatis學習第二天——mapper的動態代理