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 表名.列名 去解析赋值,解决第二个问题。

    嗯,就是这样。 

  • 相关阅读:
    [BJOI2019] 光线
    C# 从零开始写 SharpDx 应用 笔刷
    BAT 脚本判断当前系统是 x86 还是 x64 系统
    BAT 脚本判断当前系统是 x86 还是 x64 系统
    win2d 通过 CanvasActiveLayer 画出透明度和裁剪
    win2d 通过 CanvasActiveLayer 画出透明度和裁剪
    PowerShell 拿到显卡信息
    PowerShell 拿到显卡信息
    win10 uwp 如何使用DataTemplate
    win10 uwp 如何使用DataTemplate
  • 原文地址:https://www.cnblogs.com/fanmiao/p/6278173.html
Copyright © 2011-2022 走看看