• Java学习笔记49(DBUtils工具类二)


    上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类

    这里使用commons-dbutils-1.6.jar

    事务的简单介绍:

    在数据库中应用事务处理案例:转账案例

    张三和李四都有有自己的存款

    主键  帐户名  余额

    1    张三   1000

    2    李四   10

    要从张三的账户余额中转账800到李四账户

    SQL语句实现:

    update xx set 余额 = 余额-800 where 主键=1

    update xx set 余额 = 余额+800 where 主键=2

    虽然操作成功,但是会出现问题,如果张三余额不足800,那么转账结束后余额是负数,显然有问题

    而数据库本身不会判断是否为负数

    所以数据库就将这两个操作包装成一个事务,执行结果有两种,成功或者失败,不可以分开执行

    执行成功称:提交事务,执行失败称:回滚事务

    对数据表的操作:

    表的创建:

    CREATE TABLE sort(
      sid INT PRIMARY KEY AUTO_INCREMENT,
      sname VARCHAR(100),
      sprice DOUBLE,
      sdesc VARCHAR(5000)
    );

    QueryRunner类的方法实现表的增删改:

    package demo;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import org.apache.commons.dbutils.DbUtils;
    import org.apache.commons.dbutils.QueryRunner;
    
    public class QueryRunnerDemo {
        private static Connection con = JDBCUtils.getConnection();
    
        public static void main(String[] args) throws SQLException {
            // 这三个方法不能同时执行,测试时候应该注释掉不使用的
            // 因为每一个方法最后都关闭了数据库连接
            // insert();
            // update();
            delete();
        }
    
        public static void insert() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)";
            Object[] params = { "篮球", 266, "体育用品" };
            int row = qr.update(JDBCUtils.getConnection(), sql, params);
            System.out.println(row);
            DbUtils.closeQuietly(con);
        }
    
        public static void update() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
            Object[] params = { "足球", 255, "出售足球", 8 };
            int row = qr.update(con, sql, params);
            System.out.println(row);
            DbUtils.closeQuietly(con);
        }
    
        public static void delete() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "DELETE FROM sort WHERE sid=?";
            int row = qr.update(con, sql, 8);
            System.out.println(row);
            DbUtils.closeQuietly(con);
        }
    }
    
    // 三种方法如果输出1表示执行成功,输出0表示执行失败

    自定义的工具:

    package demo;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Properties;
    
    public class JDBCUtils {
        private static Connection con;
        private static String driverClass;
        private static String url;
        private static String username;
        private static String password;
    
        static {
            try {
                readConfig();
                Class.forName(driverClass);
                con = DriverManager.getConnection(url, username, password);
            } catch (Exception ex) {
                throw new RuntimeException("数据库连接失败");
            }
        }
    
        private static void readConfig() throws Exception {
            InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
            Properties pro = new Properties();
            pro.load(in);
            driverClass = pro.getProperty("driverClass");
            url = pro.getProperty("url");
            username = pro.getProperty("username");
            password = pro.getProperty("password");
        }
    
        public static Connection getConnection() {
            return con;
        }
    
    }

    配置文件:database.properties

    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybase
    username=root
    password=xuyiqing

    QueryRunner类查询:

    这里有多种结果集的处理方式:

    package demo;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ArrayHandler;
    import org.apache.commons.dbutils.handlers.ArrayListHandler;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.MapHandler;
    import org.apache.commons.dbutils.handlers.MapListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    public class QueryRunnerDemo {
        private static Connection con = JDBCUtils.getConnection();
    
        public static void main(String[] args) throws SQLException {
            arrayHandler();
            arrayListHandler();
            beanHandler();
            beanListHandler();
            scalarHandler();
            mapHandler();
            mapListHandler();
        }
    
        public static void arrayHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT * FROM sort";
            Object[] result = qr.query(con, sql, new ArrayHandler());
            for (Object obj : result) {
                System.out.print(obj + "	");
            }
            // 打印第一行的数据
        }
    
        public static void arrayListHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT * FROM sort";
            List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
            for (Object[] objs : result) {
                for (Object obj : objs) {
                    System.out.print(obj + "	");
                }
                System.out.println();
            }
            // 打印了全部的数据
        }
    
        public static void beanHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT * FROM sort";
            Sort sort = qr.query(con, sql, new BeanHandler<Sort>(Sort.class));
            System.out.println(sort);
            // 第一行的数据变成sort对象,打印对象的toString方法
            // 这种方法需要特别注意:sort类中必须有空参构造器
        }
    
        public static void beanListHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT * FROM sort";
            List<Sort> list = qr.query(con, sql, new BeanListHandler<Sort>(Sort.class));
            for (Sort s : list) {
                System.out.println(s);
            }
            // 所有数据变成sort对象,装入list集合,打印出多个对象
        }
    
        public static void scalarHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT COUNT(*) FROM sort";
            long count = qr.query(con, sql, new ScalarHandler<Long>());
            System.out.println(count);
            // 适合于处理单结果集
        }
    
        public static void mapHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT * FROM sort";
            Map<String, Object> map = qr.query(con, sql, new MapHandler());
            for (String key : map.keySet()) {
                System.out.println(key + "	" + map.get(key));
            }
            // 打印第一行数据,键值对
        }
    
        public static void mapListHandler() throws SQLException {
            QueryRunner qr = new QueryRunner();
            String sql = "SELECT * FROM sort";
            List<Map<String, Object>> list = qr.query(con, sql, new MapListHandler());
            for (Map<String, Object> map : list) {
                for (String key : map.keySet()) {
                    System.out.println(key + "	" + map.get(key));
                }
            }
            // 所有数据转成map集合,再存入List集合
        }
    }

    附加:

    这里用到了和表名一致的一个自定义类,sort类:

    package demo;
    
    public class Sort {
        private int sid;
        private String sname;
        private double sprice;
        private String sdesc;
    
        public Sort(int sid, String sname, double sprice, String sdesc) {
            this.sid = sid;
            this.sname = sname;
            this.sprice = sprice;
            this.sdesc = sdesc;
        }
    
        public Sort() {
        }
    
        public int getSid() {
            return sid;
        }
    
        public void setSid(int sid) {
            this.sid = sid;
        }
    
        public String getSname() {
            return sname;
        }
    
        public void setSname(String sname) {
            this.sname = sname;
        }
    
        public double getSprice() {
            return sprice;
        }
    
        public void setSprice(double sprice) {
            this.sprice = sprice;
        }
    
        public String getSdesc() {
            return sdesc;
        }
    
        public void setSdesc(String sdesc) {
            this.sdesc = sdesc;
        }
    
        @Override
        public String toString() {
            return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
        }
    
    }
  • 相关阅读:
    程序员的自我救赎---1.4.3: 核心框架讲解(MVC)
    程序员的自我救赎---1.4.2: 核心框架讲解(BLL&Tool)
    程序员的自我救赎---1.4.1:核心框架讲解(DAL)
    程序员的自我救赎---1.3:事务的使用
    【零基础】极星9.5量化入门一:自定义套利的K线绘制
    【零基础】神经网络实践:BeatSaber粪谱生成器(使用方法篇)
    【零基础】使用Tensorflow实现神经网络
    【零基础】神经网络优化之Adam
    【零基础】神经网络优化之动量梯度下降
    【零基础】神经网络优化之mini-batch
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8325690.html
Copyright © 2020-2023  润新知