zoukankan      html  css  js  c++  java
  • Java基础之原生JDBC操作数据库

      前言

      日常开发中,我们都习惯了使用ORM框架来帮我们操作数据库,本文复习、记录Java如何使用原生JDBC操作数据库

      代码编写

      封装几个简单方法

        find查询方法

        findOne查询方法

        execute执行方法

    package cn.huanzi.qch.util;
    
    import cn.hutool.core.date.DateUtil;
    import cn.hutool.core.date.TimeInterval;
    import cn.hutool.json.JSONArray;
    import cn.hutool.json.JSONObject;
    import cn.hutool.json.JSONUtil;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    /**
     * 原生jdbc操作数据库工具类
     */
    public class DbUtil {
    
        //数据库连接:地址、用户名、密码
        private final String url;
        private final String username;
        private final String password;
    
        //Connection连接实例
        private Connection connection;
    
        public DbUtil(String url, String username, String password){
            this.url = url;
            this.username = username;
            this.password = password;
        }
        public DbUtil(String url, String username, String password, String driver){
            this(url,username,password);
    
            //加载驱动
            try {
                /*
                    同时需要引入相关驱动依赖
    
                    1、MySQL:
                    com.mysql.cj.jdbc.Driver
    
                    2、Oracle:
                    oracle.jdbc.driver.OracleDriver
    
                    3、pgsql:
                    org.postgresql.Driver
    
                 */
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取 Connection 连接
         */
        private Connection getConnection() {
            if(connection == null){
                try {
                    connection= DriverManager.getConnection(url, username, password);
                    connection.setAutoCommit(true);
                } catch (SQLException e) {
                    System.err.println("获取Connection连接异常...");
                    e.printStackTrace();
                }
            }
            return connection;
        }
    
        /**
         * 设置是否自动提交事务
         * 当需要进行批量带事务的操作时,关闭自动提交手动管理事务,将会大大提高效率!
         */
        private void setAutoCommit(boolean autoCommit){
            try {
                this.getConnection().setAutoCommit(autoCommit);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 关闭自动提交事务时,需要手动管理事务提交、回滚
         */
        private void commit(){
            try {
                this.getConnection().commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        private void rollback(){
            try {
                this.getConnection().rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 关闭 Connection 连接
         */
        private void close(){
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    System.err.println("关闭Connection连接异常...");
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 查询
         * 查询语句
         */
        public ArrayList<HashMap<String,Object>> find(String sql, Object[] params) {
            ArrayList<HashMap<String, Object>> list = new ArrayList<>();
    
            //获取连接
            Connection conn = this.getConnection();
            PreparedStatement ps;
            ResultSet rs;
    
            try {
                //设置SQL、以及参数
                ps = conn.prepareStatement(sql);
                if (params != null) {
                    for (int i = 0; i < params.length; i++) {
                        ps.setObject(i + 1, params[i]);
                    }
                }
    
                //执行查询
                rs = ps.executeQuery();
    
                //获取查询结果
                ResultSetMetaData rm = rs.getMetaData();
                int columnCount = rm.getColumnCount();
    
                //封装结果集
                while (rs.next()) {
                    HashMap<String, Object> map = new HashMap<>(columnCount);
                    for (int i = 1; i <= columnCount; i++) {
                        String name = rm.getColumnName(i).toLowerCase();
                        Object value = rs.getObject(i);
    
                        map.put(name,value);
                    }
                    list.add(map);
                }
    
            } catch (Exception e) {
                System.err.println("执行 jdbcUtil.find() 异常...");
                e.printStackTrace();
            }
    
            return list;
        }
        public HashMap<String,Object> findOne(String sql, Object[] params){
            ArrayList<HashMap<String, Object>> list = this.find(sql, params);
            return list.size() > 0 ? list.get(0) : null;
        }
        public ArrayList<HashMap<String,Object>> find(String sql) {
            return this.find(sql,null);
        }
        public HashMap<String,Object> findOne(String sql) {
            return this.findOne(sql,null);
        }
    
        /**
         * 执行
         * 新增/删除/更新 等SQL语句
         */
        private boolean execute(String sql, Object[] params){
            boolean flag = false;
    
            //获取连接
            Connection conn = this.getConnection();
            PreparedStatement ps;
    
            try {
                //设置SQL、以及参数
                ps = conn.prepareStatement(sql);
                if (params != null) {
                    for (int i = 0; i < params.length; i++) {
                        ps.setObject(i + 1, params[i]);
                    }
                }
    
                //执行
                flag = ps.execute();
            } catch (SQLException e) {
                System.err.println("执行 jdbcUtil.update() 异常...");
                e.printStackTrace();
            }
    
            return flag;
        }
        private boolean execute(String sql){
            return this.execute(sql,null);
        }
    }

      效果

      运行main函数

        public static void main(String[] args) {
            //获取实例
            DbUtil dbUtil = new DbUtil("jdbc:mysql://localhost/jfinal_demo","root","123456");
    
            // find查询
            ArrayList<HashMap<String, Object>> list = dbUtil.find("select * from user");
            for (HashMap<String, Object> map : list) {
                System.out.println(map);
            }
    
            System.out.println("----------------------------");
    
            //execute执行、findOne查询
            dbUtil.execute("delete from user where user_id = ?", new Object[]{"4"});
            dbUtil.execute("insert into user values (?,?)", new Object[]{"4","王麻子"});
            dbUtil.execute("update user set user_name = ? where user_id = ?", new Object[]{"王麻子子","4"});
    
            HashMap<String, Object> map = dbUtil.findOne("select * from user where user_id = ?", new Object[]{"4"});
            System.out.println(map);
    
            //关闭连接
            dbUtil.close();
        }

      后记

      原生JDBC操作数据库暂时先记录到这,后续再进行补充

      PS:当需要进行批量带事务的操作时,将自动提交改成false,然后手动管理,将会大大提高效率!

    版权声明

    作者:huanzi-qch
    若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

    AD广告位(长期招租,如有需要请私信)

    【基塔后台】免费后台管理系统,低代码快速搭建管理后台

    【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元!
    【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!
    【腾讯云】星星海SA2云服务器,1核2G首年99元起,高性价比首选!
    【腾讯云】中小企业福利专场,多款刚需产品,满足企业通用场景需求,云服务器2.5折起!

    【阿里云】新老用户同享,上云优化聚集地!
    【阿里云】最新活动页,上新必买抢先知,劲爆优惠不错过!
    【阿里云】轻量应用服务器2核2G 低至60元/年起!香港与海外服务器最低24元/月起!
    【阿里云】ECS实例升级、续费,享低至 6.3折 限时折扣!

    捐献、打赏

    请注意:作者五行缺钱,如果喜欢这篇文章,请随意打赏!

    支付宝

    微信


    QQ群交流群

    QQ群交流群
    有事请加群,有问题进群大家一起交流!

  • 相关阅读:
    jquery获取浏览器URL参数
    jquery获取、设置、删除cookie
    jquery获取当前按钮、截取字符串、字符串拼接、动态循环添加元素
    Callback函数
    window.opener和window.open的使用
    JavaScript内置对象
    SeaJS:一个适用于 Web 浏览器端的模块加载器
    hihocoder 1388 &&2016 ACM/ICPC Asia Regional Beijing Online Periodic Signal
    Codeforces Round #373 (Div. 2)
    fzu 1759Super A^B mod C 指数循环节
  • 原文地址:https://www.cnblogs.com/huanzi-qch/p/15474928.html
Copyright © 2011-2022 走看看