接着上一篇讲
上一篇,我们在Windows下安装并配置了Neo4j(图形数据库),并简单的利用脚本语句创建了图形关系案例,有了这个基础,接下来,就是集成到我们的项目中了,一如以往,集成到我们的Spring-Boot中
一、Spring-Boot目录结构图
二、Neo4j依赖包添加
Pom.xml文件中添加如下依赖:
org.springframework.boot
spring-boot-starter-data-neo4j
三、基于图形节点Coder进行实体Java类映射
(1)
(2)创建节点实体类Coder
A.
Coder.java
package com.appleyk.data.nodeentity;
import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;
/**
* Neo4j的节点实体类:Coder
* @author [email protected]
* @blob http://blog.csdn.net/appleyk
* @date 2018年1月18日-下午12:06:17
*/
@NodeEntity
public class Coder {
/**
* Neo4j会分配的ID
*/
@GraphId
private Long id;
/**
* 属性
*/
private String name;
private String sex ;
private String hobby;
public Coder(){
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
注意,Coder类中的属性一定要和Neo4j图形数据库中的节点Coder的属性一一对应,否则映射失败!
注意Coder类用了Neo4j支持的一个注解@NodeEntity,表明该类是一个Neo4j支持的节点实体类
四、Coder节点实体类的增删改查接口
(类似于mybatis的mapper)
(1)GraphRepository:Neo4j的图形存储库,继承该接口,实现Coder类的增删改查
(2)
CoderRepositiory.java
package com.appleyk.data.Repository;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.neo4j.repository.GraphRepository;
import org.springframework.stereotype.Repository;
import com.appleyk.data.nodeentity.Coder;
/**
* Coder 节点增删改
* @author [email protected]
* @blob http://blog.csdn.net/appleyk
* @date 2018年1月18日-下午12:10:53
*/
@Repository
public interface CoderRepositiory extends GraphRepository{
/*
CoderRepositiory 继承 GraphRepository类,实现增删查改
实现自己的接口:通过名字查询Coder(可以是单个节点,也可以是一组节点List集合)
spring-data-neo4j 支持方法命名约定查询 findBy{Coder的属性名}
findBy后面的属性名一定要在Coder节点实体类里存在,否则会报错
*/
Coder findByName(@Param("name") String name);
}
上面说过,这种方式类似于Mybatis的mapper,因此,只要继承了GraphRepository
五、Spring-Boot全局属性文件配置Neo4j连接参数
#Neo4j配置
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=n123
#数据库uri地址
spring.data.neo4j.uri=http://localhost:7474
六、CoderController准备,进行节点查询(预热)
(1)restful风格api,查询方式为Get请求
(2)
CoderController.java
package com.appleyk.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.appleyk.data.Repository.CoderRepositiory;
import com.appleyk.data.nodeentity.Coder;
@RestController
@RequestMapping("/rest/v1.0.1/database/coder") //restful风格的api接口
public class CoderController {
@Autowired
CoderRepositiory coder;
@RequestMapping("/get")
public Coder GetCoderByName(@RequestParam(value="name") String name){
return coder.findByName(name);
}
}
查询走完,再走创建(save)
七、项目启动(run)
八、Coder节点(图形数据)查询接口调用
地址:http://localhost:8088/rest/v1.0.1/database/coder/get?name=鱼暖暖
(1) 提示连接失败(无效的用户名或者密码),无法提交请求
(2)模拟错误,就是为了避免采坑,且看我们的application.properties文件中的neo4j配置
(3)改过以后,我们再尝试一次调用
完美返回,我们再看一下,在我们的neo4j图形数据库中是不是一一对应
九、Coder节点(图形数据)的创建
(1)
Spring-Boot项目的全局数据源配置类:
package com.appleyk.config;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.github.pagehelper.PageInterceptor;
@Configuration
//使用注解 @EnableTransactionManagement 开启事务支持后
//然后在访问数据库的Service方法上添加注解 @Transactional便可。
@EnableTransactionManagement
@EnableConfigurationProperties(DataSourceProperties.class)
//扫描一切和Mapper有关的bean,因此,下面对整个项目进行"全身"扫描
@MapperScan("com.appleyk")
public class GlobalDataConfiguration {
@Bean(name = "dataSource")
//Spring 允许我们通过 @Qualifier注释指定注入 Bean 的名称
@Qualifier(value = "dataSource")
@ConfigurationProperties(prefix="jdbc")
@Primary
public DataSource dataSource()
{
return DataSourceBuilder.create().build();
}
//创建SqlSessionFactory
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource){
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
//1.设置数据源
bean.setDataSource(dataSource);
//2.给包中的类注册别名,注册后可以直接使用类名,而不用使用全限定的类名(就是不用包含包名)
bean.setTypeAliasesPackage("com.appleyk.database");
// 设置MyBatis分页插件 【PageHelper 5.0.1设置方法】
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount", "true");
pageInterceptor.setProperties(properties);
//添加插件
bean.setPlugins(new Interceptor[]{pageInterceptor});
//添加XML目录,进行Mapper.xml扫描
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
//项目中的xxxMapper.xml位于包com.appleyk.database下面
bean.setMapperLocations(resolver.getResources("classpath*:com/appleyk/database/*.xml"));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
//创建SqlSessionTemplate
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
(2)
CoderController.ajva
package com.appleyk.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.appleyk.data.Repository.CoderRepositiory;
import com.appleyk.data.nodeentity.Coder;
import com.appleyk.result.ResponseResult;
@RestController
@RequestMapping("/rest/v1.0.1/database/coder") //restful风格的api接口
public class CoderController {
@Autowired
CoderRepositiory coderRepositiory;
@RequestMapping("/get")
public Coder GetCoderByName(@RequestParam(value="name") String name){
return coderRepositiory.findByName(name);
}
@PostMapping("/save")
@Transactional
public ResponseResult Create(@RequestBody Coder coder) throws Exception{
Coder result = coderRepositiory.save(coder);
if(result!=null){
return new ResponseResult(200,result.getName()+"节点创建成功");
}
return new ResponseResult(500,coder.getName()+"节点创建失败!");
}
}
(4)切面方法统计
(5)Neo4j图形数据库中查找刚才创建的节点name:"詹姆斯"
A.
B.
最后附上项目的github地址:
https://github.com/kobeyk/spring-boot-neo4j.git