JDBC之BaseJDBC和CRUDDAO的写法

BASEJDBC

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Driver;

public class BaseJDBC {

    // 表示你要操作的是哪种类型的数据库
    private final String DRIVER = "com.mysql.jdbc.Driver";
    // 表示你要连接的是哪一台电脑的服务器端口号是多少数据库的名字是什么
    private final String URL = "jdbc:mysql://localhost:3306/zzy";//有时这里需要加上字符集
    // 登录数据库的用户名
    private final String USERNMAE = "root";
    // 登录数据库的密码
    private final String PASSWORD = "root";

    /**
     * 注册驱动 获取连接
     * 
     * @return
     */
    public Connection getConnection() {
        try {
            //Driver d=new Driver();
            // 注册驱动:反射(是一项很高深的技术)
            Class.forName(DRIVER);
            // 由连接大管家创建连接对象
            return DriverManager.getConnection(URL, USERNMAE, PASSWORD);
        } catch (ClassNotFoundException e) {
            //e.printStackTrace("数据库的驱动文件没有找到");
        } catch (SQLException e) {
            //数据库的连接错误
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 关闭连接释放资源
     * @param con
     * @param st
     * @param rt
     */
    public void closeAll(Connection con, Statement st, ResultSet rt) {
        try {
            if (rt != null) {
                rt.close();
                rt = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (st != null) {
                st.close();
                st = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (con != null) {
                con.close();
                con = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

CRUDDAO

package com.dao;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.*;
import java.util.Map.Entry;
/**
 * 
 * @author zzy
 *
 * 2016年12月1日下午1:49:49
 */
public class CRUDDAO<T> extends BaseJDBC {
    private Connection con = null;
    private PreparedStatement pt = null;
    private Statement st = null;
    private ResultSet rt = null;
    private Class c;

    public CRUDDAO() {

    }

    public CRUDDAO(Class c) {
        this.c = c;
    }

    /**
     * 查询操作要改造的地方 第一:参数必须抽象 第二:返回类型必须抽象
     * 
     * @param 
     * @param 
     * 
     * @return Map>
     */
    public Map> selectAll(Map m) {
        int index = 0;
        Map> map = new LinkedHashMap>();
        List list = null;
        try {
            con = super.getConnection();
            if (con != null) {
                Set> set = m.entrySet();
                for (Entry entry : set) {
                    list = new ArrayList();
                    pt = con.prepareStatement(entry.getKey());
                    this.bind(entry.getValue());
                    rt = pt.executeQuery();
                    while (rt.next()) {
                        list.add(this.toBean2());
                    }
                    map.put(++index, list);
                }
            } else {
                System.out.println("数据库连接失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            super.closeAll(con, pt, rt);
        }
        return map;
    }

    /**
     * 将数据库查询到的数据进行封装 封装成实体类之后再返回给调用者
     * 
     * @return
     */
    private T toBean() {
        T t = null;
        try {
            t = c.newInstance();
            Method[] m = c.getMethods();
            ResultSetMetaData rmt = rt.getMetaData();
            for (int i = 1, count = rmt.getColumnCount(); i <= count; i++) {
                String columName = rmt.getColumnName(i);
                columName = "set" + columName.substring(0, 1).toUpperCase()
                        + columName.substring(1);
                for (int j = 0; j < m.length; j++) {
                    if (columName.equals(m[j].getName())) {
                        m[j].invoke(t, rt.getObject(i));
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }

    private T toBean2() {
        T t = null;
        try {
            // 创建反射类的实例
            t = c.newInstance();
            // 反射出所有字段
            Field[] field = c.getDeclaredFields();
            for (Field f : field) {
                // 根据反射的字段名得到数据库中的字段值
                Object value = rt.getObject(f.getName());
                f.setAccessible(true);// 打开私有字段的操作权限
                f.set(t, value);// 调用这个字段的公有的set方法封装字段的值
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }

    /**
     * 绑定参数
     * 
     * @param obj
     */
    private void bind(Object[] obj) {
        try {
            if (obj != null) {
                for (int i = 0, k = obj.length; i < k; i++) {
                    pt.setObject(i + 1, obj[i]);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 修改操作 进行的事务的控制 所有命令要么同时提交成功 要么同时回滚
     * 
     * @param name
     * @param id
     * @return
     */
    public int[] updateAll(Map map) {
        int[] row = new int[map.size()];
        int index = 0;
        int error = 0;
        try {
            con = super.getConnection();
            if (con != null) {
                Set> set = map.entrySet();
                // 关闭连接对象的自动提交的功能
                con.setAutoCommit(false);
                for (Entry entry : set) {
                    pt = con.prepareStatement(entry.getKey());
                    this.bind(entry.getValue());
                    row[index] = pt.executeUpdate();
                    if (row[index] == 0) {
                        throw new Exception("修改失败,数据回滚!");
                    }
                    index++;
                }
            } else {
                System.out.println("数据库连接失败");
            }
        } catch (Exception e) {
            error++;
            e.printStackTrace();
        } finally {
            if (error > 0) {
                try {
                    // 将前面已经执行的命令回滚
                    con.rollback();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    // 全部提交
                    con.commit();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            super.closeAll(con, st, null);
        }
        return row;
    }

}

你可能感兴趣的:(java)