Mybatis實現Mapper動態代理方式


一、實現原理

        Mapper接口開發方法只需要程序員編寫Mapper接口(相當於Dao接口),由Mybatis框架根據接口定義創建接口的動態代理對象,代理對象的方法體同上邊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.xml映射文件

         定義mapper映射文件UserMapper.xml(內容同Users.xml),需要修改namespace的值為 UserMapper接口路徑。將UserMapper.xml放在classpath 下mapper目錄 下。

 

[html]  view plain  copy
 
 print?
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">  
  6. <!-- 根據id獲取用戶信息 -->  
  7.     <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">  
  8.         select * from user where id = #{id}  
  9.     </select>  
  10. <!-- 自定義條件查詢用戶列表 -->  
  11.     <select id="findUserByUsername" parameterType="java.lang.String"   
  12.             resultType="cn.itcast.mybatis.po.User">  
  13.        select * from user where username like '%${value}%'   
  14.     </select>  
  15. <!-- 添加用戶 -->  
  16.     <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">  
  17.     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  
  18.         select LAST_INSERT_ID()   
  19.     </selectKey>  
  20.       insert into user(username,birthday,sex,address)   
  21.       values(#{username},#{birthday},#{sex},#{address})  
  22.     </insert>  
  23.   
  24. </mapper>  

 

 

三、Mapper.java(接口文件)

 

 

[java]  view plain  copy
 
 print?
  1. /** 
  2.  * 用戶管理mapper 
  3.  */  
  4. Public interface UserMapper {  
  5.     //根據用戶id查詢用戶信息  
  6.     public User findUserById(int id) throws Exception;  
  7.     //查詢用戶列表  
  8.     public List<User> findUserByUsername(String username) throws Exception;  
  9.     //添加用戶信息  
  10.     public void insertUser(User user)throws Exception;   
  11. }  


         接口定義有如下特點:
                  1、Mapper接口方法名和Mapper.xml中定義的statement的id相同
                  2、Mapper接口方法的輸入參數類型和mapper.xml中定義的statement的parameterType的類型相同
                  3、Mapper接口方法的輸出參數類型和mapper.xml中定義的statement的resultType的類型相同

 

四、加載UserMapper.xml文件

         修改sqlMapConfig.xml文件:

 

[html]  view plain  copy
 
 print?
  1. <!-- 加載映射文件 -->  
  2.  <mappers>  
  3.    <mapper resource="mapper/UserMapper.xml"/>  
  4.  </mappers>  

 

 

五、測試

 

 

[java]  view plain  copy
 
 print?
  1. Public class UserMapperTest extends TestCase {  
  2.   
  3.     private SqlSessionFactory sqlSessionFactory;  
  4.       
  5.     protected void setUp() throws Exception {  
  6.         //mybatis配置文件  
  7.         String resource = "sqlMapConfig.xml";  
  8.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  9.         //使用SqlSessionFactoryBuilder創建sessionFactory  
  10.         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  11.     }  
  12.   
  13.       
  14.     Public void testFindUserById() throws Exception {  
  15.         //獲取session  
  16.         SqlSession session = sqlSessionFactory.openSession();  
  17.         //獲取mapper接口的代理對象  
  18.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  19.         //調用代理對象方法  
  20.         User user = userMapper.findUserById(1);  
  21.         System.out.println(user);  
  22.         //關閉session  
  23.         session.close();  
  24.           
  25.     }  
  26.     @Test  
  27.     public void testFindUserByUsername() throws Exception {  
  28.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  29.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  30.         List<User> list = userMapper.findUserByUsername("張");  
  31.         System.out.println(list.size());  
  32.   
  33.     }  
  34. Public void testInsertUser() throws Exception {  
  35.         //獲取session  
  36.         SqlSession session = sqlSessionFactory.openSession();  
  37.         //獲取mapper接口的代理對象  
  38.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  39.         //要添加的數據  
  40.         User user = new User();  
  41.         user.setUsername("張三");  
  42.         user.setBirthday(new Date());  
  43.         user.setSex("1");  
  44.         user.setAddress("北京市");  
  45.         //通過mapper接口添加用戶  
  46.         userMapper.insertUser(user);  
  47.         //提交  
  48.         session.commit();  
  49.         //關閉session  
  50.         session.close();  
  51.     }  
  52.       
  53.   
  54. }  

 

 

六、總結

 

         selectOne和selectList
         動態代理對象調用sqlSession.selectOne()和sqlSession.selectList()是根據mapper接口方法的返回值決定,如果返回list則調用selectList方法,如果返回單個對象則調用selectOne方法。


         namespace
         mybatis官方推薦使用mapper代理方法開發mapper接口,程序員不用編寫mapper接口實現類,使用mapper代理方法時,輸入參數可以使用pojo包裝對象或map對象,保證dao的通用性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM