MyBatis框架连接Neo4j数据库并计算节点的度

  • 首先说说我的问题,本来准备直接用JDBC连一下,写的时候发现用JDBC的话CQL语句是以字符串形式传入的,这样的问题在于语句中的参数无法通过变量传入,举个例子:

    • CQL语句:match ()-(p)->(n:Movie) where id(n)=8 return id(n),n.title,count(p)
    • 这个语句查询的是id为8的Movie类型节点,返回节点id,title,count(p)入度
    • 接下来如果要查id为9或者id为10或者更多,在JDBC连接方式下只能再写一个CQL语句单独进行
    • 这时候就想了,要是能来一个id++,岂不妙哉!!
    • MyBatis!!!

    搭建MyBatis连接Neo4j:

  • 创建一个Java Project,下载需要的包
    • 三个jar包:log4j-1.2.17.jar;mybatis-3.2.6.jar;neo4j-jdbc-driver-3.1.0.jar 版本不要求
  • 这是我的代码框架
    • 我的代码框架

  • 先配置properties文件
    • log4j.properties记录日志信息,暂时不用管;
    • neo4j.properties记录数据库信息,文件名字可以以你的喜好随便改,内容如下:
driver=org.neo4j.jdbc.Driver
url=jdbc:neo4j:http://localhost:7474/
username=neo4j
password=neo4j
#定义初始连接数  
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲  
minIdle=1
#定义最长等待时间 
maxWait=60000

  • 然后编写mybatis.cfg.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>
    <!-- 引入外部配置文件,这里配置文件名字"neo4j.properties"与你上面的命名要一致 -->
    <properties resource="neo4j.properties"></properties>
    <typeAliases>
        <!-- 别名方式1,一个一个的配置 type中放置的是类的全路径,alias中放置的是类别名
        <typeAliase type="com.cy.mybatis.beans.UserBean" alias="UserBean"/> -->
        <!-- 别名方式2,自动扫描,将JAVA类的类名作为类的类别名 -->
        <package name="beans"/>
    </typeAliases>

    <!-- 环境 -->
    <!-- 配置mybatis运行环境 -->
    <environments default="development">    
        <!-- 环境变量 -->
        <environment id="development">
            <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
            <transactionManager type="JDBC"/>

            <!-- 数据源 -->
            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 告知映射文件方式1,一个一个的配置
        <mapper resource="com/cy/mybatis/mapper/UserMapper.xml"/>-->
        <!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
        <package name="mapper"/>
    </mappers>
</configuration>

  • 编写mapper

    • UserMapper.java:
public interface UserMapper {
    /**
     * 查询并计算指定ID的节点的度
     * 
     * @param id
     * @return
     * @throws Exception
     */
    public UserBean countUser(int id) throws Exception;
}

    • UserMapper.xml(下面的CQL语句中的#{id}就是可以通过Java变量传进去的):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.UserMapper">

    <!-- 自定义结果集,由结果集需要的字段再去建立专门的实体类UserBean来接收 -->
    <resultMap id="userMap" type="UserBean">
        <id property="id" column="id" javaType="java.lang.Integer"/>
        <result property="released" column="released" javaType="java.lang.String" /> 
        <result property="tagline" column="tagline" javaType="java.lang.String" /> 
        <result property="title" column="title" javaType="java.lang.String" /> 
        <result property="degree" column="degree" javaType="java.lang.Integer" /> 
    </resultMap>

    <!--#{}中的内容,为占位符,当参数为某个JavaBean时,表示放置该Bean对象的属性值  -->
    <!--这里的id必须与 UserMapper接口里的函数相对应 -->
    <select id="countUser" parameterType="int" resultMap="userMap">
        MATCH ()-[p]->(n:Movie) where id(n)=#{id} RETURN id(n) as id,n.released as released,n.tagline as tagline,n.title as title,count(p) as degree
    </select>
    <!--这里CQL语句返回的字段名必须与上面定义的结果集的字段名一致,若不一致需要重命名,否则会报空指针异常 -->
</mapper>

  • 编写实体类UserBean.java,与结果集一致:
public class UserBean {
    private int id;
    private String released;
    private String tagline;
    private String title;
    private int degree;

    public UserBean() {
    }

    @Override
    public String toString() {
        return "UserBean [id=" + id + ", released=" + released + ", tagline=\"" + tagline + "\", title=\"" + title + "\", degree="+ degree + "]";
    }

  • 编写测试类UserService.java:
public class UserService {
    public static void main(String[] args) {
        for(int i=0;i<30;i++) {
            countUser(i);
        }
    }
    //计算节点入度,出度类似,改一下CQL语句即可
    private static void countUser(int id) {
        SqlSession session = DBTools.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        try {
            UserBean movie = mapper.countUser(id);
            System.out.println(movie.toString());
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }
    }
}

  • 程序运行之前,需要先开启neo4j,如果配置了环境变量的话,打开cmd输入neo4j.bat console即可,不要关闭cmd窗口

猜你喜欢

转载自blog.csdn.net/qq_34233510/article/details/82496101
今日推荐