MyBatis框架连接neo4j数据库查询
在尚硅谷学完了mybatis框架,于是想试试用mybatis框架连接neo4j数据库,也给和我一样的小白做个参考。
具体流程
- 搭建maven环境,在pom.xml文件中引入neo4j,mybatis,junit的依赖,写好后记得刷新maven
- 配置mybatis核心配置文件:mybatis-config.xml
- 配置neo4j.properties , log4j.xml(日志,非必须)
- 在java的pojo包下创建要映射数据库表的实体类Person
- 在java的mapper包下创建PersonMapper接口,写操作的抽象方法
- 在resources的mapper包下创建PersonMapper.xml , 写具体的查询语句
- 在java的utils包下创建工具类SqlSessionUtil
- 在test的包下创建测试类MyTest
按流程一个个完成
先贴上我的目录结构
- pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.neo4j</groupId>
<artifactId>neo4j-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<!--下面这个build是因为我编辑器没设置用java8编译,然后报错之后引入了一下-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>io.thorntail</groupId>
<artifactId>neo4j</artifactId>
<version>2.7.0.Final</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-jdbc-driver</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 在resources文件夹下创建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--读取属性文件中数据库的配置-->
<properties resource="neo4j.properties"></properties>
<settings>
<!--设置日志输出语句,显示相应操作的sql语名-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--设置数据库表的属性命名为 表名_的 的转为驼峰命名 emp_name ___> empName -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>-->
</settings>
<typeAliases>
<package name="com.atguigu.mybatis.pojo"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${neo4j.driver}"/>
<property name="url" value="${neo4j.url}"/>
<property name="username" value="${neo4j.username}"/>
<property name="password" value="${neo4j.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.atguigu.mybatis.mapper"></package>
</mappers>
</configuration>
- 在resources文件下创建neo4j.properties,username和password用自己的替换
neo4j.driver=org.neo4j.jdbc.Driver
neo4j.url=jdbc:neo4j:http://localhost:7474/
neo4j.username=neo4j
neo4j.password=neo4jsunjiaqi
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
- 在resources文件夹下创建log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
- 在java的pojo包下创建要映射数据库表的实体类Person
package com.atguigu.mybatis.pojo;
/**
* @author Sun
* @version 1.0
*/
public class Person {
private Integer id;
private String name;
private Integer age;
private String sex;
public Person() {
}
public Person(Integer id, String name, Integer age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
- 在java的mapper包下创建PersonMapper接口,写操作的抽象方法
package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.pojo.Person;
import java.util.List;
/**
* @author Sun
* @version 1.0
*/
public interface PersonMapper {
List<Person> getAllPerson ();
}
- 在resources的mapper包下创建PersonMapper.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="com.atguigu.mybatis.mapper.PersonMapper">
<!--
List<Person> getAllPerson ();
-->
<select id="getAllPerson" resultType="person">
MATCH (person:Person) RETURN person
</select>
</mapper>
8.在java的utils包下创建工具类SqlSessionUtil
package com.atguigu.mybatis.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Sun
* @version 1.0
*/
public class SqlSessionUtil {
public static SqlSession getSqlSession () {
SqlSession sqlSession = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
sqlSession = sessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
9.在test的包下创建测试类MyTest
package com.atguigu.mybatis.test;
import com.atguigu.mybatis.mapper.PersonMapper;
import com.atguigu.mybatis.pojo.Person;
import com.atguigu.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author Sun
* @version 1.0
*/
public class MtTest {
SqlSession sqlSession;
@Before
public void openSession () {
sqlSession = SqlSessionUtil.getSqlSession();
}
@After
public void closeSqlSession () {
sqlSession.close();
}
@Test
public void testSelect () {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> allPerson = mapper.getAllPerson();
allPerson.forEach(person -> System.out.println(person));
}
}
查询后结果
neo4j数据库中Person节点图
这里因为我数据库中Person表的数据只有一个name属性,所以查出来就是这样了,虽然查出来了,却报错了java.lang.StackOverflowError,我还不知道怎么解决,也没有死循环,不知道为什么栈溢出。emm,目前还没想好节点之间的关系该怎么映射,因为Person是用python读取csv文件,手动指定两列之间的关系存进去的,还得继续学,大兄弟们加油!