zoukankan      html  css  js  c++  java
  • Java jdbc 连接数据库、通用增删改查、事务回滚

    1.先下载mysql-connector-java-5.1.40.jar包;

    2.写代码;

    获取数据库连接、通用查询和同意增删改代码:

        public static Connection getConnection() {
            Connection con = null;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                System.out.println("数据库驱动加载成功");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try {
                con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/maxinhai?characterEncoding=UTF-8",
                        "maxinhai", "maxinhai");
                System.out.println("数据库连接成功");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return con;
        }
    
        /**
         * 执行增加、删除、修改 sql操作
         * 
         * @auther maxinhai
         * @param con 连接对象
         * @param sql 增加、删除、修改sql语句
         * @param params 条件参数
         * @return 查询结果
         */
        public static int executeUpdate(Connection con, String sql, List<Object> params) {
            int num = 0;
            PreparedStatement ps = null;
            try {
                // 预处理对象
                System.out.println(sql);
                ps = con.prepareStatement(sql);
                // 填充参数
                if (params.size() > 0) {
                    for (int i = 0; i < params.size(); i++) {
                        ps.setObject(i + 1, params.get(i));
                    }
                }
                // 执行sql
                num = ps.executeUpdate();
                System.out.println("影响了" + num + "条信息");
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (ps != null)
                        ps.close();
                    if (con != null)
                        con.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return num;
        }
    
        /**
         * 执行查询语句
         * 
         * @auther maxinhai
         * @param con 连接对象
         * @param querySql 查询语句
         * @param params 查询条件参数
         * @return 查询结果
         */
        public static List<Map<String, Object>> executeQuery(Connection con, String querySql, List<Object> params) {
            List<Map<String, Object>> table = null;
            PreparedStatement ps = null;
            ResultSet queryResult = null;
            try {
                // 获取预处理对象
                ps = con.prepareStatement(querySql);
                // 填充参数
                if (params != null && params.size() > 0) {
                    for (int i = 0; i < params.size(); i++) {
                        ps.setObject(i + 1, params.get(i));
                    }
                }
                // 执行查询
                queryResult = ps.executeQuery();
                // 获取键名
                ResultSetMetaData md = queryResult.getMetaData();
                // 获取行的数量
                int columnCount = md.getColumnCount();
                table = new ArrayList();
                while (queryResult.next()) {
                    // 链表保证顺序
                    Map<String, Object> rowData = new LinkedHashMap<>();
                    for (int i = 1; i <= columnCount; i++) {
                        // 获取键名及值
                        rowData.put(md.getColumnName(i), queryResult.getObject(i));
                    }
                    table.add(rowData);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (ps != null)
                        ps.close();
                    if (con != null)
                        con.close();
                    if (queryResult != null)
                        queryResult.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return table;
        }

    测试代码:

        public static void main(String[] args) throws InterruptedException {
    
            Connection connect = getConnection();
            String sql = "select * from user_info where name=?";
            List<Object> params = new ArrayList<>(1);
            params.add("tom");
            List<Map<String, Object>> result = executeQuery(connect, sql, params);
    
            if (result.size() == 1) {
                result.get(0).forEach((k, v) -> {
                    System.out.print(k + "=>" + v + "	");
                });
            } else {
                result.forEach(item -> {
                    item.forEach((k, v) -> {
                        System.out.print(k + "=>" + v + "	");
                    });
                    System.out.println();
                });
            }
            
            connect = getConnection();
            String insert = "insert into user_info(name,sex,age,address) values(?,?,?,?)";
            List<Object> paramList = new ArrayList<>(4);
            paramList.add("maxinhai");
            paramList.add(1);
            paramList.add(12);
            paramList.add(1);
            int count = executeUpdate(connect, insert, paramList);
            
        }

    事务回滚代码:

        /**
         * jdbc事务
         * @throws SQLException 
         * @throws InterruptedException 
         */
        public static void transaction() throws SQLException, InterruptedException {
            Connection connect = getConnection();
            //关闭自动提交事务
            connect.setAutoCommit(false);
            int flag = 0;
            
            String insert1 = "insert into user_school(school_id,school_name,school_address,school_type) values(?,?,?,?)";
            List<Object> params = new ArrayList<>(4);
            params.add(5003);
            params.add("清华大学");
            params.add("中关村");
            params.add("本科");
            try {
                int i = 100/0; //报错
                executeUpdate(connect, insert1, params);
            } catch (Exception e) {
                System.out.println("执行" + insert1 + "语句出错,回滚事务");
                flag++;
            } 
            
            Thread.sleep(3000);
            
            String insert2 = "insert into user_info(name,sex,age,address,school1) values(?,?,?,?,?)";
            List<Object> paramList = new ArrayList<>(5);
            paramList.add("666先生的救赎");
            paramList.add(1);
            paramList.add(12);
            paramList.add(1);
            paramList.add(5002);
            try {
                executeUpdate(connect, insert2, paramList);
            } catch (Exception e) {
                System.out.println("执行" + insert2 + "语句出错,回滚事务");
                flag++;
            }
            
            if(flag > 0) {
                System.out.println("事务管理: 两个事务都会滚");
                connect.rollback();
            }
            connect.commit();
            connect.close();
        }

    上面事务代码是调用通用增删改代码实现的,需要把通用代码里的关闭数据库连接代码注释掉,事务需要在同一个数据库连接里实现;

  • 相关阅读:
    【个人杂谈】MacBook Pro的使用心得
    【网页加速】lua redis的二次升级
    使用Openresty加快网页速度
    中间件——canal小记
    Java面试总结(二)
    RedissonLock分布式锁源码分析
    面试总结
    Spring AOP小记
    谈谈个人网站的建立(八)—— 缓存的使用
    Kafka、Logstash、Nginx日志收集入门
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12943876.html
Copyright © 2011-2022 走看看