【Mybatis框架】輸入映射-pojo包裝類型

下面說說關於mapper.xml文件中的輸入映射

咱們看一下以前爲User配置的mapper文件UserMapper.xml:java

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace命名空間,做用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper代理方法開發,namespace有特殊重要的做用 -->
<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
    <!-- 在映射文件中配置不少sql語句 -->
    
    <!-- 需求:經過id查詢用戶表的記錄 -->
    <!-- 經過select執行數據庫查詢,
         id:標示映射文件中的sql,成爲Statement的id 
         將sql語句封裝到mappedStatement對象中,因此將id稱爲statement的id,
         
         parameterType:指定輸入參數的類型,
         
         #{}標示一個佔位符,
         
         #{id}其中id表示接收輸入參數的名稱,若是輸入參數是簡單類型,那麼#{}中的值能夠任意(如value)。
         
         resultType:指定sql輸出結果的映射的java對象類型,
         select指定resultType表示將單條記錄映射成java對象-->    
    <select id="findUserById" parameterType="int" resultType="cn.edu.hpu.mybatis.PO.User">
      SELECT * FROM USER WHERE id=#{id}
    </select>
    
    <!-- ${}:表示拼接sql串,將接收到的參數內容不加任何修飾拼接在sql中。
         使用${}拼接sql,引發sql注入。
         ${}中只能使用value-->
    <select id="findUserByUserName" parameterType="java.lang.String" 
            resultType="cn.edu.hpu.mybatis.PO.User">
       select * from user where username like '%${value}%' 
    </select>
    
    <!-- 添加用戶
    parameterType:指定輸入參數類型是pojo(包括用戶信息) 
    #{}中指定POJO的屬性名,接收到POJO對象的屬性值,mybatis經過OGNL獲取對象的屬性
    -->
    <insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
        <!-- 將插入數據的主鍵返回,返回到user對象中。
        SELECT_INSERT_ID():獲得剛insert進去的主鍵值,只適用於自增主鍵 
        KeyProperty:將查詢到主鍵值設置到parameterType指定對象的哪一個屬性。
        order:SELECT LAST_INSERT_ID()執行順序,相對於insert語句來講它的執行順序
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        
        <!-- 使用MySql的UUID來生成主鍵
        執行過程:
        首先經過uuid()獲得主鍵,將主鍵設置到user對象的id屬性中
        其次在insert執行時,從user對象中取出id屬性值 
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        insert into user(id,birthday,sex,address) value(#{id},#{birthday,jdbcType=DATE},#{sex},#{address})-->
        
        insert into user(username,birthday,sex,address) value(#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
    </insert>
    
    <!-- 刪除用戶 -->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
    <!-- 更新用戶 
    分析:
    須要傳入用戶的id,須要傳入用戶的更新信息.
    parameterType指定user對象,包括id和更新信息(注意:id必須存在)
    #{id}:從輸入user對象中獲取id屬性值-->
   <update id="updateUser" parameterType="cn.edu.hpu.mybatis.PO.User">
        update user set username=#{username},birthday=#{birthday,jdbcType=DATE},sex=#{sex},address=#{address} 
        where id=#{id}
    </update>
</mapper>

在mapper.xml中咱們經過parameterType指定輸入參數的類型,類型能夠是簡單類型、hashmap、pojo的包裝類型

上面的查詢語句輸入的都是一個查詢參數,當咱們輸入多個查詢參數時應當怎麼操做呢?這就要用到POJO的包裝對象把大量的查詢參數包裝在對象中傳遞給只能接收單個參數的Mapper操做方法了,看看如何來定義POJO包裝對象

1傳遞pojo的包裝對象
1.1需求
完成用戶信息的綜合查詢,須要傳入查詢條件很複雜(可能包括用戶信息、其它信息,好比商品、訂單的)

1.2定義包裝類型pojo
針對上邊需求,建議使用自定義的包裝類型的pojo。
在包裝類型的pojo中將複雜的查詢條件包裝進去。

寫一個例子
首先咱們前面定義了一個User類對象,若是對象中的值要發生拓展,在源代碼上改是不合適的(由於咱們後期要使用工具自動生成User類,裏面的東西建議 不要改動),這裏咱們建立一個User的拓展類UserCustom,繼承自User類,咱們下面包裝查詢條件時使用的是UserCustom,特此說 明。

查詢包裝類UserQueryVo:sql

package cn.edu.hpu.mybatis.PO;

public class UserQueryVo {

    //在這裏包裝須要的查詢條件
    
    //用戶查詢條件
    private UserCustom userCustom;

    public UserCustom getUserCustom() {
        return userCustom;
    }

    public void setUserCustom(UserCustom userCustom) {
        this.userCustom = userCustom;
    }
    
    //包裝其餘的查詢條件,訂單、商品
    //......
}

1.3mapper.xml
在UserMapper.xml中定義用戶信息綜合查詢(查詢條件複雜,經過高級查詢進行復雜關聯查詢)。數據庫

<!-- 用戶信息綜合查詢 
    #{UserCustom.sex}取出包裝對象中性別值
    ${UserCustom.username}取得pojo包裝對象中用戶名稱
    -->
<select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" 
    resultType="cn.edu.hpu.mybatis.PO.UserCustom">
    select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
</select>

在UserMapper類中定義綜合查詢方法:
//用戶管理的Dao接口mybatis

public interface UserMapper {
    
    //用戶信息綜合查詢
    public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
    ......
}

以後進行測試:app

//用戶信息綜合查詢
工具

@Test 
public void testFindUserList() throws Exception{
    
    SqlSession sqlSession=sqlSessionFactory.openSession();
    
    //建立UserMapper代理對象
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    
    //建立包裝對象,設置查詢條件
    UserQueryVo userQueryVo=new UserQueryVo();
    UserCustom userCustom=new UserCustom();
    userCustom.setSex("男");
    userCustom.setUsername("張三");
    userQueryVo.setUserCustom(userCustom);
    
    //調用userMapper的方法
    List<UserCustom> users=userMapper.findUserList(userQueryVo);
    
    for (int i = 0; i < users.size(); i++) {
        UserCustom user=(UserCustom)users.get(i);
        System.out.println(user.getId()+":"+user.getUsername());
    }
}

測試結果:
1:張三
4:張三丰
測試

相關文章
相關標籤/搜索