mybatis学习(多表查询)

一对多查询

一个账户只能被一个用户所有,
一个用户有多个账户,

1.数据库表

//用户表
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


//账户表

CREATE TABLE `account` (
  `AID` int(11) NOT NULL COMMENT '账户编号',
  `UID` int(11) default NULL COMMENT '用户编号',
  `MONEY` double default NULL COMMENT '金额',
  PRIMARY KEY  (`ID`),
  KEY `FK_Reference_8` (`UID`),
  //外键是用户表的id
  CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

实体类

//用户类
public class User implements Serializable {
    private  Integer id;
    private  String username;
    private Date birthday;
    private  String sex;
    private  String address;
    
    //将Account封装到一个集合中
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    public User() {
        super();
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer 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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}


//账户类
public class Account implements Serializable {
    private Integer aid;
    private  Integer uid;
    private double  money;
    private  User user;
    public Integer getAid() {
        return aid;
    }
    public void setAid(Integer aid) {
        this.aid = aid;
    }
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Account{" +
                "aid=" + aid +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

持久层dao

//用户持久层
public interface UserMapper {
    //查所有
    List<User> findAll();
    
}
//账户持久层
public interface AccountMapper {
    List<Account> findAll();

}

映射配置

//account映射配置
<!--定义Account的ResultMap-->
    <resultMap id="accountUserMap" type="zlb.domain.Account">
       <id property="aid" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一的关系映射,配置封装user的内容-->
        <association property="user" foreignColumn="uid" javaType="user">
           <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="address" column="address"></result>
            <result property="birthday" column="birthday"></result>
            <result property="sex" column="sex"></result>
        </association>
    </resultMap>
     <!--一对一查询-->
    <!--查询所有-->
    <select id="findAll" resultMap="accountUserMap">
        select  a.* ,u.* from account a,user u where a.UID=u.id
    </select>

测试类

public class AccountTest {
    static InputStream resourceAsStream;
    static {
        try {
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
    //sqlSessionFactory.openSession(true)
    //参数为true,自动提交事务
    static SqlSession sqlSession = sqlSessionFactory.openSession(true);
    AccountMapper mapper= sqlSession.getMapper(AccountMapper.class);
    @Test
    public  void test01() {
        List<Account> accounts = mapper.findAll();
        for (Account account : accounts) {
            System.out.println("账户 "+account);
            System.out.println("账户对应的用户 "+account.getUser());
        }
        sqlSession.close();
    }
}

在这里插入图片描述

user映射配置

<resultMap id="userMap" type="user">
        <!--定义User的ResultMap-->
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
          <!--配置User中的accounts集合的映射-->
        <collection property="accounts" ofType="account">
            <id property="aid" column="aid"></id>
            <result property="uid" column="uid"></result>
            <result property="money" column="money"></result>
        </collection>
    </resultMap>
    <!--一对多查询-->
    <!--查询所有-->
    <select id="findAll" resultMap="userMap">
        select * from user u left outer join account a on u.id = a.UID
    </select>

测试类:

 @Test
    public  void test01() {
        List<User> users = mapper.findAll();
        for (User user : users) {
            System.out.println("用户 "+user);
            System.out.println("用户所有的账户 "+user.getAccounts());
            System.out.println("============");
        }
        sqlSession.close();
    }

在这里插入图片描述

多对多查询
一个用户有多个角色;
多个角色被赋给多个用户;

数据库表

//角色表

CREATE TABLE `role` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `NAME` varchar(30) default NULL COMMENT '角色名称',
  `DESC` varchar(60) default NULL COMMENT '角色描述',
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

//用户与角色的中间表

CREATE TABLE `user_role` (
  `UID` int(11) NOT NULL COMMENT '用户编号',
  `RID` int(11) NOT NULL COMMENT '角色编号',
  PRIMARY KEY  (`UID`,`RID`),
  KEY `FK_Reference_10` (`RID`),
  CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
  CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

实体类

//角色实体类
public class Role implements Serializable {
    private Integer roleId;
    private  String name;
    private  String desc;
    //封装user
    private List<User> users;
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    public Integer getRid() {
        return  roleId;
    }
    public void setRid(Integer rid) {
        this. roleId =  roleId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Role{" +
                " roleId=" + roleId+
                ", name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

//用户类
public class User implements Serializable {
    private  Integer id;
    private  String username;
    private Date birthday;
    private  String sex;
    private  String address;
    //封装角色role
    private  List<Role> roles;
    
    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public Integer 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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

持久层dao

//用户持久层

public interface UserMapper {
    //查所有用户
    List<User> findAll();
    
}

//角色持久层
public interface RoleMapper {
    //查询所有角色
    List<Role> findAll();
}

配置

//mybat-config.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--给实体类配置别名-->
    <typeAliases >
    <typeAlias type="zlb.domain.User" alias="user"></typeAlias>
    <typeAlias type="zlb.domain.Role" alias="role"></typeAlias>
</typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--mysql8以上版本url:需添加如下代码-->
                <!--?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC-->
                <property name="url"    value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC"/>
                <property name="username"   value="root"/>
                <property name="password" value="151630"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="zlb/dao/UserMapper.xml"></mapper>
        <mapper resource="zlb/dao/RoleMapper.xml"></mapper>
    </mappers>
</configuration>

映射配置

//RoleMapper.xml

<mapper namespace="zlb.dao.RoleMapper">
    <resultMap id="roleMap" type="role">
        <id property="roleId" column="rid"></id>
        <result property="name" column="name"></result>
        <result property="desc" column="desc"></result>

        <collection property="users" ofType="user">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="address" column="address"></result>
            <result property="birthday" column="birthday"></result>
            <result property="sex" column="sex"></result>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="roleMap">
        /*先左外查询角色信息
          再左外查出角色对应的用户的信息
        */
        select u.*,r.id as rid,r.name,r.desc from  role r
            left outer join user_role ur on r.id= ur.RID
            left outer join user u on  u.id=ur.UID
    </select>
</mapper>

测试

public class RoleTest {
    static InputStream resourceAsStream;
    static {
        try {
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
    //sqlSessionFactory.openSession(true)
    //参数为true,自动提交事务
    static SqlSession sqlSession = sqlSessionFactory.openSession(true);
    RoleMapper mapper= sqlSession.getMapper(RoleMapper.class);
    @Test
    public  void test01() {
        List<Role> roles = mapper.findAll();
        for (Role role : roles) {
           System.out.println("每个角色的信息");
            System.out.println(role);
            System.out.println("角色对应的用户信息");
            System.out.println(role.getUsers());
            System.out.println("============");
        }
        sqlSession.close();
    }
}

在这里插入图片描述

  //UserMapper.xml
       
<mapper namespace="zlb.dao.UserMapper">
   <resultMap id="userMap" type="user">
      <id property="id" column="id"></id>
      <result property="username" column="username"></result>
      <result property="address" column="address"></result>
      <result property="birthday" column="birthday"></result>
      <result property="sex" column="sex"></result>
      <collection property="roles" ofType="role">
         <id property="roleId" column="rid"></id>
         <result property="name" column="name"></result>
         <result property="desc" column="desc"></result>
      </collection>
    </resultMap>
   <select id="findAll" resultMap="userMap">
    select u.*,r.id as rid,r.NAME,r.DESC  from user u
        left outer join user_role ur on u.id = ur.UID
        left outer join role r on ur.RID = r.ID
   </select>

测试

public class UserTest {
    static InputStream resourceAsStream;
    static {
        try {
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
    //sqlSessionFactory.openSession(true)
    //参数为true,自动提交事务
    static SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserMapper mapper= sqlSession.getMapper(UserMapper.class);
    @Test
    public  void test01() {
        List<User> users = mapper.findAll();
        for (User user : users) {
            System.out.println("每个用户的信息");
            System.out.println(user);
            System.out.println("每个用户对应的角色信息");
            System.out.println(user.getRoles());
            System.out.println("=========");
        }
        sqlSession.close();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值