本人这段时间在公司学习neo4j的相关知识,带我的高级开发让我尝试着不用框架,用数据库连接池,实现对neo4j数据库的增删改查。在网上经过一番搜索以后,发现很多帖子代码给的都不全,需要自己修改。故现在放出我结合网上帖子和自己的修改以后的代码,粘贴复制即可用。
1、JdbcConnectionPoolFactory.java

package demo;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ${TODO} 写点注释吧
 * @author: duan_lian
 * @date: 2020/1/3 9:55
 * @version: V1.0
 * @review: duan_lian/2020/1/3 9:55
 */
public class JdbcConnectionPoolFactory {
    /**
     * @Field: pool
     *          数据库连接池
     */


    /**
     * @Method: getConnection
     * @Description: 从数据库连接池中获取数据库连接对象
     * @return Connection数据库连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        JdbcConnectionsPool pool = new JdbcConnectionsPool();
        return pool.getConnection();
    }

    /**
     * @Method: release
     * @Description: 释放资源,
     * 释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
     * @param conn
     * @param st
     * @param rs
     */
    public static void release(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                //关闭存储查询结果的ResultSet对象
                rs.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (st != null) {
            try {
                //关闭负责执行SQL命令的Statement对象
                st.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                //关闭Connection数据库连接对象
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public static List<Object> executeSql(String sql, Class c) throws SQLException, IllegalAccessException, InstantiationException {
        List<Object> objects = new ArrayList<>();
        Field[] fields = c.getDeclaredFields();
        Connection conn = JdbcConnectionPoolFactory.getConnection();

        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            Object o=c.newInstance();
            for (Field f : fields) {
                f.setAccessible(true);
                if (f.getType() == java.util.List.class) {
                    // 如果是List类型,得到其Generic的类型
                    Type genericType = f.getGenericType();

                    // 如果是泛型参数的类型
                    if (genericType instanceof ParameterizedType) {
                        ParameterizedType pt = (ParameterizedType) genericType;
                        //得到泛型里的class类型对象
                        Class<?> genericClazz = (Class<?>) pt.getActualTypeArguments()[0];
                    }
                }
                System.out.println(resultSet.getString("n"));
            }
            //关闭所有的数据库资源
            JdbcConnectionPoolFactory.release(conn, statement, resultSet);

        }
        return null;

    }

    public static List<Map<String, String>> executeSql(String sql, String...returnKeys) throws SQLException {
        List<Map<String,String>> maps = new ArrayList<>();

        Connection conn = JdbcConnectionPoolFactory.getConnection();
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            Map<String, String> map = new HashMap();
            for (String key:returnKeys) {
                map.put(key, resultSet.getString(key));
            }
            maps.add(map);
        }
        //关闭所有的数据库资源
        JdbcConnectionPoolFactory.release(conn, statement, resultSet);
        return maps;

    }

}

2、JdbcConnectionsPool.java

package demo;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;


/**
 * ${TODO} 写点注释吧
 * @author: duan_lian
 * @date: 2020/1/3 9:56
 * @version: V1.0
 * @review: duan_lian/2020/1/3 9:56
 */
public class JdbcConnectionsPool implements DataSource {
    /*
     * 使用静态块代码,初始化连接池,创建连接池的中最小链接数量连接,
     * 创建linkedlist集合,将这些连接放入集合中
     */
    /**创建linkedlist集合 **/
    private static LinkedList<Connection> linkedlist1 = new LinkedList<Connection>();
    private static String driver = "org.neo4j.jdbc.Driver";
    private static String url = "jdbc:neo4j:bolt://localhost/";
    private static String username = "neo4j";
    private static String password = "123456";
    /**最小连接数量**/
    private static int jdbcConnectionInitSize = 2;
    /** 当前最大连接数量=max*jdbcConnectionInitSize**/
    private static int max = 5;
    static {
        try {
            jdbcConnectionInitSize = Integer.parseInt("5");
            Class.forName(driver);
            /** 创建最小连接数个数据库连接对象以备使用**/
            for (int i = 0; i < jdbcConnectionInitSize;i++ ) {
                Connection conn= (Connection) DriverManager.getConnection(url, username, password);
                System.out.println("获取到了链接" + conn);
                //将创建好的数据库连接对象添加到Linkedlist集合中
                linkedlist1.add(conn);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    @Override
    public PrintWriter getLogWriter() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

    /**
     * 实现数据库连接的获取和新创建
     **/
    @Override
    public Connection getConnection() throws SQLException {
        //如果集合中没有数据库连接对象了,且创建的数据库连接对象没有达到最大连接数量,可以再创建一组数据库连接对象以备使用
        if (linkedlist1.size() == 0 && max <= 5) {
            try {
                Class.forName(driver);

            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            for (int i = 0; i < jdbcConnectionInitSize; i++) {
                Connection conn = DriverManager.getConnection(url, username, password);
                System.out.println("获取到了链接" + conn);
                //将创建好的数据库连接对象添加到Linkedlist集合中
                linkedlist1.add(conn);
            }
            max++;
        }
        if (linkedlist1.size()>0) {
            //从linkedlist集合中取出一个数据库链接对象Connection使用
            final Connection conn1= linkedlist1.removeFirst();
            System.out.println("linkedlist1数据库连接池大小是" + linkedlist1.size());
            /*返回一个Connection对象,并且设置Connection对象方法调用的限制,
             *当调用connection类对象的close()方法时会将Connection对象重新收集放入linkedlist集合中。
             */
            Class<?>[] interfaces=new Class[]{Connection.class};
            return (Connection) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    //这里换成JdbcConnectionsPool.class.getClassLoader();也行
                    interfaces, new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            if (!method.getName().equalsIgnoreCase("close")) {
                                return method.invoke(conn1, args);
                            } else {
                                linkedlist1.add(conn1);
                                System.out.println(conn1 + "对象被释放,重新放回linkedlist集合中!");
                                System.out.println("此时Linkedlist集合中有" + linkedlist1.size() + "个数据库连接对象!");
                                return null;
                            }
                        }
                    });
        }else {
            System.out.println("连接数据库失败!");
        }
        return null;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {

        return null;
    }

}

3、TestJdbcPool.java

package demo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * ${TODO} 写点注释吧
 * @author: duan_lian
 * @date: 2020/1/3 9:58
 * @version: V1.0
 * @review: duan_lian/2020/1/3 9:58
 */
public class TestJdbcPool {
/** 查询**/
    public static void query() throws SQLException {
        Connection conn= JdbcConnectionPoolFactory.getConnection();
        String sql = " MATCH (n:Artist) RETURN n.name ";
        Statement statement = conn.createStatement();
        ResultSet resultSet= statement.executeQuery(sql);
        while (resultSet.next()) {
            System.out.println(resultSet.getString("n.name"));
        }


    }
    /** 增加**/
    public static void add() throws SQLException {
        Connection conn = JdbcConnectionPoolFactory.getConnection();
        String sql = "CREATE (n:Artist{name:'duanlian'}) RETURN n.name ";
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
        System.out.println(resultSet.getString("n.name"));
        }

    }
    /** 更新**/
    public static void update() throws SQLException {
        Connection conn = JdbcConnectionPoolFactory.getConnection();
        String sql = "MATCH (n:Artist{name:'duanlian'}) WHERE  n.name = 'duanlian' SET n.name ='duanlianTest' ";
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            System.out.println(resultSet.getString("n.name"));
        }
        statement.close();
        //关闭所有的数据库资源
        JdbcConnectionPoolFactory.release(conn, statement, resultSet);
    }
    /** 删除 **/
    public static void delete() throws SQLException {
        Connection conn = JdbcConnectionPoolFactory.getConnection();
        String sql = "MATCH (n:Artist{name:'duanlianTest'})  delete n ";
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            System.out.println(resultSet.getString("n.name"));
        }

    }

   public static void main(String[] args) throws SQLException {
       /** 实例化封装了有关数据库类方法类的对象**/
       JdbcConnectionPoolFactory jcpt = new JdbcConnectionPoolFactory();
       System.out.println("*************************************查询*******************************************");
       query();
       System.out.println("*************************************添加*******************************************");
       add();
       System.out.println("*************************************查询*******************************************");
       query();
       System.out.println("*************************************更新*******************************************");
       update();
       System.out.println("*************************************查询*******************************************");
       query();
       System.out.println("*************************************删除*******************************************");
       delete();
       System.out.println("*************************************查询*******************************************");
       query();
   }
}

运行结果如下图所示:
图片说明