zoukankan      html  css  js  c++  java
  • java jdbc数据库连接简单封装

    ORM这一块一直用第三方框架,都忘记原生jdbc怎么写了,花了几个小时回忆整理一下。

    引用jar:mysql-connector-java-5.0.5-bin.jar

     

    创建公用私有变量

        public static final String url = "jdbc:mysql://127.0.0.1/oneshop";
        public static final String name = "com.mysql.jdbc.Driver";
        public static final String user = "root";
        public static final String password = "root";
        public Connection conn = null;
        private PreparedStatement pst = null;
        private ResultSet rs;

    构造函数实例化打开连接 

    public DB() throws ClassNotFoundException, SQLException {
            Class.forName(name);// 指定连接类型
            if (conn == null)
                conn = DriverManager.getConnection(url, user, password);// 获取连接
        }

    关闭连接

    public void close() throws SQLException {
            if (conn != null)
                conn.close();
            if (pst != null)
                pst.close();
            if (rs != null)
                rs.close();
        }

    执行sql方法

    public Boolean execute(String sql, String... params) {
            boolean bool = false;
            try {
                pst = conn.prepareStatement(sql);
                for (int i = 0; i < params.length; i++) {
                    pst.setString((i + 1), params[i]);
                }
                bool = pst.execute();
                this.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return bool;
        }

    查询返回一条数据

    public Map<String, Object> get(String sql, String... params)
                throws SQLException {
            pst = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pst.setString((i + 1), params[i]);
            }
            rs = pst.executeQuery();
            Map<String, Object> map = new HashMap<String, Object>();
            ResultSetMetaData rsmd = pst.getMetaData();
            int col = rsmd.getColumnCount();
            while (rs.next()) {
                for (int i = 1; i < col; i++) {
                    map.put(rsmd.getColumnName(i), rs.getObject(i));
                }
            }
            this.close();
            return map;
        }

    查询返回集合

    public List<Map<String, Object>> List(String sql, String... params)
                throws SQLException {
            pst = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pst.setString((i + 1), params[i]);
            }
            rs = pst.executeQuery();
            List<Map<String, Object>> rList = new ArrayList<Map<String, Object>>();
            Map<String, Object> map;
            ResultSetMetaData rsmd = pst.getMetaData();
            int col = rsmd.getColumnCount();
            while (rs.next()) {
                map = new HashMap<String, Object>();
                for (int i = 1; i < col; i++) {
                    map.put(rsmd.getColumnName(i), rs.getObject(i));
                }
                rList.add(map);
            }
            return rList;
        }

    我们常用返回的是实体,而不是map,所以使用了JSONArray

    不过这个需要引用很多jar

    分别是:

      json-lib-2.4-jdk15.jar

      ezmorph-1.0.6.jar

      commons-beanutils-1.8.3.jar

      commons-collections-3.2.1.jar

      commons-codec-1.6.jar  

      commons-io-2.2.jar

      commons-lang-2.6.jar

      commons-logging-1.1.1.jar

      这么一大堆jar是个什么鬼?现在可是轻量级服务,怎么能有这么多,,本人表示很烦,决定后面有时间写一个,不过这里就算了,以后再说吧(偷个懒....)

      

      单个查询

      

    public <T> T getEntity(String sql, Class<T> t) throws SQLException {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            Map<String, Object> map = get(sql);
            JSONArray jr = JSONArray.fromObject(map);
            @SuppressWarnings("unchecked")
            T result = (T) JSONArray.toCollection(jr, t);
            return result;
        }

     查询返回集合

    public <T> List<T> getList(String sql, Class<T> t) throws SQLException {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            List<Map<String, Object>> rList = List(sql);
            JSONArray jr = JSONArray.fromObject(rList);
            @SuppressWarnings("unchecked")
            List<T> resultList = (List<T>) JSONArray.toCollection(jr, t);
            return resultList;
        }

    这样写返回实体有2个限制:

      1.实体字段名必须与查询返回的字段名一致,否则无法赋值。

      2.只能查询当前实体

    果然还是只能自己写一个,思路也大概有了:

       1.给实体添加注解,通过反射找到实体字段名与数据库对应字段名,从而解决第一个问题。

       2.外键关联的字段可以通过查询的时候as 表名.列名 去解析赋值,解决第二个问题。

    嗯,就是这样。 

  • 相关阅读:
    python 生成随机数、生成 uuid
    python django 之 django自带的分页
    python django 之 django自定制分页
    禁止用户使用 sudo su 命令进入root 模式
    MySQL学习之路 一 : MySQL 5.7.19 源码安装
    Ubuntu 16.04 apt 国内源
    Python开发(三):字符编码,文件操作,函数
    如何装双系统详细步骤:以win10+centos为例
    中缀表达式转换成后缀表达式
    getch()、getche()和getchar()函数
  • 原文地址:https://www.cnblogs.com/fanmiao/p/6278173.html
Copyright © 2011-2022 走看看