zoukankan      html  css  js  c++  java
  • 通用的数据库数据操作类

    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;
        }
    
    }
    
  • 相关阅读:
    Effective Java 第三版——26. 不要使用原始类型
    Effective Java 第三版——25. 将源文件限制为单个顶级类
    Effective Java 第三版——24. 优先考虑静态成员类
    Effective Java 第三版——23. 优先使用类层次而不是标签类
    Effective Java 第三版——22. 接口仅用来定义类型
    Effective Java 第三版——21. 为后代设计接口
    Effective Java 第三版——20. 接口优于抽象类
    Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
    Effective Java 第三版——18. 组合优于继承
    Effective Java 第三版——17. 最小化可变性
  • 原文地址:https://www.cnblogs.com/lyang-a/p/15078767.html
Copyright © 2011-2022 走看看