細(xì)說Mybatis的dao層實(shí)現(xiàn)原理

      網(wǎng)友投稿 759 2025-03-31

      1.Mybatis的Dao層實(shí)現(xiàn)

      public interface UserDao { List findAll() throws IOException; }

      1

      2

      3

      public class UserDaoImpl implements UserDao { public List findAll() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List userList = sqlSession.selectList("userMapper.findAll"); sqlSession.close(); return userList; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      @Test public void testTraditionDao() throws IOException { UserDao userDao = new UserDaoImpl(); List all = userDao.findAll(); System.out.println(all); }

      1

      2

      3

      4

      5

      6

      7

      采用 Mybatis 的代理開發(fā)方式實(shí)現(xiàn) DAO 層的開發(fā),這種方式是我們后面進(jìn)入企業(yè)的主流。

      Mapper 接口開發(fā)方法只需要程序員編寫Mapper 接口(相當(dāng)于Dao 接口),由Mybatis 框架根據(jù)接口定義創(chuàng)建接口的動態(tài)代理對象,代理對象的方法體同上邊Dao接口實(shí)現(xiàn)類方法。

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

      1) Mapper.xml文件中的namespace與mapper接口的全限定名相同

      2) Mapper接口方法名和Mapper.xml中定義的每個(gè)statement的id相同

      細(xì)說Mybatis的dao層實(shí)現(xiàn)原理

      3) Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的每個(gè)sql的parameterType的類型相同

      4) Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個(gè)sql的resultType的類型相同

      @Test public void testProxyDao() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //獲得MyBatis框架生成的UserMapper接口的實(shí)現(xiàn)類 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findById(1); System.out.println(user); sqlSession.close(); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      MyBatis的Dao層實(shí)現(xiàn)的兩種方式:

      手動對Dao進(jìn)行實(shí)現(xiàn):傳統(tǒng)開發(fā)方式

      代理方式對Dao進(jìn)行實(shí)現(xiàn):

      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

      2.MyBatis映射文件深入

      Mybatis 的映射文件中,前面我們的 SQL 都是比較簡單的,有些時(shí)候業(yè)務(wù)邏輯復(fù)雜時(shí),我們的 SQL是動態(tài)變化的,此時(shí)在前面的學(xué)習(xí)中我們的 SQL 就不能滿足要求了。

      參考的官方文檔,描述如下:

      [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-UP64cl9W-1606894339442)(img\圖片2.png)]

      我們根據(jù)實(shí)體類的不同取值,使用不同的 SQL語句來進(jìn)行查詢。比如在 id如果不為空時(shí)可以根據(jù)id查詢,如果username 不同空時(shí)還要加入用戶名作為條件。這種情況在我們的多條件組合查詢中經(jīng)常會碰到。

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      當(dāng)查詢條件id和username都存在時(shí),控制臺打印的sql語句如下:

      … … … //獲得MyBatis框架生成的UserMapper接口的實(shí)現(xiàn)類 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User condition = new User(); condition.setId(1); condition.setUsername("lucy"); User user = userMapper.findByCondition(condition); … … …

      1

      2

      3

      4

      5

      6

      7

      8

      當(dāng)查詢條件只有id存在時(shí),控制臺打印的sql語句如下:

      … … … //獲得MyBatis框架生成的UserMapper接口的實(shí)現(xiàn)類 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User condition = new User(); condition.setId(1); User user = userMapper.findByCondition(condition); … … …

      1

      2

      3

      4

      5

      6

      7

      8

      循環(huán)執(zhí)行sql的拼接操作,例如:SELECT * FROM USER WHERE id IN (1,2,5)。

      1

      2

      3

      4

      5

      6

      7

      8

      測試代碼片段如下:

      … … … //獲得MyBatis框架生成的UserMapper接口的實(shí)現(xiàn)類 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int[] ids = new int[]{2,5}; List userList = userMapper.findByIds(ids); //List ids = new ArrayList(); //ids.add(2) //ids.add(5) System.out.println(userList); … … …

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      foreach標(biāo)簽的屬性含義如下:

      標(biāo)簽用于遍歷集合,它的屬性:

      ?collection:代表要遍歷的集合元素,注意編寫時(shí)不要寫#{}

      ?open:代表語句的開始部分

      ?close:代表結(jié)束部分

      ?item:代表遍歷集合的每個(gè)元素,生成的變量名

      ?sperator:代表分隔符

      Sql 中可將重復(fù)的 sql 提取出來,使用時(shí)用 include 引用即可,最終達(dá)到 sql 重用的目的

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      MyBatis映射文件配置:

    1. <strike id="iymgc"></strike>
      • <strike id="iymgc"><s id="iymgc"></s></strike><strike id="iymgc"><s id="iymgc"></s></strike>