mybatis 集成neo4j功能实现

news2025/2/25 6:36:19

文章目录

  • 前言
  • 一、引入jar包依赖
  • 二、配置 application.properties
  • 三、Mybatis Neo4j分页插件
  • 四、Mybatis Neo4j自定义转换器handler
  • 五、Mybatis+Neo4j代码示例
  • 总结


前言

MyBatis是一个基于Java语言的持久层框架,它通过XML描述符或注解将对象与存储过程或SQL语句进行映射,并提供了普通SQL查询、存储过程和高级映射等操作方式,使得操作数据库变得非常方便。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
Neo4j 是一个高性能的NOSQL 图数据库,它将结构化数据存储在图中而不是表中。它非常适合于表示和查询高度连接的数据,例如社交网络、推荐系统和知识图谱等。
Neo4j数据模型和查询语言 Cypher 与传统的关系型数据库有很大的不同。因此原生MyBatis 并不支持 Neo4j,需要引入第三方jar包,并通过配置和编码的方式进行集成。


一、引入jar包依赖

POM.XML 添加依赖neo4j-jdbc-driver  mybatis-spring-boot-starter
         <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-jdbc-driver</artifactId>
            <version>4.0.0</version>
        </dependency>
		<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

二、配置 application.properties

######## neo4j图数据源
spring.datasource.neo4j.username=neo4j
spring.datasource.neo4j.password=xxxxx
spring.datasource.neo4j.url=jdbc:neo4j:http://192.168.3.179:7474
spring.datasource.neo4j.driver-class-name=org.neo4j.jdbc.http.HttpDriver
#spring.datasource.neo4j.url=jdbc:neo4j:bolt://localhost:7687
#spring.datasource.neo4j.driver-class-name=org.neo4j.jdbc.bolt.BoltDriver
spring.datasource.neo4j.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.target-names=neo4j

创建mapper文件
在这里插入图片描述

<?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="neo4jExampleMapper" >
    <!-- 自定义结果集-->
    <resultMap id="userMap" type="example.neo4j.ExampleUserModel">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
    </resultMap>
    <select id="getAll" resultMap="userMap">
		match
          (u:user)
		return
		  id(u) as id,u.name as name,u.age as age,u.sex as sex
	</select>

    <select id="getById" resultMap="userMap">
		match
		  (u:user)
		where
		  id(u) = #{id}
		return
          id(u) as id,u.name as name,u.age as age,u.sex as sex
	</select>
	
	<insert id="add" parameterType="example.neo4j.ExampleUserModel">
        create(u:user{name:#{name},age:#{age},sex:#{sex}})
    </insert>

    <update id="update">
        match (u:user)
        where id(u) = #{id}
        set u.name = #{name},u.age = #{age},u.sex = #{sex}
    </update>
</mapper>

三、Mybatis Neo4j分页插件

public class Neo4jDialect extends PageDialect {

    @Override
    public boolean supportsLimit() {
        return true;
    }

    @Override
    public String getLimitString(String sql, int offset, int limit) {
        return getLimitString(sql, offset, Integer.toString(offset), Integer.toString(limit));
    }

    private String getLimitString(final String sql,
                                  final int offset,
                                  final String offsetPlaceholder,
                                  final String limitPlaceholder) {
        StringBuilder stringBuilder = new StringBuilder(getLineSql(sql));
        if (offset > 0) {
            stringBuilder.append(" skip ").append(offsetPlaceholder).append(" limit ").append(limitPlaceholder);
        } else {
            stringBuilder.append(" limit ").append(limitPlaceholder);
        }

        return stringBuilder.toString();
    }
    @Override
    public String getCountString(String sql) {
        String newsql;
        if (CountHelper.containOrder(sql) && !CountHelper.containOver(sql)) {
            newsql = getNonOrderByPart(sql);
        } else {
            newsql = sql;
        }

        return "call { " + newsql.trim() + "} return count(*) as tmp_count";
    }
    protected String getLineSql(String sql) {
        return sql.replaceAll("[\r\n]", " ").replaceAll("\\s{2,}", " ");
    }
    private static String getNonOrderByPart(String sql) {
        return CountHelper.removeOrders(sql);
    }
}

四、Mybatis Neo4j自定义转换器handler


/**
 * 将查询结果中的json格式的字段进行转换的自定义转换器,转换为实体类的JSONObject属性
 */
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JSONObjectTypeHandler extends BaseTypeHandler<JSONObject> {

   /**
    * 设置非空参数
    * @param ps
    * @param i
    * @param parameter
    * @param jdbcType
    * @throws SQLException
    */
   @Override
   public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
       ps.setString(i, String.valueOf(parameter.toJSONString()));
   }

   /**
    * 根据列名,获取可以为空的结果
    * @param rs
    * @param columnName
    * @return
    * @throws SQLException
    */
   @Override
   public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
       String sqlJson = rs.getString(columnName);
       if (null != sqlJson){
           return JSONObject.parseObject(sqlJson);
       }
       return null;
   }

   /**
    * 根据列索引,获取可以为空的结果
    * @param rs
    * @param columnIndex
    * @return
    * @throws SQLException
    */
   @Override
   public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
       String sqlJson = rs.getString(columnIndex);
       if (null != sqlJson){
           return JSONObject.parseObject(sqlJson);
       }
       return null;
   }

   @Override
   public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
       String sqlJson = cs.getString(columnIndex);
       if (null != sqlJson){
           return JSONObject.parseObject(sqlJson);
       }
       return null;
   }
}

五、Mybatis+Neo4j代码示例

对Neo4j的增改查

public class Neo4jExampleService {
	@Resource
    private MybatisSqlSession mybatisSqlSession;
	@Resource
	private DataSource datasource;
	
	
	public  ExampleUserModel  getUserInfo(String userid) {
		ExampleUserModel user=mybatisSqlSession.selectById("neo4jExampleMapper.getById", userid);
		return user;
	}
	public  List<ExampleUserModel>  getAllUser() {
		List<ExampleUserModel> userList=mybatisSqlSession.selectByParams("neo4jExampleMapper.getAll", null);
		return userList;
	}
	@SuppressWarnings("unchecked")
	public  DataPaging  getPageUser(Integer page) {
		PageRequest pageRequest = new PageRequest(page, 4, null);
		DataPaging pageing=mybatisSqlSession.selectPaging("neo4jExampleMapper.getAll", pageRequest);
		return pageing;
	}
    public void insert( ExampleUserModel model) {
    	//MATCH (n:user) return n
        mybatisSqlSession.insert("neo4jExampleMapper.add", model);
    }
    @Transactional(rollbackFor = Exception.class)
    public void addAndUpdate( ExampleUserModel model) {
    	//MATCH (n:user) return n
    	System.out.println("before insert "+datasource);
        mybatisSqlSession.insert("neo4jExampleMapper.add", model);
        System.out.println("after insert");
        ExampleUserModel updateUser=new ExampleUserModel();
        updateUser.setId(1237L);
        updateUser.setName("dTest");
        updateUser.setAge(20);
        mybatisSqlSession.update("neo4jExampleMapper.update", updateUser);
    }

总结

以上只是摘取了框架中的一部分代码,本文只是提供了一些具体设计思路,其它部分需要自行完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1473988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue项目打包获取git commit信息并输出到打包后的指定文件夹中

需求背景&#xff1a; 前端项目经常打包&#xff0c;发包部署&#xff0c;为了方便测试及运维发现问题时与正确commit信息对比 实现方式&#xff1a; 使用Node.js的child_process模块来执行git命令 实现步骤&#xff1a; 1.在package.json的同级目录下新建一个version.js文件。…

软件无线电SDR加人工智能算法实现无人机频谱探测

通用软件无线电接收机作为传感器实时接收探测无线电信号&#xff0c;加上深度学习算法实现频谱识别&#xff0c;(https://img-blog.csdnimg.cn/5a6c4d89a047453a94f763f4e67aeb17.png)

十一、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法&#xff08;promotion&#xff09;重新定义paintEvent事件 2、实现程序 &#xff08;1&#xff09;创建项目&#xff0c;基于QWidget &#xff08;2&#xff09;添加类&#xff0c;为Widget组件提升类 #inclu…

超低价电商源码看过来,可二次开发,低至1万起

电商源码是多商户跨境电商系统软件开发中的重要组成部分。本文将详细介绍电商源码的概念、作用、开源的Java电商平台系统开发步骤以及相关注意事项&#xff0c;帮助您更好地了解电商源码和多商户跨境电商系统软件开发。 一、电商源码的概念和作用 电商源码是指电子商务网站或…

挑战杯 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广&#xff0c;比如无人机航拍&#xff0c;遥感图像等等&#xff0c;图像拼接是进一步做图像理解基础步骤&#xff0c;拼接效果的好坏直接影响接下来的工作&#xff0c;所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧&#xff0c;…

Netty01NIO

NIO基础 NIO &#xff1a;non-blocking io 非阻塞 IO 笔记 www.zgtsky.top 网课&#xff1a;黑马Netty 三大组件 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以…

WPS如何共享文件和文件夹

1 WPS共享单个文件 用WPS打开要分享的文件&#xff0c;点击右上角的“分享”键&#xff0c;选择上传到云端。 之后点击“创建并分享”&#xff0c;即可分享该文档。 2 WPS创建共享文件夹 2.1 如何共享文件夹 首先打开WPS&#xff0c;点击左上角的首页。在首页栏中&#…

IDEA的LeetCode插件的设置

一、下载插件 选择点击File->Setting->Plugins&#xff1a;搜索LeetCode 二、打开这个插件 选择View —>Tool Windows—>leetcode 三、登陆自己的账号 关于下面几个参数的定义&#xff0c;官方给的是&#xff1a; Custom code template: 开启使用自定义模板&…

SQL Server添加用户登录

我们可以模拟一下让这个数据库可以给其它人使用 1、在计算机中添加一个新用户TeacherWang 2、在Sql Server中添加该计算机用户的登录权限 exec sp_grantlogin LAPTOP-61GDB2Q7\TeacherWang -- 之后这个计算机用户也可以登录数据库了 3、添加数据库的登录用户和密码&#xff0…

RubyMine 2023:让Ruby编程变得更简单 mac/win版

JetBrains RubyMine 2023是一款专为Ruby开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款工具集成了许多先进的功能&#xff0c;旨在提高Ruby编程的效率和生产力。 RubyMine 2023软件获取 RubyMine 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#…

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…

MySQL之 数据库操作管理/开发规范【附件world可下载】

一、 目的 为了在软件生命周期内规范数据库相关的设计、开发、运维工作,便于不同团队之间的沟通及协调,制定此文档,以期在相关规范上达成共识和默契,提升相关环节的工作效率及系统的可维护性。同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证…

简单聊聊现在的AI

简单聊聊现在的AI 前言主要的AI模型和形式LLM - Large Language Model&#xff08;大语言模型&#xff09;BOT&#xff08;机器人&#xff09;LAM - Large Action Models&#xff08;大行动模型&#xff09;Agent&#xff08;智能体&#xff09; 结尾 前言 好久没回来写博客&a…

java 通过 microsoft graph 调用outlook

废话不多说 一 官方文档 先看一下官方文档&#xff0c;https://learn.microsoft.com/zh-cn/graph/tutorials/java?contextoutlook%2Fcontext&tabsaad&tutorial-step1 其中的代码&#xff0c;可以通过地址下载&#xff1a;https://developer.microsoft.com/en-us/gra…

基于uniapp框架的古汉语学习考试系统 微信小程序python+java+node.js+php

1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果需要其它操作时&#xff0c;要登录注册&#xff0c;只有注册成功才有的权限。 2、管理员的功能及权限 用户信息的添加和管理&#xff0c;古汉语信息加和管理和学习视频添加和管…

下载 axios.js 文件到本地【linux】

方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网&#xff1a;https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压&#xff0c;进入到 dist 文件夹** 参考&#x…

代码随想录算法训练营第四天

● 自己看到题目的第一想法 24.两两交换链表中的节点 方法&#xff1a;虚拟头节点 思路&#xff1a; 设置虚拟头节点dummyhead 设置临时指针cur dummyhead; cur每次向前移动两步 循环条件&#xff1a; cur ! nullptr && cur->next ! nullptr && cur->…

springBoot整合Redis(一、Jedis操作Redis)

在springboot环境下连接redis的方法有很多&#xff0c;首先最简单的就是直接通过jedis类来连接&#xff0c;jedis类就相当于是redis的客户端表示。 但是因为现在比较常用的是&#xff1a;StringRedisTemplate和RedisTemplate&#xff0c;所以jedis只做简单的介绍。 一、Jedis…

3D生成式AI模型与工具

当谈到技术炒作时&#xff0c;人工智能正在超越虚拟世界&#xff0c;吸引世界各地企业和消费者的注意力。 但人工智能可以进一步增强虚拟世界&#xff0c;至少在某种意义上&#xff1a;资产创造。 AI 有潜力扩大用于虚拟环境的 3D 资产的创建。 AI 3D生成使用人工智能生成3D模…

【pytorch】常用便捷代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…