<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Mybatis學習總結之——Mapper代理開發(fā)

          共 5130字,需瀏覽 11分鐘

           ·

          2020-09-24 21:21


          一、概要


          1、原始DAO開發(fā)中存在的問題:


          (1)DAO實現(xiàn)方法體中存在很多過程性代碼。
          (2)調用SqlSession的方法(select/insert/update)需要指定Statement的id,存在硬編碼,不利于代碼維護。


          2、Mapper動態(tài)代理方法:程序員只需要寫dao接口(Mapper),而不需要寫dao實現(xiàn)類,由mybatis根據(jù)dao接口和映射文件中statement的定義生成接口實現(xiàn)類代理對象。


          3、目標:通過一些規(guī)則讓mybatis根據(jù)dao接口和映射文件中statement的定義生成接口實現(xiàn)代理對象。


          二、開發(fā)規(guī)范


          1、在XXXmapper.xml中namespace等于mapper接口地址(即mapper.xml文件中的namespace與mapper.java接口的類路徑相同)。




          2、XXXmapper.java接口中的方法和mapper.xml中的statement的Id一致。

          3、mapper.java接口中的方法輸入參數(shù)和mapper.xml中statement的parameterType指定的類型一致。

          4、mapper.java接口中的方法的返回值類型和mapper.xml中statement的resultType指定的類型一致。



          注:以上的開發(fā)規(guī)范主要是對下面的代碼進行統(tǒng)一生成


          SqlSession sqlSession = sqlSessionFactory.openSession();
          User user = sqlSession.selectOne("test.findUserById", id); 
          ......


          三、UserMapper.java類代碼(接口文件)


          package com.mybatis.mapper;

          import java.util.List;

          import com.mybatis.entity.User;

          /**
          ?* 用戶管理mapper接口
          ?* @author lxx
          ?*
          ?*/

          public?interface?UserMapper?{
          ????
          ????/** 根據(jù)ID查詢用戶信息 */
          ????public?User findUserById(int?id);

          ????/** 根據(jù)用戶名稱模糊查詢用戶信息 */
          ????public?List findUserByName(String username);

          ????/** 添加用戶 */
          ????public?void?insertUser(User user);

          ????/** 根據(jù)ID刪除用戶 */
          ????public?void?deleteUser(Integer id);

          ????/** 根據(jù)ID更新用戶 */
          ????public?void?updateUser(User user);

          }


          四、將原來的User.xml拷貝并修改名稱為UserMapper.xml,再將UserMapper.xml文件中的namespace改為mapper接口地址



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


          注:namespace=mapper接口地址


          五、在SqlMapConfig.xml中加載UserMapper.xml



          ????<mappers>
          ????????<mapper?resource="com/mybatis/mapping/User.xml"/>
          ????????<mapper?resource="com/mybatis/mapping/UserMapper.xml"/>
          ????mappers>


          六、JUnit測試UserMapperTest.java


          package?com.mybatis.test;

          import?java.io.InputStream;
          import?java.util.Date;
          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.entity.User;
          import?com.mybatis.mapper.UserMapper;

          public?class?UserMapperTest?{

          ????private?SqlSessionFactory sqlSessionFactory;

          ????// 此方法是在執(zhí)行@Test標注的方法之前執(zhí)行
          ????@Before
          ????public?void?setUp()?throws?Exception {
          ????????String resource = "SqlMapConfig.xml";
          ????????InputStream inputStream = Resources.getResourceAsStream(resource);
          ????????// 創(chuàng)建SqlSessionFcatory
          ????????sqlSessionFactory = new?SqlSessionFactoryBuilder().build(inputStream);
          ????}
          ????
          ????@Test
          ????public?void?testFindUserById()?{
          ????????SqlSession sqlSession = sqlSessionFactory.openSession();
          ????????// 創(chuàng)建Usermapper對象,mybatis自動生成mapper代理對象
          ????????UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          ????????User user = mapper.findUserById(1);
          ????????System.out.println(user);
          ????????sqlSession.close();
          ????}

          ????@Test
          ????public?void?testFindUserByName()?{
          ????????SqlSession sqlSession = sqlSessionFactory.openSession();
          ????????// 創(chuàng)建Usermapper對象,mybatis自動生成mapper代理對象
          ????????UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          ????????List list = mapper.findUserByName("小");
          ????????System.out.println(list);
          ????????sqlSession.close();
          ????}
          ????
          ????@Test
          ????public?void?testInsertUser()?{
          ????????SqlSession sqlSession = sqlSessionFactory.openSession();
          ????????// 創(chuàng)建Usermapper對象,mybatis自動生成mapper代理對象
          ????????User user = new?User();
          ????????user.setUsername("小東");
          ????????user.setSex("1");
          ????????user.setAddress("天津");
          ????????user.setBirthday(new?Date());
          ????????UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          ????????mapper.insertUser(user);
          ????????sqlSession.commit();
          ????????sqlSession.close();
          ????}
          ????
          ????@Test
          ????public?void?testUpdateUser()?{
          ????????SqlSession sqlSession = sqlSessionFactory.openSession();
          ????????// 創(chuàng)建Usermapper對象,mybatis自動生成mapper代理對象
          ????????User user = new?User();
          ????????user.setId(2);//必須設置Id
          ????????user.setUsername("小劉");
          ????????user.setSex("1");
          ????????user.setAddress("北京海淀");
          ????????user.setBirthday(new?Date());
          ????????UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          ????????mapper.updateUser(user);
          ????????sqlSession.commit();
          ????????sqlSession.close();
          ????}
          ????
          ????@Test
          ????public?void?testDeleteUser()?{
          ????????SqlSession sqlSession = sqlSessionFactory.openSession();
          ????????// 創(chuàng)建Usermapper對象,mybatis自動生成mapper代理對象
          ????????UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          ????????mapper.deleteUser(3);
          ????????sqlSession.commit();
          ????????sqlSession.close();
          ????}

          }


          原來這個sqlSession可以自動創(chuàng)建一個mapper接口的代理對象!我們只需要把剛剛寫好的mapper接口類的字節(jié)碼對象傳給getMapper方法,即可得到一個該接口對應的代理對象,然后我們就可以使用這個代理對象來操作接口中具體的方法了。
            

          到這里,使用mapper代理的方式開發(fā)dao就總結完了,但是有個小細節(jié),由于mapper接口中方法的參數(shù)要根據(jù)映射文件中的parameterType來指定,而parameterType只有一個,所以mapper接口中所有方法的參數(shù)都只有一個!那如果我們要傳入兩個或多個參數(shù)該咋整?這沒辦法,想要傳多個參數(shù)還是死了這條心了吧,但是可以解決這個問題,就是對傳入的對象進行增強,讓傳進去的對象包含我們需要的參數(shù)即可。這算是個小弊端吧,但是不會影響我們開發(fā)。


          七、小結


          1、用mapper代理開發(fā)時只要寫2個:


          (1)mapper.xml

          (2)mapper接口


          2、Mapper接口開發(fā)需要遵循以下規(guī)范:


          (1)Mapper.xml文件中的namespace與mapper接口的類路徑相同。
          (2)Mapper接口方法名和Mapper.xml中定義的每個statement的id相同。?
          (3)Mapper接口方法的輸入參數(shù)類型和mapper.xml中定義的每個sql 的parameterType的類型相同。
          (4)Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個sql的resultType的類型相同。


          3、代理對象內部調用selectOne()和selectList():


          如果mapper對象返回單個pojo對象(非集合對象)代理對象內部通過selectOne查詢數(shù)據(jù)庫,如果mapper方法返回集合對象,代理對象內部通過selectList查詢數(shù)據(jù)庫。


          4、mapper接口中的方法參數(shù)只能有一個是否影響系統(tǒng)開發(fā),mapper接口方法參數(shù)只能有一個,系統(tǒng)是否不利于維護?


          回答:系統(tǒng)框架中,dao層的代碼是被業(yè)務層公用的。mapper接口只有一個參數(shù),可以使用包裝類型的pojo滿足不同的業(yè)務方法的需求。


          原文鏈接:cnblogs.com/xiaoxi/p/6173534.html




          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品第一区 | 国产精品国内自产拍 | 青青草视频日韩视频在线 | 无码三级视频在线观看 | 一级 黄 色情 片视频网站11 |