增删查改封装实现

package com.hd.dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
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.Jdbc.Tool.DbTool;
import com.hd.bean.JavaBean;

/**
 * 增删查改实现
 * 
 * @author 2017
 *
 */
public class basedao {

    /**
     * 查询query
     * 
     * @param <T>
     * 
     * @param sql
     * @param params
     * @return
     */
    // TODO 查询
    public static <T> List<T> query(String sql, Class<T> cls, Object... params) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<T> list = new ArrayList<T>();
        try {

            // 获取链接通道
            conn = DbTool.getConnection();
            // 到取sql语句到数据库中 获取到执行对象ps
            ps = conn.prepareStatement(sql);
            // 判断?是否为null
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            }
            // 执行sql语句
            rs = ps.executeQuery();
            // 遍历ResultSet集合
            while (rs.next()) {
                // 获取数据库集合对象
                ResultSetMetaData meta = rs.getMetaData();
                
                // 获取集合的所有列数
                int columnCount = meta.getColumnCount();
                
                // class对应的对象中必须有一个无参构造函数对象
                T obj = cls.newInstance();
                
                // 循环取出每一列的数据
                for (int i = 0; i < columnCount; i++) {
                    
                    // 根据列数获取每一列对应的名称(必须是小写)
                    String columnName = meta.getColumnName(i + 1).toLowerCase();
                    
                    // 根据每一列的对应名称获取value值
                    Object value = rs.getObject(columnName);

                    if (value == null) {
                        continue;
                    }
                    
                    // hasFile()来判断Javabean中的成员属性是否匹配oracle中的
                    if (hasFile(cls, columnName)) {
                        
                        // 获取当前对象中的列所对应的---成员属性对象
                        Field member = cls.getDeclaredField(columnName);
                        
                        // 设置成员属性的可访问
                        member.setAccessible(true);
                        
                        // 由于jdbc是用BigDecimal类型接受数据的
                        // 和javaBean的int类型不匹配,所有需要转型
                        // 判断value 值是否属于BigDecimal类型
                        if (value instanceof BigDecimal) {
                            // 如果属于BigDecimal类型的则强转为BigDecimal
                            BigDecimal valueB = (BigDecimal) value;
                            // 判断接受数据的成员属性是否是int类型的数据
                            if (member.getType().getName().equals("int")) {
                                // 将整形数据赋值给成员
                                member.set(obj, valueB.intValue());

                            } else {
                                // 将小数类型赋给成员
                                member.set(obj, valueB.doubleValue());

                            }

                        } else {
                            // 用成员属性对象把获取到的数据保存起来
                            member.set(obj, value);

                        }
                    }

                }
                list.add(obj);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DbTool.close(conn, ps, rs);
        }

        return null;
    }

    /**
     * 判断javaBean中的成员属性是否和 列数获取每一列对应的名称相同,相同则添加数据
     * 
     * @param cls
     * @param columnName
     * @return
     */
    // TODO 判断成员属性
    private static <T> Boolean hasFile(Class<T> cls, String columnName) {
        // 获取对象中所有的成员属性对象
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            if (field.getName().equals(columnName)) {
                return true;
            }
        }
        return false;

    }

    /**
     * 更新
     * 
     * @param <T>
     * 
     * @param sql
     * @param params
     */
    // TODO 更新
    public static <T> void Update(String sql,Object... params) {
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            // 获取链接通道
            conn = DbTool.getConnection();
            if (sql != null) {
                // 到取sql语句到数据库中 获取到执行对象ps
                ps = conn.prepareStatement(sql);
                if (params != null) {
                    for (int s = 0; s < params.length; s++) {
                        ps.setObject(s + 1, params[s]);
                    }
                }
                int len = ps.executeUpdate();
                System.out.println("改变的行数为" + len + "行");
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DbTool.close(conn, ps);
        }

    }

    /**
     * 增加insert
     * 
     * @param <T>
     */
    // TODO 增加
    public static <T> void insert(String sql,Object... params) {
        // 为释放资源准备
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            // 获取连接通道对象
            conn = DbTool.getConnection();
            // 执行sql语句
            ps = conn.prepareStatement(sql);
            // 把params拼接入sql语句
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            }
            // 用JavaBean获取数据
            int indexOf = sql.indexOf("(");
            System.out.println(indexOf);
            int len = ps.executeUpdate();
            System.out.println("改变的行数为" + len + "行");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            DbTool.close(conn, ps);
        }
    }
    /**
     * 删除delete
     */
    //TODO 删除delete
    public static <T> void delete(String sql,Object... params) {
        // 为释放资源准备
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            // 获取连接通道对象
            conn = DbTool.getConnection();
            // 执行sql语句
            ps = conn.prepareStatement(sql);
            // 把params拼接入sql语句
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            }
            // 用JavaBean获取数据

            int len = ps.executeUpdate();
            System.out.println("改变的行数为" + len + "行");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            DbTool.close(conn, ps);
        }
    }
}

 

posted @ 2017-08-07 21:23  洛迪  阅读(215)  评论(0)    收藏  举报