BaseDAO

public abstract class BaseDao<T> {

    private Class<T> clazz = null;

    {
        //获取Base子类继承父类中的泛型
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;

        //
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        clazz = (Class<T>) actualTypeArguments[0];

    }

    /**
     * 实现增删改 :考虑到事务的关系,Connection,从外面传入
     *
     * @param conn
     * @param sql
     * @param args
     * @return 返回共执行了几次
     */
    public int update(Connection conn, String sql, Object... args) throws Exception {
        PreparedStatement ps = null;


        try {
            //1.获取预编译类
            ps = conn.prepareStatement(sql);
            //2.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            //3.执行sql 返回sql执行影响的行数 增删改, 如果是ddl 返回0
            return ps.executeUpdate();
            //ps.execute(); 判断是否生成结果集ResultSet
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //4.关闭资源 注意:这里不关闭连接,因为考虑事务的关系,在方法调用中关闭
            JDBCUtils.closeResource(null, ps);
        }
        return 0;
    }

    /**
     * 通用查询操作, 用于返回一条记录.(考虑上事务)
     *
     * @param conn
     * @param sql
     * @param args
     * @return 返回一条记录
     */
    public T getInstance(Connection conn, String sql, Object... args) throws Exception {

        PreparedStatement ps = null;
        try {
            //1.获取预编译类
            ps = conn.prepareStatement(sql);
            //2.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            //3.执行返回结果集
            ResultSet rs = ps.executeQuery();
            //4.获取结果集的元数据,遍历结果集,信息存入对应类的对象中
            ResultSetMetaData rsmd = rs.getMetaData();
            //4.1 获取列数
            int culumnCoutn = rsmd.getColumnCount();
            T t = clazz.newInstance();
            if (rs.next()) {
                for (int i = 0; i < culumnCoutn; i++) {
                    Object columnValue = rs.getObject(i);
                    //4.2 获取列别名
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    //4.3 反射获取对应属性类,然后赋值
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t, columnValue);
                }
                return t;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            JDBCUtils.closeResource(null, ps);
        }
        return null;

    }
}

    /**
     * 查询或许多条信息
     * @param conn 考虑事务原因,Connection从外部传入,并且不会关闭
     * @param sql
     * @param args
     * @return 返回查询多条信息
     */
    public List<T> getForList(Connection conn, String sql, Object... args) {

        List<T> list = new ArrayList<>();
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            //1.获取编译类
            ps = conn.prepareStatement(sql);

            //2.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            //3.执行返回结果集
            rs = ps.executeQuery();
            //4, 结果集的元数据
            ResultSetMetaData rsmd = rs.getMetaData();
            //4.1 列数
            int columnCount = rsmd.getColumnCount();
            while (rs.next()) {
                T t = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    //列的数据
                    Object columnValue = rs.getObject(i + 1);

                    //列的别名
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t, columnValue);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源 :注意不关闭连接
            JDBCUtils.closeResource(null,ps,rs);
        }
        return null;
    }

 /***
     * 查询特殊数据需求
     * @param conn
     * @param sql
     * @param args
     * @param <E>
     * @return 
     * @throws Exception
     */
    public<E> E getValue(Connection conn, String sql, Object... args) {

        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql);

            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            rs = ps.executeQuery();
            if (rs.next()) {
                Object object = rs.getObject(1);
                return (E) object;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.closeResource(null,ps,rs);
        }
        return null;//没有查到返回空
    }


版权声明:本文为Adam586007原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。