Mybatis resultType關聯結果集映射


       resultType可以把查詢的結果分裝到pojo類型對象中,但pojo類的屬性名和查詢到的數據庫表的字段名必須保持一致。如果sql查詢到的字段與pojo的屬性名不一致,則需要使用resultMap將字段名和屬性名對應起來,進行手動配置封裝,將結果映射到pojo中。

數據庫表的結構:

create table sys_user(
     user_id int(5) auto_increment primary_key,
     user_name nvarchar(20),
     user_sex nvarchar(2),
     user_age int(3),
     user_address nvarchar(50)
);

而pojo下的User類

public class User {
    private int id;
    private String name;
    private String sex;
    private int age;
    private String address;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

UserMapper.xml

<mapper namespace="com.company.mapper.UserMapper">
    <!--resultMap:填入配置resultMap標簽的id值-->
    <select id="queryUserById" resultMap="userResultMap" parameterType="int">
        select * from sys_user where user_id=#{id}
    </select>
    <!--
       配置resultMap 映射不同的字段名和屬性名
       id屬性:resultMap唯一標識
       type屬性:指定映射到哪一個pojo中
    -->
    <resultMap id="userResultMap" type="com.company.pojo.User">
        <!--
            id標簽定義主鍵,非常重要,如果是多個字段,則定義多個id標簽
            column屬性:主鍵在數據庫中的列名
            property屬性:主鍵在pojo中的屬性名
        -->
        <id column="user_id" property="id"></id>
        <!--
            result標簽定義普通屬性
            column屬性:非主鍵列名在數據庫中的列名
            property屬性:非主鍵列名在pojo中對應的屬性名
        -->
        <result column="user_name" property="name"></result>
        <result column="user_sex" property="sex"></result>
        <result column="user_age" property="age"></result>
        <result column="user_address" property="address"></result>
    </resultMap>
</mapper>

這樣結果就可以封裝到pojo中。

使用resultMap進行關聯查詢

一個訂單信息只會是一個人下的訂單,所以從查詢訂單信息出發關聯查詢用戶信息為一對一查詢。如果從用戶信息出發查詢用戶下的訂單信息,則為一對多查詢,一個用戶可以下多個訂單。

一對一查詢

一對一數據模型:訂單用戶

1)改動pojo類  

在訂單類中添加User屬性,User屬性是一個引用類型,用於存儲關聯查詢的用戶信息,因為關聯關系是一對一,所以只需要添加單個屬性即可。

Orders.java

public class Orders {
    //訂單id
    private int id;
    //用戶id
    private int userId;
    //訂單號
    private String number;
    //訂單創建時間
    private Date createTime;
    //備注
    private String remark;
    //關聯用戶信息
    private User user;

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", userId=" + userId +
                ", number='" + number + '\'' +
                ", createTime=" + createTime +
                ", remark='" + remark + '\'' +
                ", user=" + user +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

2)配置Mapper.xml文件

先使用id和result屬性,映射orders類的結果集,然后使用association映射關聯對象User的結果集

OrdersMapper.xml

<mapper namespace="com.company.mapper.OrdersMapper">
    <select id="queryOrdersUserList" resultMap="ordersResultMap">
        select * from orders as a
        left join sys_user as b
        on a.user_id=b.user_id
    </select>
    <resultMap id="ordersResultMap" type="com.company.pojo.Orders">
        <id property="id" column="id"></id>
        <result property="userId" column="user_id"></result>
        <result property="number" column="number"></result>
        <result property="createTime" column="createtime"></result>
        <result property="remark" column="remark"></result>
         
        <!--
            association:配置一對一關系
            property屬性:關聯對象在Orders里面的屬性名
            javaType屬性:關聯對象類型
        -->
        <association property="user" javaType="com.company.pojo.User">
            <id property="id" column="user_id"></id>
            <result property="name" column="user_name"></result>
            <result property="sex" column="user_sex"></result>
            <result property="age" column="user_age"></result>
            <result property="address" column="user_address"></result>
        </association>
    </resultMap>
</mapper>

3)測試

    @Test
    public void test() throws Exception{
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        inputStream.close();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
        List<Orders> ordersList = ordersMapper.queryOrdersUserList();
        ordersList.forEach(System.out::println);
        sqlSession.close();
    }

一對多查詢

查詢所有用戶信息及相關訂單

1)修改pojo類,在pojo類添加訂單集合屬性

User.java

public class User {
    //用戶id
    private int id;
    //姓名
    private String name;
    //性別
    private String sex;
    //年齡
    private int age;
    //地址
    private String address;

    private List<Orders> orders;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", orders=" + orders +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public List<Orders> getOrders() {
        return orders;
    }

    public void setOrders(List<Orders> orders) {
        this.orders = orders;
    }
}

2)修改Mapper.xml文件

先使用id和result配置映射User類的結果,然后使用一對多關系的collection標簽配置orders結果

UserMapper.xml

<mapper namespace="com.company.mapper.UserMapper">
    <select id="queryUserOrdersList" resultMap="userOrdersResultMap">
        select * from sys_user as a
        left join orders as b
        on a.user_id=b.user_id
    </select>

    <resultMap id="userOrdersResultMap" type="com.company.pojo.User">
        <id column="user_id" property="id"></id>
        <result column="user_name" property="name"></result>
        <result column="user_sex" property="sex"></result>
        <result column="user_age" property="age"></result>
        <result column="user_address" property="address"></result>

        <!--
            collection:配置一對多關系
            property屬性:關聯對象在Users里面的屬性名
            ofType屬性:集合中pojo對象類型
        -->
        <collection property="orders" ofType="com.company.pojo.Orders">
            <id property="id" column="id"></id>
            <result property="userId" column="user_id"></result>
            <result property="number" column="number"></result>
            <result property="createTime" column="createtime"></result>
            <result property="remark" column="remark"></result>
        </collection>
    </resultMap>
</mapper>

3)測試

    @Test
    public void test() throws Exception{
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        inputStream.close();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.queryUserOrdersList();
        userList.forEach(System.out::println);
        sqlSession.close();
    }

resultMap包含的元素

<!--column不做限制,可以為任意表的字段,而property須為type 定義的pojo屬性-->
<resultMap id="唯一的標識" type="映射的pojo對象">
  <id column="表的主鍵字段,或者可以為查詢語句中的別名字段" jdbcType="字段類型" property="映射pojo對象的主鍵屬性" />
  <result column="表的一個字段(可以為任意表的一個字段)" jdbcType="字段類型" property="映射到pojo對象的一個屬性(須為type定義的pojo對象中的一個屬性)"/>
  <association property="pojo的一個對象屬性" javaType="pojo關聯的pojo對象">
    <id column="關聯pojo對象對應表的主鍵字段" jdbcType="字段類型" property="關聯pojo對象的主席屬性"/>
    <result  column="任意表的字段" jdbcType="字段類型" property="關聯pojo對象的屬性"/>
  </association>
  <!-- 集合中的property須為oftype定義的pojo對象的屬性-->
  <collection property="pojo的集合屬性" ofType="集合中的pojo對象">
    <id column="集合中pojo對象對應的表的主鍵字段" jdbcType="字段類型" property="集合中pojo對象的主鍵屬性" />
    <result column="可以為任意表的字段" jdbcType="字段類型" property="集合中的pojo對象的屬性" />  
  </collection>
</resultMap>

如果collection標簽是使用嵌套查詢,格式如下:

 <collection column="傳遞給嵌套查詢語句的字段參數" property="pojo對象中集合屬性" ofType="集合屬性中的pojo對象" select="嵌套的查詢語句" > 
 </collection>

注意:<collection>標簽中的column:要傳遞給select查詢語句的參數,如果傳遞多個參數,格式為column="{參數名1=表字段1,參數名2=表字段2}"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM