MyBatis知識點複習-06parameter傳入包裝類查詢條件與map的講解
上一篇:MyBatis知識點複習-05加載映射文件的幾種方式
下一篇:MyBatis知識點複習-07resultType與resultMap講解
本節主要講解在查詢數據中參數類型傳遞的一些知識。
一.包裝類傳遞
在開始講解前我需要大家先看看這篇文章 POJO和JavaBean的區別這個問題也是面試時回問到的基礎問題,標題已經說了我們要傳遞的是包裝類,那麼這裏你可以理解爲POJO包裝對象(簡單Java對象),還記得前面的這樣的內容嗎:
<insert id="saveUser" parameterType="domain.User">
insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
看到上面的**parameterType=“domain.User”**這裏就是傳遞的POJO對象,那麼現在我們有個疑問了,什麼是POJO包裝類對象呢?
比如我要查詢一個用戶的信息,還記得以前講過的查詢獲取一個User對象怎麼做到的嗎?這是我在第一篇入門案例用到的配置文件的信息
<select id="findUserById" parameterType="int" resultType="domain.User">
select * from user where id = #{id}
</select>
這裏的findUserById不是真實存在的,一切交給了mybatis,並且在測試文件中我們用到selectOne函數去實現的,當然如果返回值不止一個User可以用List<User>
User findUserById = (User)sqlSession.selectOne("findUserById", 10);
這裏是讓大家大概回顧一下我們以前的查詢條件,一般都是條件都是侷限在User對象的屬性範圍類的,爲更好理解,下面是user表的字段,
我們之前都是通過id,username,birthday,sex,address,或者如果要前面這幾種多個條件滿足我們創建User對象把屬性值傳到該對象在把對象作爲參數傳遞個函數。
下面我們再來看一張與user表有關的表orders表
現在我要求查詢sex爲1(我沒寫錯就是1,表中數據是這樣的,如果你不清楚說明你沒看前面的文章,相關的資料我都在第一篇文章分享過了)且他在orders表中的number值爲1000010,那你還可以像前面那樣來傳遞參數嗎?顯然不可以,於是我們可以考慮創建一個POJO類叫做UserQueryVO,他擁有User與Orders成員對象。
現在我們終於進入正題了
我們先創建下面這個POJO包裝類對象:
package vo;
import domain.Orders;
import domain.User;
public class UserQueryVO {
private User user;
public Orders getOrders() {
return orders;
}
public void setOrders(Orders orders) {
this.orders = orders;
}
private Orders orders;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
接下來在UserMapper接口裏面加上下面函數
public List<User> findUsers(UserQueryVO userQueryVO);
然後再SqlMapConfig裏面的typeAliases標籤修改爲下面
<typeAliases>
<typeAlias type="vo.UserQueryVO" alias="vo"></typeAlias>
<package name="domain"/>
</typeAliases>
這裏提醒一下typeAlias必須在package前面否則報錯
在mapper/UserMapper.xml文件里加上下面這段
<select id="findUsers" parameterType="vo" resultType="user">
SELECT u.* FROM USER u,orders o WHERE u.id = o.user_id AND sex = #{user.sex} AND number = #{orders.number}
</select>
將TestUser.java的Test文件內容改爲如下:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserQueryVO userQueryVO = new UserQueryVO();
User user = new User();
user.setSex("1");
userQueryVO.setUser(user);
Orders orders = new Orders();
orders.setNumber("1000010");
userQueryVO.setOrders(orders);
List<User> users = mapper.findUsers(userQueryVO);
// mapper.saveUser(user);
System.out.println(users);
sqlSession.commit();//提交事務,否則會事務回滾
爲方便演示將orders表數據做如下修改(那個x是3我的失誤。。。)
結果如下:
說道這裏,你會發現其實這一部分主要就是一個思想性的東西而已。
二.Map對象的傳遞
該方式和上一個POJO包裝類傳遞大同小異。
現在UserMapper接口裏面加上下面這個方法:
public List<User> findUserByMap(Map<String,String> map);
接下來在mapper/UserMapper.xml文件里加上下面這段
<select id="findUserByMap" resultType="User" parameterType="java.util.Map">
select * from user where sex = #{sex} and username = #{username}
</select>
關於這裏的#{sex}與#{username}爲什麼這樣寫,是因爲在傳遞map集合時傳入的key的名字叫做這兩個(你看我下面的TestUser.java裏面的Tset的方法就明白了),最後有個小點,就是這裏的java.util.Map可以直接寫爲hashmap(當然傳參數要是這個纔行),map,Map,mAp反正是這樣的字母就OK,大小寫無所謂,爲什麼可以這樣呢?這就是涉及到mybatis的底層實現的原理,關於Mybatis框架的源碼解析我後面會出專欄教程來講解,讀完你會豁然開朗(最近學習忙碌沒有時間)
Tset方法的代碼:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, String> map = new HashMap<>();
map.put("sex","1");
map.put("username","張小明");
List<User> userByMap = mapper.findUserByMap(map);
System.out.println(userByMap);
sqlSession.commit();//提交事務,否則會事務回滾
結果如下:
上一篇:MyBatis知識點複習-05加載映射文件的幾種方式
下一篇:MyBatis知識點複習-07resultType與resultMap講解