MyBatis知識點複習-06parameter傳入包裝類查詢條件與map的講解

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講解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章