本篇文章給大家分享的是有關(guān)使用Mybatis如何實(shí)現(xiàn)文件映射,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了鳳陽免費(fèi)建站歡迎大家使用!
一、輸入映射
parameterType
指定輸入?yún)?shù)的Java類型,可以使用別名或者類的全限定名。它可以接收簡(jiǎn)單類型、POJO、HashMap。
1、傳遞簡(jiǎn)單類型
根據(jù)用戶ID查詢用戶信息:
<select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> SELECT * FROM USER WHERE id =#{id} </select>
2、傳遞POJO對(duì)象
添加用戶:
<insert id="insertUser" parameterType="com.itheima.mybatis.po.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>
3、傳遞POJO包裝對(duì)象
開發(fā)中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),
這時(shí)可以使用包裝對(duì)象傳遞輸入?yún)?shù)。
3.1需求
綜合查詢用戶信息,需要傳入查詢條件復(fù)雜,比如(用戶信息、訂單信息、商品信息)。
3.2 定義包裝對(duì)象
一般User.java類要和數(shù)據(jù)表表字段一致,最好不要在這里面添加其他字段,在mybatis的逆向工程時(shí),會(huì)根據(jù)表結(jié)構(gòu),生成po類,
如果在po類中擴(kuò)展字段,此時(shí)會(huì)被覆蓋掉。
所以針對(duì)要擴(kuò)展的po類,我們需要?jiǎng)?chuàng)建一個(gè)擴(kuò)展類,來繼承它。
public class UserExt extends User{ //這里可以定義user的一些擴(kuò)展信息 }
定義POJO包裝類:
public class UserQueryVO { //用戶信息 private UserExt userExt; //商品ID集合 private List<Integer> idList; //商品信息 public List<Integer> getIdList() { return idList; } public void setIdList(List<Integer> idList) { this.idList = idList; } public UserExt getUserExt() { return userExt; } public void setUserExt(UserExt userExt) { this.userExt = userExt; } //訂單信息 }
3.3編寫Mapper接口
//通過包裝類來進(jìn)行復(fù)雜的用戶信息綜合查詢
public List<UserExt> findUserList(UserQueryVO userQueryVO);
3.4編寫mapper映射文件
<!-- 通過包裝類來進(jìn)行復(fù)雜的用戶信息綜合查詢 --> <select id="findUserList" parameterType="userQueryVO" resultType="userExt"> SELECT * FROM USER WHERE sex=#{userExt.sex} AND username LIKE '%${userExt.username}%' </select>
注意:入?yún)⒌念愋妥優(yōu)閁serQueryVO、結(jié)果集的類型變?yōu)閁serExt,#{}里面的參數(shù)變?yōu)閁serQueryVO對(duì)象中的userExt屬性的sex和username子屬性。
3.5編寫測(cè)試代碼
@Test public void findUserListTest() { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通過SqlSession,獲取mapper接口的動(dòng)態(tài)代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //構(gòu)造userQueryVO對(duì)象 UserQueryVO userQueryVO = new UserQueryVO(); // 構(gòu)造UserExt對(duì)象 UserExt userExt = new UserExt(); userExt.setSex("1"); userExt.setUsername("小明"); userQueryVO.setUserExt(userExt); // 調(diào)用mapper對(duì)象的方法 List<UserExt> list = userMapper.findUserList(userQueryVO); System.out.println(list); // 關(guān)閉SqlSession sqlSession.close(); }
4、傳遞HashMap
同傳遞POJO對(duì)象一樣,map的key相當(dāng)于pojo的屬性。
4.1映射文件
<!-- 傳遞hashmap綜合查詢用戶信息 --> <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{<span >id</span>} and username like '%${<span >username</span>}%' </select>
上邊紅色標(biāo)注的id和username是hashmap的key。
4.2測(cè)試代碼
Public void testFindUserByHashmap()throws Exception{ //獲取session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper接口實(shí)例 UserMapper userMapper = session.getMapper(UserMapper.class); //構(gòu)造查詢條件Hashmap對(duì)象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理員"); //傳遞Hashmap對(duì)象查詢用戶列表 List<User>list = userMapper.findUserByHashmap(map); //關(guān)閉session session.close(); }
異常測(cè)試:
傳遞的map中的key和sql中解析的key不一致。
測(cè)試結(jié)果沒有報(bào)錯(cuò),只是通過key獲取值為空。
二、輸出映射
1、resultType
(1)使用方法
使用resultType進(jìn)行結(jié)果映射時(shí),查詢的列名和映射的pojo屬性名完全一致,該列才能映射成功。
如果查詢的列名和映射的pojo屬性名全部不一致,那么映射的對(duì)象為空,不會(huì)創(chuàng)建pojo對(duì)象;
如果查詢的列名和映射的pojo屬性名有一個(gè)一致,那么映射的對(duì)象不為空,會(huì)創(chuàng)建pojo對(duì)象,但是只有映射正確的那一個(gè)屬性才有值。
(2)輸出簡(jiǎn)單類型
注意,對(duì)簡(jiǎn)單類型的結(jié)果映射也是有要求的,查詢的列必須是一列,才能映射為簡(jiǎn)單類型。
當(dāng)輸出結(jié)果只有一列時(shí),可以使用ResultType指定簡(jiǎn)單類型作為輸出結(jié)果類型。
2.1需求
綜合查詢用戶總數(shù),需要傳入查詢條件復(fù)雜,比如(用戶信息、訂單信息、商品信息)。
2.2Mapper映射文件
<!-- 綜合查詢用戶信息總數(shù),需要傳入查詢條件復(fù)雜,比如(用戶信息、訂單信息、商品信息) --> <select id="findUsersCount" parameterType="UserQueryVO" resultType="int"> SELECT count(1) FROM USER WHERE sex = #{userExt.sex} AND username LIKE '%${userExt.username}%' </select>
2.3Mapper接口
//綜合查詢用戶信息總數(shù)。學(xué)習(xí):resultType輸出簡(jiǎn)單類型 public int findUsersCount(UserQueryVO vo);
2.4測(cè)試代碼
@Test public void testFindUsersCount() { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通過SqlSession,獲取mapper接口的動(dòng)態(tài)代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //構(gòu)造userQueryVO對(duì)象 UserQueryVO userQueryVO = new UserQueryVO(); // 構(gòu)造UserExt對(duì)象 UserExt userExt = new UserExt(); userExt.setSex("1"); userExt.setUsername("小明"); userQueryVO.setUserExt(userExt); int count = mapper.findUsersCount(userQueryVO); System.out.println(count); // 關(guān)閉SqlSession sqlSession.close(); }
(3)輸出POJO單個(gè)對(duì)象和列表
注意:輸出單個(gè)pojo對(duì)象和pojo列表(盛放pojo對(duì)象)時(shí),mapper映射文件中的resultType的類型是一樣的,mapper接口的方法返回值不同。
3.1Mapper映射文件
<select id="findUsersByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select>
3.2Mapper接口
1、輸出單個(gè)pojo對(duì)象
//根據(jù)用戶名稱來模糊查詢用戶信息 public User findUsersByName(String username);
2、輸出pojo列表
//根據(jù)用戶名稱來模糊查詢用戶信息列表 public List<User> findUsersByName(String username);
總結(jié):同樣的mapper映射文件,返回單個(gè)對(duì)象和對(duì)象列表時(shí),mapper接口在生成動(dòng)態(tài)代理的時(shí)候,
會(huì)根據(jù)返回值的類型,決定調(diào)用selectOne方法還是selectList方法。
2、resultMap
resultMap可以進(jìn)行高級(jí)結(jié)果映射(一對(duì)一、一對(duì)多映射)。
(1)使用方法
如果查詢出來的列名和屬性名不一致,通過定義一個(gè)resultMap將列名和pojo屬性名之間作一個(gè)映射關(guān)系。
1、 定義resultMap
2、 使用resultMap作為statement的輸出映射類型。
(2)需求
把下面SQL的輸出結(jié)果集進(jìn)行映射
SELECT id id_,username username_,sex sex_FROM USER WHERE id = 1
(3)Mapper映射文件
定義resultMap:
<!-- 定義resultMap --> <!-- [id]:定義resultMap的唯一標(biāo)識(shí) [type]:定義該resultMap最終映射的pojo對(duì)象 [id標(biāo)簽]:映射結(jié)果集的唯一標(biāo)識(shí)列,如果是多個(gè)字段聯(lián)合唯一,則定義多個(gè)id標(biāo)簽 [result標(biāo)簽]:映射結(jié)果集的普通列 [column]:SQL查詢的列名,如果列有別名,則該處填寫別名 [property]:pojo對(duì)象的屬性名 --> <resultMap type="user" id="userResultMap"> <id column="id_" property="id"/> <result column="username_" property="username"/> <result column="sex_" property="sex"/> </resultMap>
定義statement:
<!-- 根據(jù)ID查詢用戶信息(學(xué)習(xí)resultMap) --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_,sex sex_ FROM USER WHERE id = #{id} </select>
(4)Mapper接口定義
//根據(jù)ID查詢用戶信息(學(xué)習(xí)resultMap) public User findUserByIdResultMap(int id);<strong> </strong>
定義Statement使用resultMap映射結(jié)果集時(shí),Mapper接口定義方法的返回值類型為mapper映射文件中resultMap的type類型。
(5)測(cè)試代碼
@Test public void findUserByIdResultMapTest() { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通過SqlSession,獲取mapper接口的動(dòng)態(tài)代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 調(diào)用mapper對(duì)象的方法 User user = userMapper.findUserByIdResultMap(1); System.out.println(user); // 關(guān)閉SqlSession sqlSession.close(); }
三、動(dòng)態(tài)SQL
1、If和where
Ø If標(biāo)簽:作為判斷入?yún)硎褂玫模绻蠗l件,則把if標(biāo)簽體內(nèi)的SQL拼接上。
注意:用if進(jìn)行判斷是否為空時(shí),不僅要判斷null,也要判斷空字符串‘';
Ø Where標(biāo)簽:會(huì)去掉條件中的第一個(gè)and符號(hào)。
(1)需求
用戶信息綜合查詢列表和用戶信息綜合查詢總數(shù)這兩個(gè)statement的定義使用動(dòng)態(tài)SQL。
(2)映射文件
<!-- 綜合查詢用戶信息,需要傳入查詢條件復(fù)雜,比如(用戶信息、訂單信息、商品信息) --> <select id="findUsersByQueryVO" parameterType="cn.itcast.mybatis.po.QueryUserVO" resultType="User"> SELECT * FROM USER <where> <if test="userExt != null"> <if test="userExt.sex != null and userExt.sex != ''"> AND sex = #{userExt.sex} </if> <if test="userExt.username != null and userExt.username != ''"> AND username LIKE '%${userExt.username}%' </if> </if> </where> </select> <!-- 綜合查詢用戶信息總數(shù),需要傳入查詢條件復(fù)雜,比如(用戶信息、訂單信息、商品信息) --> <select id="findUsersCount" parameterType="QueryUserVO" resultType="int"> SELECT count(1) FROM USER <where> <if test="userExt != null"> <if test="userExt.sex != null and userExt.sex != ''"> AND sex = #{userExt.sex} </if> <if test="userExt.username != null and userExt.username != ''"> AND username LIKE '%${userExt.username}%' </if> </if> </where> </select>
(3)Mapper接口
//通過包裝類來進(jìn)行復(fù)雜的用戶信息綜合查詢 public List<UserExt> findUserList(UserQueryVO userQueryVO); //綜合查詢用戶總數(shù) public int findUsersCount(UserQueryVO userQueryVO);
(4)測(cè)試代碼
不傳用戶名:
@Test public void testFindUserList() throws Exception{ // 創(chuàng)建UserMapper對(duì)象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 由mybatis通過sqlsession來創(chuàng)建代理對(duì)象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); QueryUserVO vo = new QueryUserVO(); User user = new User(); //此處使用動(dòng)態(tài)SQL,不傳username參數(shù) user.setSex("1"); // user.setUsername("小明"); vo.setUser(user); List<User> list = mapper.findUserList(vo); System.out.println(user); sqlSession.close(); }
輸出的SQL如下(也不包含用戶名):
通過測(cè)試可以得知,打印出的SQL語句確實(shí)會(huì)隨著條件的滿足情況而不一樣。
2、SQL片段
Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。
2.1定義SQL片段
使用sql標(biāo)簽來定義一個(gè)SQL片段:
<!-- 定義SQL片段 --> <!-- [sql標(biāo)簽]:定義一個(gè)SQL片段 [id]:SQL片段的唯一標(biāo)識(shí) 建議: 1、SQL片段中的內(nèi)容最好是以單表來定義 2、如果是查詢字段,則不要寫上SELECT 3、如果是條件語句,則不要寫上WHERE --> <sql id="select_user_where"> <if test="userExt != null"> <if test="userExt.sex != null and userExt.sex != ''"> AND sex = #{userExt.sex} </if> <if test="userExt.username != null and userExt.username != ''"> AND username LIKE '%${userExt.username}%' </if> </if> </sql>
2.2引用SQL片段
使用<includerefid='' /> 來引用SQL片段:
<!-- 根據(jù)用戶id來查詢用戶信息(使用SQL片段) --> <!-- [include標(biāo)簽]:引用已經(jīng)定義好的SQL片段 [refid]:引用的SQL片段id --> <select id="findUserList" parameterType="userQueryVO" resultType="userExt"> SELECT * FROM USER <where> <include refid="select_user_where"/> </where> </select> <!-- 綜合查詢用戶信息總數(shù),需要傳入查詢條件復(fù)雜,比如(用戶信息、訂單信息、商品信息) --> <select id="findUsersCount" parameterType="QueryUserVO" resultType="int"> SELECT count(1) FROM USER <where> <include refid="select_user_where"/> </where> </select>
3、foreach
向sql傳遞數(shù)組或List時(shí),mybatis使用foreach解析數(shù)組里的參數(shù)并拼接到SQL中。
(1)傳遞pojo對(duì)象中的list集合
1.1需求
在用戶查詢列表和查詢總數(shù)的statement中增加多個(gè)id輸入查詢。
1.2SQL
SELECT * FROM user WHERE id IN (1,10,16)
1.3定義pojo中的list屬性
package com.itheima.mybatis.po; import java.util.List; /** * <p>Title: UserQueryVO</p> * <p>Description: TODO(這里用一句話描述這個(gè)類的作用) <p> */ public class UserQueryVO { //用戶信息 private UserExt userExt; //商品ID集合 private List<Integer> idList; //商品信息 public List<Integer> getIdList() { return idList; } public void setIdList(List<Integer> idList) { this.idList = idList; } public UserExt getUserExt() { return UserExt; } public void setUserExt(UserExt userExt) { this.UserExt = UserExt; } //訂單信息 }
1.4映射文件
<!-- [foreach標(biāo)簽]:表示一個(gè)foreach循環(huán) --> <!-- [collection]:集合參數(shù)的名稱,如果是直接傳入集合參數(shù),則該處的參數(shù)名稱只能填寫[list]。 --> <!-- [item]:每次遍歷出來的對(duì)象 --> <!-- [open]:開始遍歷時(shí)拼接的串 --> <!-- [close]:結(jié)束遍歷時(shí)拼接的串 --> <!-- [separator]:遍歷出的每個(gè)對(duì)象之間需要拼接的字符 --> <if test="idList != null and idList.size > 0"> <foreach collection="idList" item="id" open="AND id IN (" close=")" separator=","> #{id} </foreach> </if>
1.5Mapper接口
//根據(jù)用戶ID的集合查詢用戶列表(學(xué)習(xí)foreach標(biāo)簽之通過POJO對(duì)象傳ID集合) public List<UserExt> findUserList(UserQueryVO vo);
1.6測(cè)試代碼
@Test public void testFindUserList() { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通過SqlSession,獲取mapper接口的動(dòng)態(tài)代理對(duì)象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 構(gòu)造QueryUserVO對(duì)象 QueryUserVO vo = new QueryUserVO(); // UserExt ext = new UserExt(); // ext.setUsername("小明"); // ext.setSex("1"); // vo.setUserExt(ext); // 創(chuàng)建用戶ID集合,然后設(shè)置到QueryUserVO對(duì)象中 List<Integer> idList = new ArrayList<Integer>(); idList.add(1); idList.add(10); idList.add(16); vo.setIdList(idList); // 調(diào)用mapper代理對(duì)象的方法 List<UserExt> list = mapper.findUserList(vo); System.out.println(list); // 關(guān)閉SqlSession sqlSession.close(); }
(2)直接傳遞List集合
2.1需求
根據(jù)用戶ID的集合查詢用戶列表
2.2SQL
SELECT * FROM user WHERE id IN (1,10,16)
2.3映射文件
<!-- 根據(jù)用戶ID的集合查詢用戶列表(學(xué)習(xí)foreach標(biāo)簽之直接傳ID集合) --> <!-- [foreach標(biāo)簽]:表示一個(gè)foreach循環(huán) [collection]:集合參數(shù)的名稱,如果是直接傳入集合參數(shù),則該處的參數(shù)名稱只能填寫[list]。 [item]:定義遍歷集合之后的參數(shù)名稱 [open]:開始遍歷之前需要拼接的SQL串 [close]:結(jié)束遍歷之后需要拼接的SQL串 [separator]:遍歷出的每個(gè)對(duì)象之間需要拼接的字符 --> <select id="findUsersByIdList" parameterType="java.util.List" resultType="user"> SELECT * FROM USER <where> <if test="list != null and list.size > 0"> <foreach collection="list" item="id" open="AND id IN (" close=")" separator=","> #{id} </foreach> </if> </where> </select>
2.4Mapper接口
//根據(jù)用戶ID的集合查詢用戶列表(學(xué)習(xí)foreach標(biāo)簽之直接傳ID集合) public List<User> findUsersByIdList (List<Integer> idList);
2.5測(cè)試代碼
@Test public void findUsersByIdListTest() { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通過SqlSession,獲取mapper接口的動(dòng)態(tài)代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 構(gòu)造List<Integer>集合 List<Integer> idList = new ArrayList<Integer>(); idList.add(1); idList.add(10); idList.add(16); // 調(diào)用mapper對(duì)象的方法 List<User> list = userMapper.findUsersByIdList (idList); System.out.println(list); // 關(guān)閉SqlSession sqlSession.close(); }
以上就是使用Mybatis如何實(shí)現(xiàn)文件映射,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:使用Mybatis如何實(shí)現(xiàn)文件映射
網(wǎng)站URL:http://aaarwkj.com/article18/gododp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、App開發(fā)、搜索引擎優(yōu)化、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)