MaBatis(5)输入/输出映射
生活随笔
收集整理的這篇文章主要介紹了
MaBatis(5)输入/输出映射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本次全部學習內容:MyBatisLearning
輸入映射: 通過parameType指定輸入參數的類型,類型可以是簡單類型,hashmap,pojo等 傳遞pojo的包裝對象 需求: 即使一個綜合查詢,需要傳入多個查詢的條件 開始敲代碼了...... 在這次使實踐里面,需要新建兩個類,和使用之前的的測試類進行測試 新建UserCustomer.java主要是繼承User.java其他的代碼不寫 public class UserCustomer extends User{ }?在UserView.java中:
//在這里包裝所需要的查詢條件//用戶綜合查詢查詢條件private UserCustomer userCustomer;public UserCustomer getUserCustomer() {return userCustomer;}public void setUserCustomer(UserCustomer userCustomer) {this.userCustomer = userCustomer;} 在UserMapper.java中定義綜合查詢的方法 //綜合查詢public List<User> findBySelect(UserView userView) throws Exception;?在UserMapper.xml文件中實現查詢的代碼:
<!-- 綜合查詢 --><select id="findBySelect" parameterType="com.MrChengs.po.UserView" resultType="com.MrChengs.po.UserCustomer" >select * from user where user.id=#{userCustomer.id} and user.username like '%${userCustomer.username}%'</select> 講解:parameterType這個是我們輸入參數的類型,#{userCustomer.id}由此可以定位到UserView.java這個類面,在進行定位就是userCustomer, 對userCustomer在進一步就是UserCustomer這個類,他是繼承User這個類,此時到User這個類,已經到底,我們可以發現id這和屬性,這個userCustomer.id相當于一個連點的方法 resultType:使我們綜合查詢的類型,此時使userCustomer 測試類中: //綜合查詢 @Testpublic void testfindBySelect() throws Exception{SqlSession sqlSession = getSqlSessionFactory().openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);UserView userView = new UserView();UserCustomer userCustomer = new UserCustomer();userCustomer.setId(16);userCustomer.setUsername("小明");userView.setUserCustomer(userCustomer);List<User> user = mapper.findBySelect(userView);for(User u : user){System.out.println(u);}sqlSession.close();}?查詢成功:
DEBUG [main] - ==> Preparing: select * from user where user.id=? and user.username like '%小明%' DEBUG [main] - ==> Parameters: 16(Integer) DEBUG [main] - <== Total: 1 User [id=16, username=張小明, birthday=null, sex=1, address=河南鄭州]?生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 ).
輸出映射: 對于resultType: 使用此屬性進行輸出映射時,只有在查詢出來的列和pojo中的屬性名一致,該列才可以映射成功 若查詢出來的列名和pojo中的屬性名全部不一致,沒有創建pojo對象 只要查詢出來的列名和pojo中的屬性名有一個一致,就會創建pojo對象 現在來實現一個測試的例子: 在UserMapper.java的接口類中: //擦尋用戶信息總數public int findUserCount(UserView userView) throws Exception;?在UserMapper.xml文件中:
<!-- 輸出映射查詢用戶信息總數 --><select id="findUserCount" parameterType="com.MrChengs.po.UserView" resultType="int">select count(*) From user where sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'</select>?
在測試類中進行測試: //查詢用戶信息總數 @Testpublic void testfindUserCount() throws Exception{SqlSession sqlSession = getSqlSessionFactory().openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);UserView userView = new UserView();UserCustomer userCustomer = new UserCustomer();userCustomer.setSex(1);userCustomer.setUsername("小明");userView.setUserCustomer(userCustomer);int count = mapper.findUserCount(userView);System.out.println(count);sqlSession.close();}?結果:
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 963522361. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@396e2f39] DEBUG [main] - ==> Preparing: select count(*) From user where sex=? and user.username like '%小明%' DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 3 DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@396e2f39]?
輸出pojo對象和輸出pojo列表在sql中定義的resultType是一樣的。 返回單個pojo對象要保證sql查詢出來的結果集為單條,內部使用session.selectOne方法調用,mapper接口使用pojo對象作為方法返回值。 返回pojo列表表示查詢出來的結果集可能為多條,內部使用session.selectList方法,mapper接口使用List<pojo>對象作為方法返回值。 resultMap: resultType可以指定pojo將查詢結果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。 如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關系?,resultMap實質上還需要將查詢結果映射到pojo對象中。 resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。 下面是代碼的實踐: 測試: 在UserMapper.java接口中: //測試resultMappublic User findByMap(int id) throws Exception;?在UserMapper.xml中:
<!-- 簡單測試resultMap的使用 --><!-- type:resultMap最終映射的java 對象類型,可以使用別名/全類名 --><!-- id:使當前resultMap的唯一標識 --><resultMap type="com.MrChengs.po.User" id="ByMap"> <!-- id標識查詢結果的唯一標識 --><!-- column:查詢出來的列名 --><!-- property:type指定類型的pojo類型的映射屬性,最終resultMap對cloumn和property做出一對一的映射 --><id column="_id" property="id"/> <!-- result:對普通列名的映射 --><!-- column:查詢出來的列名 --><!-- property:和type的類型一一映射 --><result column="_username" property="username"/></resultMap><select id="findByMap" parameterType="int" resultMap="ByMap">select id _id,username _username from user where id=#{id}</select>?
可以在sql軟件中測試select id _id,username _username from user where id=?? 查看我們得到的結果。 <id />:此屬性表示查詢結果集的唯一標識,非常重要。如果是多個字段為復合唯一約束則定義多個<id />。 Property:表示person類的屬性。 Column:表示sql查詢出來的字段名。 Column和property放在一塊兒表示將sql查詢出來的字段映射到指定的pojo類屬性上。 <result />:普通結果,即pojo的屬性。 在測試類中: //測試resultMap @Testpublic void testfindByMap() throws Exception{SqlSession sqlSession = getSqlSessionFactory().openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.findByMap(1);System.out.println(user);sqlSession.close();}?
結果: DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 2050835901. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7a3d45bd] DEBUG [main] - ==> Preparing: select id _id,username _username from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, birthday=null, sex=0, address=null]?
小結: 使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功。 如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。轉載于:https://www.cnblogs.com/Mrchengs/p/9759719.html
總結
以上是生活随笔為你收集整理的MaBatis(5)输入/输出映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 常用设计模式demo
- 下一篇: 使用Xmanager远程连接Linux