因为mybatis使用的基本是原生sql语句
所以首先从数据库开始说
以mysql数据库为例,对表的连接查询分为四种
内连接,外连接,交叉连接,和联合连接

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行
sql语句举例:联接查询user,order表中user的id相同的数据,前五列为user表的内容,后面的是order表。

SELECT * FROM  `user` INNER JOIN `order` ON user.id=order.userID;

内连接也被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息

外连接又分为左外连接,右外连接和全外连接

左外连接:以左表为基表(驱动表),将左表的每一条数据都与右表匹配,如果在右表中没有匹配数据,则右表补null
举例说明一下
我们把用户表当做左表,订单表为右表

SELECT * FROM  `user` LEFT JOIN `order` ON user.id=order.userID;

看一下查询结果,发现id为2的没有订单表的信息,全部用null填充了。

左外连接就是对左边的表不加限制,左边表的信息不会丢失

右外连接和左外连接相反,保留右表的所有信息。

SELECT * FROM  `user` RIGHT JOIN `order` ON user.id=order.userID;

全外连接就是左右信息都保留,匹配不到的用null填充。

第三种是交叉连接
它返回结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数,也叫笛卡尔积,不带where字句。

SELECT * FROM  `user`  CROSS JOIN `order`;

第四种是联合联接
这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能,这里不做展示了。

接下来说一下连表容易踩到的坑
首先是外键冲突
如果A表关联了B表,比如说我用户关联了订单表
那么在插入订单时,应该先去判断是否有这个用户
删除用户时,应该先去把他关联的订单删除,
否则就会有外键冲突。

再就是表的名字,在mysql中,如果使用了关键字作为表的名字会报语句错误,应该给表名加上``这个符号,这是横排数字按键数字1旁边的那个键在英文输入下输出的。

下面放一下在mybatis下连表查询的代码步骤。

第一步正常建表就不说了,如果忘记设置外键,说一下增加外键的语句

ALTER TABLE `order` ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES `user`(id)

然后是建相应的实体类,和Mapper.xml
User.java

package com.jerry.springbootdemo.entity;import lombok.Data;import java.util.List;
@Data
public class User {private Integer id;private String username;private String passsword;private String gender;private String hobby;private List<Order> orderList;}

Order.java

package com.jerry.springbootdemo.entity;import lombok.Data;import java.math.BigDecimal;
import java.util.Date;
@Data
public class Order {private Integer orderid;private String orderno;private Integer userid;private Byte orderstatus;private BigDecimal goodsmoney;private Byte ispay;private Byte payfrom;private String username;private String gamename;private Date createtime;private String areaidpath;private String userphone;private String orderremarks;private BigDecimal realtotalmoney;private Integer orderscore;private Byte isappraise;private Byte isclosed;
}

主要看一下UserMapper.xml,因为是一对多的关系,所以下面这个查询语句是主要学习的,这个查询就是查询用户的信息和他名下的订单详情,包括结果类型,和参数类型,数据类型的设置都要注意。

<select id="getUserDetails" parameterType="Integer" resultMap="UserResultMap">select * from `user` u ,`order` o where u.id=o.userID and u.id=#{id}</select><resultMap type="com.jerry.springbootdemo.entity.User" id="UserResultMap"><id column="id" property="id" jdbcType="INTEGER" /><result column="username" property="username" jdbcType="VARCHAR" /><result column="passsword" property="passsword" jdbcType="VARCHAR" /><result column="gender" property="gender" jdbcType="CHAR" /><result column="hobby" property="hobby" jdbcType="VARCHAR" /><!-- ofType指定order集合中的对象类型 --><collection property="orderList" ofType="com.jerry.springbootdemo.entity.Order"><id column="orderID" property="orderid" jdbcType="INTEGER" /><result column="orderNo" property="orderno" jdbcType="VARCHAR" /><result column="userID" property="userid" jdbcType="INTEGER" /><result column="orderStatus" property="orderstatus" jdbcType="TINYINT" /><result column="goodsMoney" property="goodsmoney" jdbcType="DECIMAL" /><result column="isPay" property="ispay" jdbcType="TINYINT" /><result column="payFrom" property="payfrom" jdbcType="TINYINT" /><result column="userName" property="username" jdbcType="VARCHAR" /><result column="gameName" property="gamename" jdbcType="VARCHAR" /><result column="createTime" property="createtime" jdbcType="TIMESTAMP" /><result column="areaIdPath" property="areaidpath" jdbcType="VARCHAR" /><result column="UserPhone" property="userphone" jdbcType="CHAR" /><result column="orderRemarks" property="orderremarks" jdbcType="VARCHAR" /><result column="realTotalMoney" property="realtotalmoney" jdbcType="DECIMAL" /><result column="orderScore" property="orderscore" jdbcType="INTEGER" /><result column="isAppraise" property="isappraise" jdbcType="TINYINT" /><result column="isClosed" property="isclosed" jdbcType="TINYINT" /></collection></resultMap>

UserController.java

一个是返回json,一个是返回view。

@GetMapping(value="/userdetails")public ModelAndView userDetalis(){ModelAndView mv=new ModelAndView();mv.addObject("details",userMapper.getUserDetails(1));mv.setViewName("UserDetails");return  mv;}@GetMapping(value = "/userjson/{id}")public @ResponseBody User userJson(@PathVariable() Integer id){User user1=userMapper.getUserDetails(id);return user1;}

swagger测试成功

Springboot中使用Mybatis框架对数据库进行联表查询,踩坑填坑相关推荐

  1. Mybatis(第二篇:联表查询)

    Mybatis(第二篇:联表查询) 目录 Mybatis(第二篇:联表查询) 一.前期 项目的搭建 1.数据库 2.IDEA项目架构搭建 2.1 pom.xml 2.2 domain包 2.2.1 D ...

  2. mysql数据库之联表查询

    表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...

  3. oracle数据库同时实现联表查询和分页查询(未明确定义列)

    ps:只是记录新手小白的脱坑之路,大佬勿喷 今天在做前端数据查询的时候,在实现联表查询的同时进行分页查询遇到了令人头秃的问题,分页查询的sql语句是这样的 select * from (select ...

  4. mysql 连表查询_mysql数据库之联表查询

    表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...

  5. springboot中的mybatis是如果使用pagehelper的

    springboot中的mybatis是如果使用pagehelper的 springboot中使用其他组件都是基于自动配置的AutoConfiguration配置累的,pagehelper插件也是一样 ...

  6. SpringBoot中关于Mybatis使用的三个问题

    SpringBoot中关于Mybatis使用的三个问题 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8495453.html 原本是要讲讲PostgreSQL ...

  7. SpringBoot 中连接阿里云rds数据库

    今天首次碰到在SpringBoot中使用阿里云rds数据库,搜索一了一番资料,最后成功实现.然后在这里做下自我总结.(个人用到是SSH方式进行连接) 1.在pom文件中添加jar包依赖 <dep ...

  8. springboot中整合mybatis及简单使用

    springboot中整合mybatis及简单使用 1.引入依赖 2.在applicaiton.yaml中配置数据源以及mybatis 3.创建sql测试表 4.编写mapper接口和mapper.x ...

  9. SpringBoot中使用mybatis/ibatis日志打印sql

    SpringBoot中使用mybatis/ibatis时日志打印sql 控制台打印mybatis/ibatis对应的sql 主机的日志文件中打印mybatis/ibatis对应的sql 控制台打印my ...

最新文章

  1. 实战:手把手教你实现用语音智能控制电脑 | 附完整代码
  2. android怎么判断程序进入了后台,Android检测应用程序是否进入后台
  3. python语言用途-python编程语言有什么用途
  4. django 不用自带的mysql_python笔记二 django自带后台管理系统、模版渲染以及使用mysql数据库...
  5. 移植Python2到TQ2440
  6. python 3.9特性,Python 3.9 正式版要来了,会有哪些新特性?
  7. REDHAT6.3 udev 配置 存储器磁盘
  8. 我要带徒弟学写JAVA架构,引路架构师之路
  9. (97)序列检测器状态转移图,面试必问(二十一)(第20天)
  10. SAP License:SAP的联产品和副产品
  11. 让Windows CE 6.0 R2支持.NET CF 3.5
  12. pip install requests_爬虫_Day 6 学习requests库这一篇文章足够
  13. 做某一项目常见知识点链接
  14. 浪潮财务软件遇到问题
  15. 微信小程序 访问locolhost_微信小程序 数据访问实例详解
  16. Objective C 获取当前日期时间方法
  17. bom 根据一阶 BOM 表整理多阶层 BOM 表
  18. ApacheCN 活动汇总 2019.6.28
  19. R语言机器学习xgboost实例,油管上的关于xgboost的例子
  20. 数学分析 极限(第2,3章)

热门文章

  1. AMD盒装处理器真假辨认细节
  2. 有关ISE14.7中IMPACT报错Can not find cable, check cable setup 解决方法之一
  3. LeetCode_962_Maximum Width Ramp
  4. iphone时间的操作,两个日期之间的天数。
  5. 【转】全国甲级测绘资质的测绘单位
  6. 车用计算机,汽车估价计算器使用
  7. DL动态加载框架技术文档
  8. 使用百度C#图像识别SDK进行图像识别
  9. 医学图像处理(AI) 期刊和会议
  10. 组策略部署软件之一:软件分发概论与部署MSI程序包