之前学习mybatis的时候,有各种one2many,many2many的连表查询业务。最近公司项目采用的是mybatis plus持久层框架,其实大差不差。在网上百度的有关子查询的xml文件sql语句也有,感觉看起来吃力,只是贴个代码。
由于我这边结合业务走通了,故做个详细的操作过程。

涉及到两张表的业务对象,monitor_data和place_list,这两张表的关系是通过equip_id联系的,业务需求是:通过传参数gis_code的值先查询place_list表的equip_id,再以查询结果的equip_id值作为参数查询monitor_data得所有相关记录。
首先贴出来两张表及Entity
在这里插入图片描述

@Data
@TableName("place_list")
public class PlaceList {
	//用集合封装monitor_data表中的数据
	private Set<MonitorData> monitorData;  
	private java.lang.String id;
	private java.lang.String equipId;
	private java.lang.String equipType;
	private java.lang.String placeId;
	private java.lang.String placeAddress;
	private java.lang.String placeName;
	private java.lang.String province;
	private java.lang.String city;
	private java.lang.String country;
	private java.math.BigDecimal lng;
	private java.math.BigDecimal lat;
	private java.lang.Integer nextconnInterval;
	private java.math.BigDecimal warnValue;
	private java.math.BigDecimal alramValue;
	private java.math.BigDecimal outValue;
	private java.math.BigDecimal nodeDepth;
	private java.math.BigDecimal nodeBottomElev;
	private java.math.BigDecimal nodePipeDiameter;
	private java.math.BigDecimal installDepth;
	private java.math.BigDecimal installLineLength;
	private java.math.BigDecimal installOffset;
	private java.lang.String createBy;
	private java.util.Date createTime;
	private java.lang.String updateBy;
	private java.util.Date updateTime;
	private java.lang.String corpCode;
	private java.lang.String prjCode;
	private java.lang.String delFlag;
	private java.lang.String monitorPoint;
    private java.lang.String gisCode;
	private java.lang.String status;
@Data
@TableName("monitor_data")
public class MonitorData {
	private java.lang.String id;
	private java.lang.String equipId;
	private java.util.Date monitorTime;
	private java.math.BigDecimal monitorLiquid;
	private java.math.BigDecimal measureFlow;
	private java.math.BigDecimal measureVelo;
	private java.math.BigDecimal measureRain;
	private java.math.BigDecimal measureTurbidity;
	private java.math.BigDecimal measureVoltage;
	private java.lang.Integer measureVoltrate;
	private java.math.BigDecimal measureTemp;
	private java.math.BigDecimal measureHumidity;
	private java.math.BigDecimal measureDo;
	private java.lang.String createBy;
	private java.util.Date createTime;
	private java.lang.String updateBy;
	private java.util.Date updateTime;
	private java.lang.String corpCode;
	private java.lang.String prjCode;
	private java.lang.String delFlag;

由于monitor_data对象的三层在mybatis plus中非常简单,没有代码,就不展示了。
主要展示place_list对象:。
先看一下目录结构图:
在这里插入图片描述

Controller

代码只展示关键部分逻辑,很多平台提供的切面功能就忽略了,大家操作时把握重点
根据传参gisCode调用service层代码

@Slf4j
@RestController
@RequestMapping("/placelist/placeList")
public class PlaceListController {
	@Autowired
	private IPlaceListService placeListService;
	@RequestMapping(value = "/queryByGisCode")
	public Result<PlaceList> queryByGisCode(@RequestParam(name="gisCode",required=true) String gisCode) {
		Result<PlaceList> result = new Result<PlaceList>();
		PlaceList placeList = placeListService.getMonitorDataByGisCode(gisCode);
		if(placeList==null) {
			result.error500("未找到对应实体!");
		}else {
			result.setResult(placeList);
			result.setSuccess(true);
		return result;

Service

IPlaceListService.java
public interface IPlaceListService extends IService<PlaceList> {
    int deleteAll();
    PlaceList getMonitorDataByGisCode(String gisCode);
PlaceListServiceImpl .java
@Service
public class PlaceListServiceImpl extends ServiceImpl<PlaceListMapper, PlaceList> implements IPlaceListService {
    @Resource
    private PlaceListMapper placeListMapper;
    @Override
    public PlaceList getMonitorDataByGisCode(String gisCode) {
        return placeListMapper.selectMonitorDataByGisCode(gisCode);
PlaceListMapper .java
public interface PlaceListMapper extends BaseMapper<PlaceList> {
    PlaceList selectMonitorDataByGisCode(String gisCode);

动态代理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.ecidi.modules.outdata.placelist.mapper.PlaceListMapper">
    <select id="selectByGisCode" resultType="com.ecidi.modules.outdata.monitordata.entity.MonitorData">
      select * from monitor_data where equip_id = #{equip_id}
    </select>
    <resultMap id="placeListMapper" type="com.ecidi.modules.outdata.placelist.entity.PlaceList">
        <id column="id" property="id"/>
        <result column="equip_id" property="equipId"/>
        <result column="gis_code" property="gisCode"/>
        <collection property="monitorData" ofType="com.ecidi.modules.outdata.monitordata.entity.MonitorData"
                    select="selectByGisCode" column="equip_id"/>
    </resultMap>
    <select id="selectMonitorDataByGisCode" resultMap="placeListMapper">
        select equip_id from place_list where gis_code=#{gisCode}
    </select>
</mapper>

最关键的就是这个xml文件,resultMap 配置的是查询返回数据的Map,
指定type是主表place_list表中的字段,collection相当于在placelist的Entity中添加的private Set monitorData; ,取集合之意。
collection中的select是指定查询monitor_data表中的数据的配置项<select id=“selectByGisCode”

在这里插入图片描述
查看控制台日志:

2020-04-21 16:33:01 [http-nio-8080-exec-3] DEBUG   at org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)- ==>  Preparing: SELECT equip_id FROM place_list WHERE place_list.corp_code = 'A01' AND gis_code = ? 
2020-04-21 16:33:01 [http-nio-8080-exec-3] DEBUG   at org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)- ==> Parameters: JWS037101(String)
2020-04-21 16:33:01 [http-nio-8080-exec-3] DEBUG   at org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)- ====>  Preparing: SELECT * FROM monitor_data WHERE monitor_data.corp_code = 'A01' AND equip_id = ? 
2020-04-21 16:33:01 [http-nio-8080-exec-3] DEBUG   at org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)- ====> Parameters: 19135118(String)
                                    要配置的内容如下1.需要建立一个mapper存放对应的BaseMapper的文件夹2.需要写好对应的MybatisPlus的文件,当然你得先把所有的包都导入到pom.xml里面去才行3.在Resources的文件夹下面创建一个mapper的文件存放你想写的动态sql的XML的文件夹4.写好对应的的Resourc下的mapper的SQL的id对应好src下面的mapper下面的BaseMapper里面的方法名。
                                    供货商城系统,springboot2+mybatis+mybatisplus+jwt+mpvue,本系统是一个完整的商城系统,包括小程序+API+管理理后台,非常适合学习或者二次开发使用,也可以直接使用,商城功能:商品多规格、文章管理、购物车、订单、优惠券、支付等。
供货商城系统,springboot2+mybatis+mybatisplus+jwt+mpvue,本系统是一个完整的商城系统,包括小程序+API+管理理后台,非常适合学习或者二次开发使用,也可以直接使用,商城功能:商品多规格、文章管理、购物车、订单、优惠券、支付等。
供货商城系统,springboot2+mybatis+mybatisplus+jwt+mpvue,本系统是一个完整的商城系统,包括小程序+API+管理理后台,非常适合学习或者二次开发使用,也可以直接使用,商城功能:商品多规格、文章管理、购物车、订单、优惠券、支付等。
供货商城系统,springboot2+mybatis+mybatisplus+jwt+mpvue,本系统是一个完整的商城系统,包括小程序+API+管理理后台,非常适合学习或者二次开发使用,也
                                    文章目录一、mybatis驼峰式命名二、mybatis-plus驼峰命名三、mapper.xml文件常用属性及标签3.1、${}和#{}的区别3.2、常见的属性3.3、常见标签3.3.1、简述3.3.2、 if标签3.3.3、 where标签3.3.4、 trim3.3.5、 set3.3.6、 foreach:3.3.7、 choose
一、mybatis驼峰式命名
mybatis驼峰式命名规则自动转换:
使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”;
使用好处:省去ma
1. Mybatis-Plus在查询的时候,使用lambdaQuery表达式查询
medicineType(药品类型)和clinicId(诊所id)是必查。medicineCode(助记码)、goodsName(
                                    关于代码生成器的说明
我们在开发mybatis时,涉及到xml,和bean,mapper等的书写,copy改,花的时间多且会有Bug,考虑到这些代码都是机械式的,用生成的方式比较靠谱
mybatis官方推荐有了相应的生成工具org.mybatis.generator,以maven插件的形式生成,会生成很多的example类,也比较方便.
不过这篇要讲的是mybatis-plus的生成
                                    MyBatis-Plus在MyBatis的基础上只做增强,不做改变,目的是为了简化开发,提高效率。本专栏文章围绕MyBatis-Plus的常用技术点,分别演示了下面这些技术点:
《MyBatis-Plus入门案例:查询数据库中所有记录》
文章目录MyBatis-Plus入门案例:查询数据库中所有记录步骤1:创建数据库和表步骤2:创建springboot工程并引入依赖(1) 创建springboot工程(2) 创建User实体类(3) 引入mybatis-plus和mysql的依赖步骤4:配置数据库信.
                                    MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,相信大家使用的也挺多了,现在基本上告别用xml的形式写。
1、一张表的情况:假设只是查询表中种类的数量、种类
 QueryWrapper wrapper = new QueryWrapper();
        wrapper.select("count(*) as allprice,category");
        wrapper.groupBy("c
  `pwd` varchar(512) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2.设计数据库对应的实体类
@Data
@NoArgsConstruc.