文章目录

  • 一、一对一查询
    • 1.1 模型
    • 1.2 SQL语句
    • 1.3 创建Order和User实体类
    • 1.4 创建OrderMapper接口
    • 1.5 配置OrderMapper.xml
    • 1.6 测试
  • 二、一对多查询
    • 2.1 模型
    • 2.2 SQL语句
    • 2.3 修改User和Order实体类
    • 2.4 创建UserMapper接口
    • 2.5 创建UserMapper.xml
    • 2.6 测试
  • 三、多对多查询
    • 3.2 SQL语句
    • 3.3 修改User类,创建Role类
    • 3.4 UserMapper接口添加方法
    • 3.5 配置UserMapper.xml
    • 3.6 测试
  • 四、小结

一、一对一查询

1.1 模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

1.2 SQL语句

对应的sql语句:select * from orders o,user u where o.uid=u.id

查询结果如下:

1.3 创建Order和User实体类

Order.java

public class Order {    private int id;    private Date ordertime;    private double total;    //代表当前订单从属于哪一个客户    private User user;// 省略get set方法
}

User.java

public class User {private int id;    private String username;    private String password;    private Date birthday;// 省略get set方法
}

1.4 创建OrderMapper接口

public interface OrderMapper {    List<Order> findAll();
}

1.5 配置OrderMapper.xml

通过sql查询并封装数据,此处返回类型使用的resultMap,在这里完成数据的封装。

<mapper namespace="com.happy.mapper.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></resultMap>   <select id="findAll" resultMap="orderMap">        select * from orders o,user u where o.uid=u.id    </select>
</mapper>

当然,除了改方式外,还可通过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><!--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>

1.6 测试

执行测试代码,如下:

@Test
public void test1() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = mapper.findAll();for (Order order : orderList) {System.out.println(order);}sqlSession.close();
}

输出结果为:

二、一对多查询

2.1 模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

2.2 SQL语句

对应的sql语句:select *,o.id oid from user u left join orders o on u.id=o.uid;

查询的结果如下:

2.3 修改User和Order实体类

Order.java

public class Order {    private int id;    private Date ordertime;    private double total;    //代表当前订单从属于哪一个客户    private User user;// 省略get set方法
}

User.java

public class User {        private int id;    private String username;    private String password;    private Date birthday;//代表当前用户具备哪些订单    private List<Order> orderList;// 省略get set方法
}

2.4 创建UserMapper接口

public interface UserMapper {    List<User> findAll();
}

2.5 创建UserMapper.xml

<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"></result><!--配置集合信息property:集合名称ofType:当前集合中的数据类型--><collection property="orderList" ofType="order"><!--封装order的数据--><id column="oid" property="id"></id><result column="ordertime" property="ordertime"></result><result column="total" property="total"></result></collection>
</resultMap><select id="findAll" resultMap="userMap">SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid
</select>

2.6 测试

执行如下测试代码:

@Test
public void test2() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> all = mapper.findAll();for(User user : all){    System.out.println(user.getUsername());    List<Order> orderList = user.getOrderList();    for(Order order : orderList){        System.out.println(order);    }    System.out.println("----------------------------------");}sqlSession.close();
}

输出结果为:

三、多对多查询

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

3.2 SQL语句

对应的sql语句:select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_id inner join role r on ur.role_id=r.id;

查询的结果如下:

3.3 修改User类,创建Role类

public class Role {    private int id;    private String rolename;// 省略get set方法
}
public class User {    private int id;    private String username;    private String password;    private Date birthday;//代表当前用户具备哪些订单    private List<Order> orderList;//代表当前用户具备哪些角色    private List<Role> roleList;// 省略get set方法
}

3.4 UserMapper接口添加方法

添加查询方法,如下:

List<User> findAllUserAndRole();

3.5 配置UserMapper.xml

<resultMap id="userRoleMap" type="user"><!--user的信息--><id column="userId" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><!--user内部的roleList信息--><collection property="roleList" ofType="role"><id column="roleId" property="id"></id><result column="roleName" property="roleName"></result><result column="roleDesc" property="roleDesc"></result></collection></resultMap><select id="findUserAndRoleAll" resultMap="userRoleMap">SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id</select>

3.6 测试

执行如下测试代码:

@Test
public void test3() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> all = mapper.findAllUserAndRole();for(User user : all){    System.out.println(user.getUsername());    List<Role> roleList = user.getRoleList();    for(Role role : roleList){        System.out.println(role);    }    System.out.println("----------------------------------");}sqlSession.close();
}

输出结果为:

四、小结

Mybatis多表配置方式:

  • 一对一,使用<resultMap>做配置
  • 一对多,使用<resultMap><collection>做配置
  • 多对多,使用<resultMap><collection>做配置

Mybatis实现多表查询(一对一、一对多、多对多)相关推荐

  1. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  2. Mybatis中的关系映射(一对一,一对多,多对多)

    在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...

  3. mybatis 多表查询 一对一 一对多查询

    本文举例: 1.订单信息表 2.订单详情表 3.发票表 三表关系: 订单信息表 订单信息详情表 1:n 订单信息表 发票表 1:1 需求: 查询订单表订单详情表和发票表所有信息: <!-- 订单 ...

  4. 【Mybatis】多表查询(一对多、多对一)

    先说明一下本文的例子:学生-老师. 一对多:查询某位老师的所有学生. 多对一:查询所有学生以及他们的老师. 1. resultMap resultMap 元素是 MyBatis 中最重要最强大的元素. ...

  5. 【MyBatis】多表查询

    MyBatis的多表查询 表之间的关系:一对多,多对一,一对一,多对多. 一对多:一个班级对应多个学生 多对一:多个学生对应一个班级 一对一:一个人对应一个身份证号码 多对多:一个订单可以有多个商品, ...

  6. Mybatis连3表查询数据resultMap结果映射

    Mybatis连结3表查询数据resultMap结果映射 一.前言 Mybatis实现了sql与java代码的分离,达到了解耦合的目的,配置sql语句时有个resultType="" ...

  7. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  8. Mybatis实现关联表查询

    Mybatis实现关联表查询 6.1. 一对一关联 1). 提出需求 根据班级 id 查询班级信息(带老师的信息) 2). 创建表和数据 [](javascript:void(0)

  9. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

最新文章

  1. linux 以太网转wifi,LINUX-网络 - (以太网和WIFI无线)
  2. python cookbook 中文第四版_Python Cookbook (4)
  3. Unity——用UnityEditor拷贝FBX中的AnimationClip
  4. 华为服务器型号命名,服务器的命名规则
  5. RS-232、RS-422与RS-485标准
  6. 敏捷测试与普通测试的区别
  7. 遥感数据集_最新高光谱遥感数据集
  8. 这周学点变速不变调、变调不变速
  9. 6、Spring事务配置上篇
  10. 无法连接虚拟设备 ide1:0,因为主机上没有相应的设备。 您要在每次开启此虚拟机时都尝试连接此虚拟设备吗?
  11. 定义方法,实现两个整数的加法
  12. 元宇宙研讨会-空间设计与交互技术构造的叙事世界
  13. 静态路由Route不生效的解决方法
  14. ThinkPad E40 XP 安装SATA/AHCI驱动
  15. 判断三极管是否是NPN与PNP,并判断EBC
  16. python爬虫模块排名_Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析
  17. Java自学,Java面试,Java培训
  18. MongoDb企业应用实战(一) 写在MongoDB应用介绍之前(ii)
  19. EMC-浪涌防护及退耦设计
  20. 我爱大自然教案计算机,我爱大自然大班教案

热门文章

  1. 用Java写微信支付Jsp进行下单操作
  2. 距A轮融资不到七个月,Incode再获2.2亿美元B轮融资,跃升为独角兽企业
  3. C# Winform 中如何获取本机安装输入法,并设置为默认输出语言,如何打开搜狗输入法和手写板...
  4. 使用 GROW 模型
  5. 苹果自带跳语音服务器,iOS自带文本转语音技术(TTS)的实现即语音播报的实践
  6. iec104协议 java_GitHub - delikely/IEC104_microgrid: iec104协议主站客户端程序,属于微电网管理系统一部分...
  7. Windows NT 6 终极瘦身
  8. OA系统工作台集成云星空轻分析功能
  9. 关于Python装饰器的一些理解
  10. 开源智能相机- Xilinx Zynq-7000高清图像处理模块