首页 > 数据库 >自定义typeHandler将包含经纬度对象插入到mysql的point类型的字段中

自定义typeHandler将包含经纬度对象插入到mysql的point类型的字段中

时间:2024-12-12 11:20:36浏览次数:4  
标签:java 自定义 point top typeHandler user emanjusaka import GeomPoint

博客:https://www.emanjusaka.top

公众号:emanjusaka的编程栈
下面给出关键部分代码,完整代码请访问原文地址

mysql 中的 point 类型在 java 中没有对应的类型匹配,需要我们自定义 typeHandler 去处理。

环境参数

  • SpringBoot
  • MybatisPlus
  • mysql

代码实现

typeHandler

GeomPointTypeHandler.java

package top.emanjusaka.config.typeHandler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import top.emanjusaka.domain.GeomPoint;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class GeomPointTypeHandler extends BaseTypeHandler<GeomPoint> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, GeomPoint parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toString());
    }

    @Override
    public GeomPoint getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        return new GeomPoint().parse(columnValue);
    }

    @Override
    public GeomPoint getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return new GeomPoint().parse(columnValue);
    }

    @Override
    public GeomPoint getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValue = cs.getString(columnIndex);
        return new GeomPoint().parse(columnValue);
    }
}

Mapper

UserMapper.java

package top.emanjusaka.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import top.emanjusaka.domain.User;

/**
 * @Author emanjusaka
 * @Date 2024/11/28 17:46
 * @Version 1.0
 */
public interface UserMapper extends BaseMapper<User> {
    void savePoint(User user);

    User getUserById(Long id);

}

UserMapper.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="top.emanjusaka.mapper.UserMapper">
    <resultMap id="pointResultMap" type="top.emanjusaka.domain.User">
        <id column="id" property="id"/>
        <result column="location" property="location"
                typeHandler="top.emanjusaka.config.typeHandler.GeomPointTypeHandler"/>
    </resultMap>
    <insert id="savePoint" parameterType="top.emanjusaka.domain.User">
        insert into user(id,location)
        values(#{id},ST_GeomFromText(#{location,typeHandler=top.emanjusaka.config.typeHandler.GeomPointTypeHandler}))
    </insert>
    <select id="getUserById" parameterType="long" resultType="top.emanjusaka.domain.User">
        select id,ST_ASTEXT(location) location from user where id = #{id}
    </select>
</mapper>

测试类

UserTest.java

package top.emanjusaka.point;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import top.emanjusaka.domain.GeomPoint;
import top.emanjusaka.domain.User;
import top.emanjusaka.mapper.UserMapper;

import javax.annotation.Resource;

/**
 * @Author emanjusaka
 * @Date 2024/11/28 17:41
 * @Version 1.0
 */
@SpringBootTest
public class UserTest {
    private static final Logger log = LoggerFactory.getLogger(UserTest.class);
    @Resource
    private UserMapper userMapper;

    @Test
    void testPoint() {
        User user = new User();
        user.setLocation(new GeomPoint(3.14, 5.15));
        userMapper.savePoint(user);
    }

    @Test
    void testSelectPoint() {
        User user = userMapper.getUserById(1L);
        System.out.println("point = " + user.getLocation().getLat());
    }
}

测试结果

插入数据:

image-20241203174019487

查询数据:

image-20241203174204434


谦学于心,谷纳万物,静思致远,共筑收获之旅!
上面代码展示了关键部分,完整代码请访问原文地址

标签:java,自定义,point,top,typeHandler,user,emanjusaka,import,GeomPoint
From: https://www.cnblogs.com/emanjusaka/p/18602059/mcode_4

相关文章

  • 转载:【AI系统】自定义计算图 IR
    模型转换涉及对模型的结构和参数进行重新表示。在进行模型转换时,通常需要理解模型的计算图结构,并根据目标格式的要求对其进行调整和转换,可能包括添加、删除或修改节点、边等操作,以确保转换后的计算图能够正确地表示模型的计算流程。本文主要介绍自定义计算图的方法以及模型转换的......
  • 转载:【AI系统】自定义计算图 IR
    模型转换涉及对模型的结构和参数进行重新表示。在进行模型转换时,通常需要理解模型的计算图结构,并根据目标格式的要求对其进行调整和转换,可能包括添加、删除或修改节点、边等操作,以确保转换后的计算图能够正确地表示模型的计算流程。本文主要介绍自定义计算图的方法以及模型转换的......
  • 【Java编程】如何自定义一个类加载器,加载自己指定的类?
    在Java中,类加载器(ClassLoader)负责把字节码文件(.class文件)加载到JVM中,Java的类加载机制给我们提供了高度的灵活性。通常情况下,Java会用默认的类加载器去加载类,但如果想加载特定路径的类,或者加载特定格式的文件,就需要自己写一个类加载器。本文将带你一步步实现一个简单的自......
  • QT自定义控件实践--滑动组件
    概述             本篇文章,会逐步带您了解,如何自定义一个QT的滑动组件操作步骤选择合适的基类继承:我们命名这个自定义控件为MySlipButton,继承自QWidget添加成员变量:根据滑动组件的特性,添加合适的成员变量,如当前值、最小值、最大值、滑块的位置等。......
  • c#委托 ,自定义函数中使用委托
    Func<int,int,int>t=(j,i)=>i+j;//自定义委托Func表示有返回值,返回两个的和Console.WriteLine(t(6,4));//输出10Func<int,bool>a=delegate(intj){returnj>0;};Console.WriteLine(a(6));......
  • vue el-select封装一个滚动加载更多下拉选项的自定义指令
    没有什么讲究,直接上代码模板部分<el-selectv-model="operator"filterableremotesize="small"reserve-keywordplaceholder="请输入经办人姓名":......
  • Monitor Asset Manager 和 MonitorInfoView 非常合适;而对于需要更多自定义和修改 EDID
    扩展显示识别数据(EDID,ExtendedDisplayIdentificationData)是显示设备(如显示器、电视、投影仪等)与计算机、显卡等设备之间交换的一种数据格式。它包含了显示设备的基本信息,如分辨率、刷新率、色彩深度、支持的音频格式等。这些信息能够帮助计算机自动识别和配置显示设备的最佳设......
  • 自定义阿里云OSS图片大小
    在访问oss图片时,如果图片太大,而本地网络不是很好的情况下,图片加载时间比较长,阿里云的oss有这个功能,在访问图片的时候指定大小显示,在显示的时候直接对图片进行压缩,这样可以加快访问速度!##图片地址https://gateon-ds.oss-cn-shanghai.aliyuncs.com/000a960090b343f0884b35acbd80e......
  • OFFICE:Word默认文档标没有自动升序的标题,添加自定义模板
    office版本2010修改前新建的word,默认样式如下:在开始菜单样式里看到标题1、标题2等修改在开始菜单,段落里,找到“多级列表”并点击点击“新的多级列表”在弹框中,点击左下角更多标题1修改“点击要修改的级别”,点击1;修改右侧”将样式链接到样式“,选择标题1;修改右侧”要在......
  • 部署pinpoint3.0.0
    pinpoint3.0的完整部署,跟2.5版本差距较大,2.5版本直接运行collector和web的jar包即可达成最快使用,但是3.0这样启动会报错按照pinpoint官网的文档,虽然可以成功部署,但是其中的弯路也比较多,现在整理一下免得后来人踩坑,也给自己留个小抄jdk本文档所使用的jdk版本为21.0.4,理论上1......