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)
		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);
    }

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

Open CASCADE学习|绘制砂轮

今天绘制一个砂轮&#xff0c;其轮廓由两条直线段和两段圆弧构成&#xff0c;圆弧分别与直线相切&#xff0c;两条圆弧之间相交而非相切。建模思路是&#xff1a;先给定两条直线段的起始点及长度&#xff0c;画出直线段&#xff0c;然后给定其中一圆弧的半径及圆心角&#xff0…

Elastic Stack--02--核心概念、倒排索引

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.核心概念1.1 索引1.2 类型1.3 文档1.4 字段 2.倒排索引此处ID是唯一标识 具体拆解的案例 1.核心概念 mysqlESDatabases 数据库索引 indicesTable 数据表类型 Type…

探索D咖智能饮品机器人的工作原理:科技、材料与设计的相互融合

智能饮品机器人是近年来随着人工智能和自动化技术的发展而崭露头角的一种创新产品。它将科技、材料和设计相互融合&#xff0c;为消费者带来了全新的饮品体验。下面D咖来探索智能饮品机器人的工作原理&#xff0c;以及科技、材料和设计在其中的作用。 首先&#xff0c;智能饮品…

抖音小店无货源真的靠谱吗?发展前景如何?2024年值得做吗?

大家好&#xff0c;我是电商花花。 我们通常说的抖音小店无货源就是利用产品之间的信息差、利润差来赚取商品的差价。 无货源模式就是即使没有货源&#xff0c;也能做抖音小店&#xff0c;前期店铺起店&#xff0c;我们需要大量的出单量和数据&#xff0c;我们才能快速把店铺…

Spring Boot应用集成Actuator端点自定义Filter解决未授权访问的漏洞

一、前言 我们知道想要实时监控我们的应用程序的运行状态&#xff0c;比如实时显示一些指标数据&#xff0c;观察每时每刻访问的流量&#xff0c;或者是我们数据库的访问状态等等&#xff0c;需要使用到Actuator组件&#xff0c;但是Actuator有一个访问未授权问题&#xff0c;…

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…

蓝桥杯C++竞赛常用库函数介绍

文章目录 前言一、二分查找1. 二分查找的前提2.binary_search函数3.lower_bound函数和upper_bound函数4.蓝桥杯例题 二、最值查找1. min和max函数2.min_element和max_element函数3.nth_element函数4.蓝桥杯例题 三、排序1.sort函数2.sort自定义比较函数,或lambda表达式(匿名函数…

金和OA UploadFileBlock接口任意文件上传漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 1. 产品简介 金和数字化智能办公平台&#xff08;简称JC6&#xff09;是…

运维SRE-06 阶段性复习软件管理体系

那些年运维必会操作-第一弹 操作 文件&#xff1a;增删改查 增&#xff1a;touch,vim,>,>>,cp删除&#xff1a;rm修改&#xff1a;内容&#xff1a;vi/vim,>,>> 文件名&#xff1a;mv查看&#xff1a;内容&#xff1a;cat/vim/less/more/head/tail/sed/awk/…

编写LLVM Pass的一个小问题

在阅读官方文档时发现一个很有趣的细节&#xff0c;官方给出了一个测试用例&#xff0c;此处有一个小问题&#xff08;%无法复制&#xff09;。但是我在使用自己编译的ll文件时&#xff0c;我发现该pass无法正常使用。最后经过测试发现是利用-O0编译产生的ll文件有optnone的fla…

学生成绩管理系统(C语言课设 )

这个学生成绩管理系统使用C语言编写&#xff0c;具有多项功能以方便管理学生信息和成绩。首先从文件中读取数据到系统中&#xff0c;并提供了多种功能&#xff08;增删改查等&#xff09;选项以满足不同的需求。 学生成绩管理系统功能: 显示学生信息增加学生信息删除学生信息…

Spring Security 重点解析

Spring Security 重点解析 文章目录 Spring Security 重点解析1. 简介2. 依赖3. 登录认证3.1 登录校验流程3.2 Spring Security 默认登录的原理3.2.1 Spring Security 完整流程3.2.2 登录逻辑探究 3.3 自定义改动3.3.1 自定义用户密码校验3.3.2 自定义 UserDetails 获取方式 F1…

C++多线程同步(上)

多线程同步 引言总述详情互斥锁示例运行结果分析条件变量示例一实现分析优化运行结果示例二实现代码运行结果示例三实现代码运行结果读写锁示例实现代码注意分析运行结果附言实现运行结果运行结果个人心得引言 项目中使用多线程,会遇到两种问题,一种是对共享资源的访问时需要…

kafka和ZK的关系

zk相当于是kafka的一个基础设施 Kafka是一种高吞吐量、可扩展的分布式发布订阅消息系统&#xff0c;ZooKeeper是一个分布式协调服务&#xff0c;用于管理和协调分布式系统中的各种资源 Zookeeper&#xff1a;管理broker&#xff0c;consumer 创建broker后&#xff0c;向zk注册…

Redis和Mysql如何保证数据一致性

一般情况下&#xff0c;Redis用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据 库IO&#xff0c;还可以提升数据的IO性能。 这是它的整体架构。 当应用程序需要去读取某个数据的时候&#xff0c;首先会先尝试去Redis里面加载&#xff0c;如果命中就 直…

基于Python3的数据结构与算法 - 04 快速排序

一、快速排序思路 快速排序特点&#xff1a;快 步骤&#xff1a; 取一个元素p&#xff08;第一个元素&#xff09;&#xff0c;使元素p归为&#xff1b;列表被p分成两部分&#xff0c;左边都比p小&#xff0c;右边都比p大&#xff1b;递归完成排序。 因此我们可以得到快速排…

kali xrdp

Kali Linux 使用远程桌面连接——xrdp&xfce_kali xfce桌面-CSDN博客 Ubuntu/Debian/Kali xrdp远程桌面黑屏/空屏/无画面解决办法 - 知乎 (zhihu.com) sudo apt-get install xrdp -y sudo apt-get install xfce4 -ysudo systemctl enable xrdp --now systemctl status xrd…

自动化行业文件数据\资料防泄密软件——天锐绿盾|@德人合科技

天锐绿盾是一款自动化行业文件数据防泄密软件&#xff0c;由德人合科技提供。该软件采用动态加解密技术&#xff0c;能够有效防止公司内部数据泄密&#xff0c;同时支持各种文件格式加密&#xff0c;如CAD、OFFICE、PDF、图纸等。 PC端&#xff1a;https://isite.baidu.com/sit…

C语言-数组指针与指针数组

一、简介 对于使用C语言开发的人来说&#xff0c;指针&#xff0c;大家都是非常熟悉的。数组&#xff0c;大家也同样熟悉。但是这两个组合到一起的话&#xff0c;很多人就开始蒙圈了。这篇文章&#xff0c;就详细的介绍一下这两个概念。 指针数组和数组指针&#xff0c;听起来非…