• 通用的数据库数据操作类


    package com.lyang.dao;
    
    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.lyang.util.PageInfo;
    import com.lyang.util.JdbcUtil;
    
    /**
     * 通用的数据库数据操作类
     */
    public class BaseDao {
    
        /**
         * 通用查询数据列表
         * @param <T>   具体的类
         * @param sql   sql指令
         * @param cls   反射类
         * @param param 参数
         * @return
         */
        public <T> List<T> selectList(String sql, Class<T> cls, Object... param) {
            Connection conn = JdbcUtil.getConn();
            PreparedStatement prep = null;
            ResultSet rs = null;
            List<T> data = new ArrayList<T>();
            try {
                prep = conn.prepareStatement(sql);
                //循环设置参数
                for (int i = 0; i < param.length; i++) {
                    prep.setObject(i + 1, param[i]);
                }
                //查询结果
                rs = prep.executeQuery();
                while (rs.next()) {
                    T bean = rsToBean(rs, cls);
                    data.add(bean);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, prep, rs);
            }
            return data;
        }
    
        /**
         * 查询一条数据
         * @param <T>   具体的类
         * @param sql   sql指令
         * @param cls   反射类
         * @param param 参数
         * @return
         */
        public <T> T selectOne(String sql, Class<T> cls, Object... param) {
            List<T> list = this.selectList(sql, cls, param);
            if (!list.isEmpty() && list.size() == 1) {
                return list.get(0);
            }
            return null;
        }
    
        /**
         * 将ResultSet 转化为任意对应的JavaBean
         * @param <T> 具体的类
         * @param rs  结果集
         * @param cls 反射类
         * @return
         */
        public <T> T rsToBean(ResultSet rs, Class<T> cls) {
            T t = null;
            try {
                t = cls.newInstance();
                // 获取查询结果的元数据
                ResultSetMetaData metaData = rs.getMetaData();
                // 获取列的个数 查询结果的列的个数
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    // 获取列名称
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    // 获取该列对应的值
                    Object value = rs.getObject(columnLabel);
                    // 根据结果列名称 查找对应属性
                    Field field = cls.getDeclaredField(columnLabel);
                    // 设置权限,因为属性都为私有的,无法直接获取
                    field.setAccessible(true);
                    // 为属性设置值
                    field.set(t, value);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return t;
        }
    
        /**
         * 通用删除
         * @param sql sql指令
         * @return
         */
        public boolean deleteById(String sql) {
            Connection conn = JdbcUtil.getConn();
            PreparedStatement prep = null;
            try {
                prep = conn.prepareStatement(sql);
                int m = prep.executeUpdate();
                return m == 1 ? true : false;
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, prep);
            }
            return false;
        }
    
        /**
         * 向表插入数据 返回 自增涨主键值
         * @param sql   sql指令
         * @param param 参数
         * @return
         */
        public int insert(String sql, Object... param) {
            Connection conn = JdbcUtil.getConn();
            PreparedStatement prep = null;
            ResultSet rs = null;
            try {
                // PreparedStatement.RETURN_GENERATED_KEYS:返回生成的key
                prep = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
                for (int i = 0; i < param.length; i++) {
                    prep.setObject(i + 1, param[i]);
                }
                prep.executeUpdate();
                // 生成的主键
                rs = prep.getGeneratedKeys();
                if (rs != null) {
                    rs.next();
                    return rs.getInt(1);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, prep);
            }
            return 0;
        }
    
        /**
         * 通用更新
         * @param sql   sql指令
         * @param param 参数
         * @return
         */
        public boolean update(String sql, Object... param) {
            Connection conn = JdbcUtil.getConn();
            PreparedStatement prep = null;
            try {
                prep = conn.prepareStatement(sql);
                for (int i = 0; i < param.length; i++) {
                    prep.setObject(i + 1, param[i]);
                }
                int m = prep.executeUpdate();
                return m > 0 ? true : false;
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, prep);
            }
            return false;
        }
    
        /**
         * 分页查询
         * @param <T>   具体的类
         * @param sql   sql指令
         * @param page  页码
         * @param limit 每页条数
         * @param cls   反射类
         * @return
         */
        public <T> PageInfo<T> selectPage(String sql, Integer page, Integer limit, Class<T> cls) {
            // 总行数
            int total = this.selectCount(sql);
            // 最大页码
            int maxPage = total % limit == 0 ? total / limit : total / limit + 1;
    
            // 如果page比最大页码大  则值为最大页码
            if (page > maxPage) {
                page = maxPage;
            }
            // 如果page值小于1  则为1
            if (page < 1) {
                page = 1;
            }
            int startIndex = (page - 1) * limit;
            sql = sql + "  limit " + startIndex + "," + limit;
            // 查询数据
            List<T> data = this.selectList(sql, cls);
    
            PageInfo<T> pageInfo = new PageInfo<T>(page, limit, total, maxPage, data);
            return pageInfo;
        }
    
        /**
         * 符合条件的总行数
         * @param sql sql指令
         * @return
         */
        private int selectCount(String sql) {
            sql = "select count(1) from (" + sql + ") as rs";
            Connection conn = JdbcUtil.getConn();
            PreparedStatement prep = null;
            ResultSet rs = null;
            try {
                prep = conn.prepareStatement(sql);
                rs = prep.executeQuery();
                rs.next();
                return rs.getInt(1);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, prep, rs);
            }
            return 0;
        }
    
    }
    
  • 相关阅读:
    单链表的逆转
    树的子结构和树的深度
    升级版爬楼梯问题
    蛇形数组
    正则表达式匹配
    构建乘积数组
    N皇后问题
    IOS计算文字高度
    Block的copy时机
    转:CocoaPods pod install/pod update更新慢的问题
  • 原文地址:https://www.cnblogs.com/lyang-a/p/15078767.html
Copyright © 2020-2023  润新知