No.10 mybatis resultMap自定义使用和spring boot实现

本文介绍了如何在不改变原有SQL功能的前提下,利用Mybatis的resultMap特性,结合Spring Boot,创建一个包含距离(distance)计算的新实体。通过在mapper.xml中定义新的resultMap,实现了将计算出的经纬度距离加入到查询结果中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

No.10 mybatis resultMap自定义使用和spring boot实现

项目需求:
计算经纬度之差,返回距离distance最近的N个记录,并带有计算到的距离。但是数据表中没有distance字段,也不允许改变原有的其他sql功能。
配置:
mybatis CodeGenerator。自动生成的结构
想法:
1. mybatis resultMap可以自定义想要返回的结构,但是其 Type参数必须填Model中一个实体。而本来的实体是没有distance字段(变量)的。所以在新实体上,需要加上distance。
2. 在mapper.xml上新加 resultMap,指向 带distance的实体。
3. 写的sql

新建带distance 的实体,Model

就是其他属性都一样,新增一个distance的属性

package com.company.project.model.distance;

import com.alibaba.fastjson.annotation.JSONField;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;

@Table(name = "maintenance_info")
public class MaintenanceInfoDistance {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "distance")
    private Integer distance;

    public Integer getDistance() {
        return distance;
    }

    public void setDistance(Integer distance) {
        this.distance = distance;
    }


    @Column(name = "Maintenance_name")
    private String maintenanceName;

    @Column(name = "Maintenance_ID")
    private String maintenanceId;

    @Column(name = "Maintenance_longitude")
    private BigDecimal maintenanceLongitude;

    @Column(name = "Maintenance_latitude")
    private BigDecimal maintenanceLatitude;
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "Datetime")
    private Date datetime;
    //get and set

mapper.xml中写入新的resultMap

MaintenanceInfoMapper.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.company.project.dao.MaintenanceInfoMapper">
  <resultMap id="DistanceResultMap" type="com.company.project.model.distance.MaintenanceInfoDistance">
    <!--
      WARNING - @mbg.generated
    -->
    <id column="ID" jdbcType="INTEGER" property="id" />
    <result column="Maintenance_name" jdbcType="VARCHAR" property="maintenanceName" />
    <result column="Maintenance_ID" jdbcType="VARCHAR" property="maintenanceId" />
    <result column="Maintenance_longitude" jdbcType="DECIMAL" property="maintenanceLongitude" />
    <result column="Maintenance_latitude" jdbcType="DECIMAL" property="maintenanceLatitude" />
    <result column="Datetime" jdbcType="TIMESTAMP" property="datetime" />
<!--distance 增加的距离显示-->
    <result column="distance" property="distance"/>
  </resultMap>

  <select id="sortByDistance" resultMap="DistanceResultMap">
     SELECT
    *,
    ROUND(
    6378.138 * 2 * ASIN(
    SQRT(
    POW(
    SIN(
    (
    #{lat} * PI() / 180 - Maintenance_latitude * PI() / 180
    ) / 2
    ),
    2
    ) + COS(#{lat} * PI() / 180) * COS(Maintenance_latitude * PI() / 180) * POW(
    SIN(
    (
    #{long} * PI() / 180 - Maintenance_longitude * PI() / 180
    ) / 2
    ),
    2
    )
    )
    ) * 1000
    ) AS distance
    FROM
    maintenance_info
    ORDER BY
    distance ASC
    limit #{num}
  </select>
</mapper>

在resultMap中,写入新的distance。再在select中,使用这个新的resultMap,就可以啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值