mybatis-多表查询的对象封装

概念

主要用于多表查询时一对一数据封装的简洁灵活。方式一般为子表包含主表的类,然后用resultMap标签来配置,案例如下面数据库中有user和account两张表,user为主表
mabatis实现两张表的联合查询封装到一个对象account中。

案例

1.实体类代码

user类

package edu.yjsj.domain;

import java.io.Serializable;

public class User implements Serializable {
     
    private Integer id;
    private String userName;
    private String userPwd;

    public int getId() {
     
        return id;
    }

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

    public String getUserName() {
     
        return userName;
    }

    public void setUserName(String userName) {
     
        this.userName = userName;
    }

    public String getUserPwd() {
     
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
     
        this.userPwd = userPwd;
    }

    @Override
    public String toString() {
     
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userPwd='" + userPwd + '\'' +
                '}';
    }
}

account类

package edu.yjsj.domain;

import java.io.Serializable;

public class Account implements Serializable {
     
    private Integer aid;
    private Integer id;
    private Double money;
    private User user;

    public User getUser() {
     
        return user;
    }

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

    public Integer getAid() {
     
        return aid;
    }

    public void setAid(Integer aid) {
     
        this.aid = aid;
    }

    public Integer getId() {
     
        return id;
    }

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

    public Double getMoney() {
     
        return money;
    }

    public void setMoney(Double money) {
     
        this.money = money;
    }

    @Override
    public String toString() {
     
        return "Account{" +
                "aid=" + aid +
                ", id=" + id +
                ", money=" + money +
                ", user=" + user.toString() +
                '}';
    }
}

toString方法中加上usertoString方法可以同时输出联合查询的两张表的数据
2.xml配置文件



<mapper namespace="edu.yjsj.dao.AccountDao">
    <resultMap id="accountUserMap" type="account">
        <id property="aid" column="aid"/>
        <result property="id" column="id"/>
        <result property="money" column="money"/>
        <association property="user" column="id" javaType="user">
            <id property="id" column="id"/>
            <result property="userName" column="userName"/>
            <result property="userPwd" column="userPwd"/>
        association>
    resultMap>
    
    <select id="selectAllInfo" resultMap="accountUserMap">
        select u.*,a.aid,a.id,a.money from account a,user u where u.id = a.id
    select>
mapper>

该方法的主要就是xml文件的resultmap标签其中的关联标签是association,column是两表的关联属性,Javatype是关联的javaBean类

<association property="user" column="id" javaType="user">
            <id property="id" column="id"/>
            <result property="userName" column="userName"/>
            <result property="userPwd" column="userPwd"/>
        association>

3.测试文件

package edu.yjsj.test;

import edu.yjsj.dao.AccountDao;
import edu.yjsj.dao.UserDaoImpl;
import edu.yjsj.domain.Account;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class TestAccount {
     
    private InputStream in = null;
    private SqlSessionFactory factory = null;
    private SqlSession session =null;
    private AccountDao accountDao = null;
    @Before
    public void init()throws Exception{
     
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂产生SqlSession对象
        session = factory.openSession();
        //4.使用SqlSessiond对象创建Dao接口的代理对象
        accountDao = session.getMapper(AccountDao.class);
    }
    @After
    public void destory() throws Exception{
     
        session.commit();
        //释放资源
        session.close();
        in.close();
    }
    @Test
    public void testSelectAll(){
     
        List<Account> accountList = accountDao.selectAllInfo();
        for (Account account: accountList) {
     
            System.out.println("------------每一个账户信息-------------");
            System.out.println(account);
          // System.out.println("------------账户户主信息-------------");
           // System.out.println(account.getUser());
        }
    }
}

4.测试结果
在这里插入图片描述

你可能感兴趣的:(Mybatis)