MyBatis多表操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MyBatis多表操作

在这里插入图片描述

🍁博客主页:👉 不会压弯的小飞侠
✨欢迎关注:👉点赞👍收藏⭐留言✒
✨系列专栏:👉 MyBatis详解
✨如果觉得博主的文章还不错的话,请三连支持一下博主。
🔥欢迎大佬指正,一起 学习!一起加油!

在这里插入图片描述

@TOC


一、一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。
一对一查询的需求:查询一个订单,同时查询出该订单所属的用户。
users表
在这里插入图片描述
orders表
在这里插入图片描述
设置外键:
在这里插入图片描述

二、一对一配置实现

 1.使用<resultMap>或<resultMap>+<association>做配置
  <resultMap id="orderMap" type="order">
       <!--手动指定字段与实体属性的映射关系
       column:数据表的字段名称
       property:实体的属性名称-->
       <id column="oid" property="id"></id>
       <result column="ordertime" property="ordertime"></result>
       <result column="total" property="total"></result>
       <!--方式一-->
      <!-- <result column="uid" property="user.id"></result>
       <result column="username" property="user.username"></result>
       <result column="password" property="user.password"></result>
       <result column="birthday" property="user.birthday"></result>-->
       <!--方式二-->
      <!-- property:当前实体类(order)中的属性名称(private User user)
       javaType:当前实体类(order)中的属性类型(User)-->
       <association property="user" javaType="user">
           <id column="uid" property="id"></id>
           <result column="username" property="username"></result>
           <result column="password" property="password"></result>
           <result column="birthday" property="birthday"></result>
       </association>
   </resultMap>
    <select id="findAll" resultMap="orderMap">
        select *,o.id oid from orders o,users u where o.uid=u.id
    </select>

三、一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。
一对多查询的需求:查询一个订单,同时查询出该订单所属的用户。

四、一对多配置实现

1.使用<resultMap>+<collection>做配置
<resultMap id="userMap" type="User">
        <id column="uid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"/>
        <!--配置集合信息-->
        <!--property:集合名称
        ofType:当前集合中的数据类型-->
        <collection property="orderList" ofType="order">
            <id column="oid" property="id"></id>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"></result>
        </collection>
    </resultMap>

    <select id="findAlls" resultMap="userMap">
     select *,o.id oid from users u,orders o where u.id=o.uid

    </select>

五、多对多查询的模型

用户表和订单表的关系为,一个用户有多个角色,一个角色被多个用户使用。
多对多查询的需求:查询用户的同时查询出该用户所属的全部角色。
roles表
在这里插入图片描述
users_roles表
在这里插入图片描述
设置外键
在这里插入图片描述

六、多对多配置实现

1.使用<resultMap>+<collection>做配置
    <resultMap id="userAndRole" type="User">
        <id column="usersid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
        <!--配置集合信息-->
        <!--property:集合名称
        ofType:当前集合中的数据类型-->
        <collection property="roleList" ofType="role">
            <id column="rolesid" property="id"></id>
            <result column="roleName" property="roleName"></result>
            <result column="roleDesc" property="roleDesc"></result>
        </collection>
    </resultMap>
    <select id="findUserAndRoleAll" resultMap="userAndRole">
        select * from users u,users_roles ur,roles r where u.id=ur.usersid and r.id=ur.rolesid
    </select>

七、详细代码

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>MyBatis-multi</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>



</project>

2.jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisthree
jdbc.username=root
jdbc.password=root

3.mybatis-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 core file-->
       <configuration>
    <!--通过properties标签添加properties文件-->
    <properties resource="jdbc.properties"></properties>
    <!--自定义别名-->
    <typeAliases>
        <typeAlias type="com.demo.domain.User" alias="user"></typeAlias>
        <typeAlias type="com.demo.domain.Order" alias="order"></typeAlias>
        <typeAlias type="com.demo.domain.Role" alias="role"></typeAlias>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载sql映射文件-->
    <mappers>
        <mapper resource="com/demo/dao/UserMapper.xml"/>
        <mapper resource="com/demo/dao/OrderMapper.xml"/>
    </mappers>
</configuration>

4.User

package com.demo.domain;

import java.util.Date;
import java.util.List;

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    //描述当前用户存在那些订单
    private List<Order> orderList;
    //描述当前用户具有哪些角色
    private List<Role> roleList;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

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

    public List<Order> getOrderList() {
        return orderList;
    }

    public void setOrderList(List<Order> orderList) {
        this.orderList = orderList;
    }

    public List<Role> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
        this.roleList = roleList;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                ", orderList=" + orderList +
                ", roleList=" + roleList +
                '}';
    }
}

5.Order

package com.demo.domain;

import java.util.Date;

public class Order {
    private int id;
    private Date ordertime;
    private double total;
    //当前订单属于哪个用户
    private User user;

    public int getId() {
        return id;
    }

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

    public Date getOrdertime() {
        return ordertime;
    }

    public void setOrdertime(Date ordertime) {
        this.ordertime = ordertime;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public User getUser() {
        return user;
    }

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

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", ordertime=" + ordertime +
                ", total=" + total +
                ", user=" + user +
                '}';
    }
}

6.Role

package com.demo.domain;

public class Role {
    private int id;
    private String roleName;
    private String roleDesc;

    public int getId() {
        return id;
    }

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

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleDesc() {
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                '}';
    }
}

7.UserMapper

package com.demo.dao;

import com.demo.domain.Order;
import com.demo.domain.User;

import java.util.List;

public interface UserMapper {
    public List<User> findAlls();
    public List<User> findUserAndRoleAll();

}

8.UserMapper.xml

<?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">
<mapper namespace="com.demo.dao.UserMapper">

    <resultMap id="userMap" type="User">
        <id column="uid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"/>
        <!--配置集合信息-->
        <!--property:集合名称
        ofType:当前集合中的数据类型-->
        <collection property="orderList" ofType="order">
            <id column="oid" property="id"></id>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"></result>
        </collection>
    </resultMap>

    <select id="findAlls" resultMap="userMap">
     select *,o.id oid from users u,orders o where u.id=o.uid

    </select>
    <resultMap id="userAndRole" type="User">
        <id column="usersid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
        <!--配置集合信息-->
        <!--property:集合名称
        ofType:当前集合中的数据类型-->
        <collection property="roleList" ofType="role">
            <id column="rolesid" property="id"></id>
            <result column="roleName" property="roleName"></result>
            <result column="roleDesc" property="roleDesc"></result>
        </collection>
    </resultMap>
    <select id="findUserAndRoleAll" resultMap="userAndRole">
        select * from users u,users_roles ur,roles r where u.id=ur.usersid and r.id=ur.rolesid
    </select>

</mapper>

9OrderMapper

package com.demo.dao;
import com.demo.domain.Order;

import java.util.List;

public interface OrderMapper {
    //查询全部的方法
    public List<Order> findAll();
}

10.OrderMapper.xml

<?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">
<mapper namespace="com.demo.dao.OrderMapper">


   <resultMap id="orderMap" type="order">
       <!--手动指定字段与实体属性的映射关系
       column:数据表的字段名称
       property:实体的属性名称-->
       <id column="oid" property="id"></id>
       <result column="ordertime" property="ordertime"></result>
       <result column="total" property="total"></result>
      <!-- <result column="uid" property="user.id"></result>
       <result column="username" property="user.username"></result>
       <result column="password" property="user.password"></result>
       <result column="birthday" property="user.birthday"></result>-->
      <!-- property:当前实体类(order)中的属性名称(private User user)
       javaType:当前实体类(order)中的属性类型(User)-->
       <association property="user" javaType="user">
           <id column="uid" property="id"></id>
           <result column="username" property="username"></result>
           <result column="password" property="password"></result>
           <result column="birthday" property="birthday"></result>
       </association>
   </resultMap>
    <select id="findAll" resultMap="orderMap">
        select *,o.id oid from orders o,users u where o.uid=u.id
    </select>
</mapper>

11.MyBatisTest

package com.demo.test;

import com.demo.dao.OrderMapper;
import com.demo.dao.UserMapper;
import com.demo.domain.Order;
import com.demo.domain.User;
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.Test;

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

public class MyBatisTest {
//一对一查询
    @Test
    public void test() throws IOException {
        //1.加载MyBatis的核心配置文件获取sqlSessionFactory
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取sqlSession,执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        //3.执行sql
        List<Order> list = mapper.findAll();
        for (Order order : list) {
            System.out.println(order);
        }
        sqlSession.close();
    }
    //一对多查询
    @Test
    public void test1() throws IOException {
        //1.加载MyBatis的核心配置文件获取sqlSessionFactory
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取sqlSession,执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //3.执行sql
        List<User> userList = mapper.findAlls();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
  //多对多查询
    @Test
    public void test2() throws IOException {
        //1.加载MyBatis的核心配置文件获取sqlSessionFactory
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取sqlSession,执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //3.执行sql
        List<User> userAndRoleAll = mapper.findUserAndRoleAll();
        for (User user : userAndRoleAll) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
XML Java 数据库连接
【MyBatis】MyBatis操作数据库(一)
【MyBatis】MyBatis操作数据库(一)
58 1
|
6月前
|
XML Java 数据库连接
如何使用 MyBatis 来进行增、删、改、查操作
如何使用 MyBatis 来进行增、删、改、查操作
277 2
|
6月前
|
SQL 存储 Java
基于MyBatis的增删改查操作
基于MyBatis的增删改查操作
46 1
|
6月前
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
133 3
我们后端程序员不是操作MyBatis的CRUD Boy
|
5月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
5月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
6月前
|
Java 数据库连接 数据库
Spring日志完结篇,MyBatis操作数据库(入门)
Spring日志完结篇,MyBatis操作数据库(入门)
|
7月前
|
XML Java 数据库连接
利用MyBatis框架操作数据库2
利用MyBatis框架操作数据库
49 2
|
7月前
|
Java 数据库连接 测试技术
利用MyBatis框架操作数据库1
利用MyBatis框架操作数据库
54 1
|
6月前
|
SQL Java 数据库连接
【MyBatis】深入解析MyBatis:高效操作数据库技术详解
【MyBatis】深入解析MyBatis:高效操作数据库技术详解
47 0
下一篇
DataWorks