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,就可以啦。