mybatis 集成neo4j实现

文章目录

  • 前言
  • 一、引入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)returnid(u) as id,u.name as name,u.age as age,u.sex as sex</select><select id="getById" resultMap="userMap">match(u:user)whereid(u) = #{id}returnid(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 {@Overridepublic boolean supportsLimit() {return true;}@Overridepublic 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();}@Overridepublic 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*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String sqlJson = rs.getString(columnIndex);if (null != sqlJson){return JSONObject.parseObject(sqlJson);}return null;}@Overridepublic 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 {@Resourceprivate MybatisSqlSession mybatisSqlSession;@Resourceprivate 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 nmybatisSqlSession.insert("neo4jExampleMapper.add", model);}@Transactional(rollbackFor = Exception.class)public void addAndUpdate( ExampleUserModel model) {//MATCH (n:user) return nSystem.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.mzph.cn/news/698322.shtml

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

相关文章

Qt+VTK鼠标拾取点生成拉伸闭合三维体

程序示例精选 QtVTK鼠标拾取点生成拉伸闭合三维体 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《QtVTK鼠标拾取点生成拉伸闭合三维体》编写代码&#xff0c;代码整洁&#xff0c;规则&…

java——特殊文件日志技术

目录 特殊文件Properties文件XML文件XML文件有如下的特点XML的作用和应用场景解析XML文件 日志技术概述日志技术的体系结构Logback日志框架概述快速入门核心配置文件logback.xml日志级别项目中使用日志框架 特殊文件 Properties文件 后缀为.properties的文件&#xff0c;称之…

k8s(2)

目录 一.二进制部署k8s 常见的K8S安装部署方式&#xff1a; k8s部署 二进制与高可用的区别 二.部署k8s 初始化操作&#xff1a; 每台node安装docker&#xff1a; 在 master01 节点上操作; 准备cfssl证书生成工具:&#xff1a; 执行脚本文件&#xff1a; 拉入etcd压缩包…

Unity架构师经验分享:基于状态机的逻辑控制

在Unity中&#xff0c;状态机是一种非常重要的设计模式&#xff0c;它可以帮助开发者更好地管理游戏中的逻辑控制。在本文中&#xff0c;我们将详细解答基于状态机的逻辑控制&#xff0c;帮助Unity架构师进阶。 1. 什么是状态机&#xff1f; 状态机是一种用于描述对象在不同状…

一文读懂!2024年NCDA数字绘画竞赛:参赛、要求、获奖作品

第12届未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09; H类&#xff1a;数字绘画命题选项 命题信息 参赛对象&#xff1a; 1. 大学生组&#xff1a;分①研究生组②本科生组③专科生组&#xff0c;三组分别评审 2. 教师组&#xff1a;普通高校教师&#xf…

mybatis总结三

传统do实现方式&#xff1a; public class StudentDaoImpl implements StudentDao {Overridepublic List<Student> selectStudents() {SqlSession sqlSession MybatisUtils.getSqlSession();String sqlId "com.lifang.dao.StudentDao.selectStudents";List&…

1.1_1 计算机网络的概念、功能、组成和分类

文章目录 1.1_1 计算机网络的概念、功能、组成和分类&#xff08;一&#xff09;计算机网络的概念&#xff08;二&#xff09;计算机网络的功能&#xff08;三&#xff09;计算机网络的组成1.组成部分2.工作方式3.功能组成 &#xff08;四&#xff09;计算机网络的分类 总结 1.…

windows11安装VMware----创建多虚拟机教程

一、centOS下载 1、官网地址&#xff1a;https://www.centos.org/ 2、阿里镜像站&#xff1a;https://mirrors.aliyun.com/centos 3、清华镜像源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/centos/ 3.、CentOS搜狐镜像&#xff1a;http://mirrors.sohu.com/centos/…

Linux-基础知识(黑马学习笔记)

硬件和软件 我们所熟知的计算机是由&#xff1a;硬件和软件组成。 硬件&#xff1a;计算机系统中电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。 软件&#xff1a;是用户和计算机硬件之间的接口和桥梁&#xff0c;用户通过软件与计算机进行交流。 而操作系统…

个人博客系列-项目部署-nginx(3)

使用Nginx uwsgi进行部署django项目 一. 检查项目是否可以运行 启动项目 python manage.py runserver 0.0.0.0:8099输入ip:8099 查看启动页面 出现上述页面表示运行成功 二. 安装uwsgi并配置 2.1 下载uwsgi pip install uwsgi新建文件test.py写入内容&#xff0c;测试一…

SpringBoot中Redis缓存的使用

目录 1 前言 2 实现方法 2.1 查询数据时 2.2 修改数据 1 前言 对于一些不常改变&#xff0c;但又经常查询的数据&#xff0c;我们可以使用Redis缓存&#xff0c;来缓解数据库的压力&#xff0c;其中的逻辑如下&#xff1a; 2 实现方法 2.1 查询数据时 一般在控制类查询方…

绕过5秒盾Cloudflare和DDoS-GUARD

绕过5秒盾Cloudflare和DDoS-GUARD 5秒盾的特点免费版5秒盾的绕过方法付费版5秒盾的绕过方法 5秒盾的特点 <title>Just a moment...</title>例如: <!DOCTYPE html><html lang"en-US"><head><title>Just a moment...</title&…

Linux文件上传下载与MySQL安装常见问题

Linux文件上传和下载 在FinalShell中拖拽上传文件 双击下载文件 或者 yun -y install lrzsz 安装此命令 rz 进行文件上传 sz 进行文件下载 Linux系统常用的压缩格式 tar格式 归档文件&#xff0c;整合到一个文件内&#xff0c;无压缩效果 gzip格式 gzip压缩文件&…

Python列表:灵活多变的数据结构

文章目录 一、列表1.创建列表2.访问列表元素3.修改列表元素4.添加元素5.删除元素 二、列表脚本操作符1.连接运算符 2.重复运算符 * 三、列表函数&方法1.函数1.1 len() 函数1.2 max() 函数1.3 min() 函数1.4 sum() 函数1.5 list() 函数 2.方法2.1 append() 方法2.2 extend()…

MacBook的nginx出现13: Permission denied 的问题分析和解决办法

同样的项目代码&#xff0c;电脑从Windows更换到了MacBook&#xff0c;发现网站的样式都没有了&#xff0c;直接访问CSS文件 http://crm.ms-test.cc/toolstatic/css/bootstrap.min.css 发现无法访问。查看Nginx错误日志&#xff1a; 说明是nginx没有权限访问这个CSS文件&#…

Mockito测试框架入门与使用

目录 MockitoMockito使用Mockito依赖Mockito常用注解Mockito常用方法 Mockito Mockito 是一个流行的 Java 单元测试框架&#xff0c;用于模拟&#xff08;mock&#xff09;对象以便进行单元测试。它可以帮助开发人员创建和管理模拟对象&#xff0c;以便在测试过程中替换那些不…

mysql 分表实战

本文主要介绍基于range分区的相关 1、业务需求&#xff0c;每日160w数据&#xff0c;每月2000w;解决大表数据读写性能问题。 2、数据库mysql 8.0.34&#xff0c;默认innerDB;mysql自带的逻辑分表 3、分表的目的:解决大表性能差&#xff0c;小表缩小查询单位的特点(其实优化的精…

鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解

MouseBoost Pro mac版是一款简单实用的鼠标右键助手专业版&#xff0c;MouseBoost Pro for Mac只要轻点你的鼠标右键&#xff0c;就可以激活你想要的各种功能&#xff0c;让你的工作效率大幅度提高&#xff0c;非常好用。 软件下载&#xff1a;MouseBoost PRO for Mac v3.3.6中…

Gemma模型论文详解(附源码)

原文链接&#xff1a;Gemma模型论文详解&#xff08;附源码&#xff09; 1. 背景介绍 Gemma模型是在2023.2.21号Google新发布的大语言模型, Gemma复用了Gemini相同的技术(Gemini也是Google发布的多模态模型)&#xff0c;Gemma这次发布了了2B和7B两个版本的参数&#xff0c;不…

如何快速卸载windows电脑的一些软件?

本系列是一些电脑常规操作的普及&#xff0c;有需要借鉴即可 注&#xff1a;每个电脑都会有差异&#xff0c;参考即可。 其实大部分软件你删除桌面上的图标不等于删除&#xff0c;因为桌面上的那个图标就是一个简单的快捷方式而已。 在这里插入图片描述 那如何正确的卸载软件呢…