封装JDBC通用的工具类

目录

一、我们先看昨天写代码的问题

二 、封装

2.1 抽出重复代码         第1、2、5步重复,把这些封装起来

2.2 抽出公共属性

2.3 加载驱动放入static块中,提高性能

2.4 获取连接

2.5 释放资源

 三、通用的更新方法(增删改)方法

        3.1 可变参数

        3.2 增删改的方法

四、通过查询  查询唯一一行的记录

五、通过查询 查询多行记录

六、通过查询的唯一一行记录返回Map

七、通用的查询多行记录返回Map List


一、我们先看昨天写代码的问题

                出现了大量的重复代码  而且还没办法调用

二 、封装

2.1 抽出重复代码         第1、2、5步重复,把这些封装起来

把这些封装成两个方法一个获取连接、一个关闭连接

2.2 抽出公共属性

//连接字符串
    private final static String URL = "jdbc:mysql://localhost:3306/dept";
    private final static String USER = "root";
    private final static String PASSWORD = "123456";

2.3 加载驱动放入static块中,提高性能

//在类加载时就执行且只会执行一次
    static {
        //1. 加载驱动
        //方法的参数是驱动jar包中一个驱动类的全名
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

2.4 获取连接

/**
     * 获取连接
     * @return conn 连接对象,如果有错误返回null
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            //没有异常返回连接对象
            return conn;
        } catch (SQLException exception) {
            exception.printStackTrace();
        }
        //出异常后,还是null
        return conn;
    }

2.5 释放资源

 /**
     * 释放资源
     * @param rs 结果集
     * @param st Statement对象
     * @param conn 连接对象
     */
    public static void closeAll(ResultSet rs, Statement st,Connection conn){
        try {
            if(rs != null){
                rs.close();
            }

            if(st != null){
                st.close();
            }

            if(conn != null){
                conn.close();
            }

        } catch (SQLException exception) {
            exception.printStackTrace();
        }
    }

 三、通用的更新方法(增删改)方法

        3.1 可变参数

   //可变参数
    public static int sum(int ... a){
        //现在这个a是一个数组类型
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            int e = a[i];
            sum += e;
        }
        return sum;
    }

        3.2 增删改的方法

/**
     * 通用的更新方法
     * @param sql 带占位符的SQL语句
     * @param objects 占位符的参数
     * @return 受影响的行数
     */
    public static int update(String sql,Object ... objects){
        ResultSet rs = null;
        PreparedStatement pst = null;
        Connection conn = null;
        int rows = 0;
        try{
            conn = getConnection();
            pst = conn.prepareStatement(sql);
            //给占位符赋值
            if(objects != null && objects.length > 0){
                for (int i = 0; i < objects.length; i++) {
                    Object obj = objects[i];
                    //i最小0,而占位符最小索引是1
                    pst.setObject(i+1, obj);
                }
            }

            //执行
            rows = pst.executeUpdate();
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            closeAll(rs, pst, conn);
        }
        return rows;
    }

四、通过查询  查询唯一一行的记录

/**
     * 查询单列的方法
     * @param sql
     * @param objects
     * @return
     */
    public static ArrayList<Object> queryForOne(String sql, Object ... objects) {
        ResultSet rs=null;
        PreparedStatement ps=null;
        Connection conn=null;
        ArrayList<Object> list = new ArrayList<>();
        try {
            conn=getConnection();
            ps = conn.prepareStatement(sql);
            //给占位符赋值
            if (objects!=null && objects.length>0){
                for (int i = 0; i < objects.length; i++) {
                    Object obj=objects[i];
                    //i最小是0  而parameterIndex最小是1
                    ps.setObject(i+1,obj);
                }
            }
            //执行
            rs= ps.executeQuery();
            if (rs.next()){
                //一行,取列值,取多少列
                ResultSetMetaData metaData = rs.getMetaData();
                //结果集中列的数量
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    list.add(rs.getObject(i+1));
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            closeAll(rs,ps,conn);
        }
        return list;
    }

五、通过查询 查询多行记录

/**
     * 查询多行的方法
     * @param sql
     * @param objects
     * @return
     */
    public static List<ArrayList<Object>> queryForList(String sql, Object ... objects) {
        ResultSet rs=null;
        PreparedStatement ps=null;
        Connection conn=null;
        List<ArrayList<Object>> lists = new ArrayList<>();
        try {
            conn=getConnection();
            ps = conn.prepareStatement(sql);
            //给占位符赋值
            if (objects!=null && objects.length>0){
                for (int i = 0; i < objects.length; i++) {
                    Object obj=objects[i];
                    //i最小是0  而parameterIndex最小是1
                    ps.setObject(i+1,obj);
                }
            }
            //执行
            rs= ps.executeQuery();
            //结果集中有列数,列名
            ResultSetMetaData metaData = rs.getMetaData();
            //结果集中列的数量
            int columnCount = metaData.getColumnCount();
            while (rs.next()){
                //一行,取列值,取多少列
                //每一行创建新的List
                ArrayList<Object> list = new ArrayList<>();
                for (int i = 0; i < columnCount; i++) {
                   list.add(rs.getObject(i+1));
                }
                //把这一行的List值放到大的lists中
                lists.add(list);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            closeAll(rs,ps,conn);
        }
        return lists;
    }

六、通过查询的唯一一行记录返回Map

   public static Map<String,Object> queryOneForMap(String sql,Object ... objects){
        ResultSet rs = null;
        PreparedStatement pst = null;
        Connection conn = null;
        Map<String,Object> map = new HashMap<>();
        try{
            conn = getConnection();
            pst = conn.prepareStatement(sql);
            //给占位符赋值
            if(objects != null && objects.length > 0) {
                for (int i = 0; i < objects.length; i++) {
                    Object obj = objects[i];
                    //i最小0,而parameterIndex最小是1
                    pst.setObject(i+1, obj);
                }
            }
            //执行
            rs = pst.executeQuery();
            if(rs.next()){
                //一行,取列值。有哪些列,列名是什么?
                //描述结果集:结果集中有列数,列名
                ResultSetMetaData metaData = rs.getMetaData();
                //结果集中的列的数量
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    //获取列名
                    String columnName = metaData.getColumnName(i + 1);
                    //map的key是列名,value是列值
                    map.put(columnName, rs.getObject(columnName));
                }
            }
         } catch (Exception e){
            e.printStackTrace();
        } finally {
            closeAll(rs, pst, conn);
        }
        return map;
    }

七、通用的查询多行记录返回Map List

public static List<Map<String,Object>> queryForMapList(String sql,Object ... objects){
        ResultSet rs = null;
        PreparedStatement pst = null;
        Connection conn = null;
        List<Map<String,Object>> mapList = new ArrayList<>();
        try{
            conn = getConnection();
            pst = conn.prepareStatement(sql);
            //给占位符赋值
            if(objects != null && objects.length > 0) {
                for (int i = 0; i < objects.length; i++) {
                    Object obj = objects[i];
                    //i最小0,而parameterIndex最小是1
                    pst.setObject(i+1, obj);
                }
            }
            //执行
            rs = pst.executeQuery();
            //一行,取列值。有哪些列,列名是什么?
            //描述结果集:结果集中有列数,列名
            ResultSetMetaData metaData = rs.getMetaData();
            //结果集中的列的数量
            int columnCount = metaData.getColumnCount();
             while(rs.next()){
                //为了保存一行
                Map<String,Object> rowMap = new HashMap<>();
                //遍历所有列
                for (int i = 0; i < columnCount; i++) {
                    //取得一个列名
                    String columnName = metaData.getColumnName(i + 1);
                    rowMap.put(columnName, rs.getObject(columnName));
                }

                mapList.add(rowMap);
            }

        } catch (Exception e){
            e.printStackTrace();
        } finally {
            closeAll(rs, pst, conn);
        }
        return mapList;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值