DAO 层的工具类

DaoUtil

package com.du.util;

import javax.servlet.http.HttpServletRequest;
import java.sql.*;
import java.util.*;

/**
 * DAO 工具
 * <p>
 * 设置好数据库 table 和 id 字段名,无需再写那么多 SQL 代码了
 * </p>
 */
public class DaoUtil {

    private static Map<String, DaoUtil> map = new HashMap<>();

    private DBUtil db;

    /**
     * 当前操作的表
     */
    private String table;

    /**
     * 这个表的自增的 ID 的字段名
     */
    private String idField;

    /**
     * DAO 层工具
     */
    private DaoUtil(String databaseName, String username, String password) {
        db = new DBUtil(databaseName, username, password);
    }

    /**
     * 实例化
     *
     * @param databaseName 数据库名
     * @param username     数据库登陆用户名
     * @param password     密码
     * @return 返回实例化后的 DAOUtil 对象
     */
    public static DaoUtil instance(String databaseName, String username, String password) {
        if (map.containsKey(databaseName)) {
            return map.get(databaseName);
        }
        DaoUtil dao = new DaoUtil(databaseName, username, password);
        map.put(databaseName, dao);
        return dao;
    }

    /**
     * 获取 Request 中携带的数据
     *
     * @param request  Request请求
     * @param paramKey 要获取的 Key
     * @return 返回 Map 格式的数据
     */
    public static Map<String, Object> getRequestParameter(HttpServletRequest request, String... paramKey) {
        Map<String, Object> map = new HashMap<>();
        for (String key : paramKey) {
            map.put(key, request.getParameter(key));
        }
        return map;
    }

    /**
     * 切换数据库
     *
     * @param database 数据库名称
     * @return 返回对应数据库的 DaoUtil
     */
    public DaoUtil switchDatabase(String database) {
        return map.get(database);
    }

    /**
     * 初始化
     *
     * @param table   表名
     * @param idField 字段名
     * @return 返回初始化后的 DaoUtil
     */
    public DaoUtil init(String table, String idField) {
        this.table = table;
        this.idField = idField;
        return this;
    }

    /**
     * 设置 Table
     *
     * @param table 表名
     * @return 返回设置后的 DaoUtil
     */
    public DaoUtil setTable(String table) {
        this.table = table;
        return this;
    }

    public DaoUtil setIdField(String idField) {
        this.idField = idField;
        return this;
    }

    /**
     * 删除(删)
     *
     * @param where 条件。格式:"字段1=? AND 字段2=?"
     * @param obj   条件参数值。格式:值1, 值2
     * @return 返回删除数量
     */
    public int delete(String where, Object... obj) {
        String sql = "DELETE FROM " + table;
        sql += " where " + where;
        System.out.println("sql = " + sql);

        // 删除
        return db.update(sql, obj);
    }

    /**
     * 删除
     *
     * @param id 删除的 id
     * @return 返回删除数量
     */
    public int delete(String id) {
        return delete(idField + "=?", id);
    }

    /**
     * 查询(查单个)
     *
     * @param id 查询指定条件的
     * @return 返回查询数据
     */
    public Map query(String id) {
        String sql = "SELECT * FROM " + table;
        sql += " WHERE " + idField + "=?";
        System.out.println("sql=" + sql);

        // 查找
        List<Map> list = db.query(sql, id);
        if (list.size() > 0) {
            return list.get(0);
        } else {
            return null;
        }
    }

    public Map query(String where, Object... obj) {
        List<Map> list = queryForList(where, obj);
        if (list.size() > 0) {
            return list.get(0);
        } else {
            return null;
        }
    }

    public Map query(Map where) {
        Object[][] fieldAndValue = getFieldAndValue(where);
        Object[] values = fieldAndValue[1];
        String whereStr = mapToWhere(where);
        return query(whereStr, values);
    }

    /**
     * 列表(查多个)
     *
     * @return 返回表中所有内容
     */
    public List<Map> queryForList() {
        String sql = "SELECT * FROM " + table;
        System.out.println("sql=" + sql);
        return db.query(sql);
    }

    /**
     * 查询条件
     *
     * @param where 条件。格式:"字段1=? AND 字段2=?"
     * @param obj   条件参数值。格式:值1, 值2
     * @return 返回查询数据
     */
    public List<Map> queryForList(String where, Object... obj) {
        String sql = "SELECT * FROM " + table;
        sql += " WHERE " + where;
        // 查询
        return db.query(sql, obj);
    }

    /**
     * 查询
     *
     * @param where Map 条件
     * @return 返回查询结果
     */
    public List<Map> queryForList(Map where) {
        Object[][] fieldAndValue = getFieldAndValue(where);
        Object[] values = fieldAndValue[1];
        String whereStr = mapToWhere(where);
        return queryForList(whereStr, values);
    }

    /**
     * 添加(增)
     *
     * @param fields 字段
     * @param values 值
     * @return 返回增加成功的数量
     */
    public int add(Object[] fields, Object[] values) {
        // 字段值
        String flist = fields[0].toString();
        for (int i = 1; i < fields.length; i++) {
            flist += "," + fields[i];
        }

        // 设置 SQL 语句
        String sql = "INSERT INTO " + table + "( " + flist + ")" + " VALUE";
        // 值的占位符
        sql += "(?";
        for (int i = 1; i < fields.length; i++) {
            sql += ",?";
        }
        sql += ")";
        System.out.println("sql=" + sql);
        // 执行功能
        return db.update(sql, values);
    }

    public int add(Map map) {
        Object[][] fieldAndValue = getFieldAndValue(map);
        return add(fieldAndValue[0], fieldAndValue[1]);
    }


    /**
     * 更新(改)
     *
     * @param fields 要更新的字段
     * @param values 要更新的值
     * @param where  更新条件。格式:"字段1=? AND 字段2=?"
     * @param obj    条件中的值。格式:值1, 值2
     * @return 返回更新数量
     */
    public int update(Object[] fields, Object[] values, String where, Object... obj) {
        // 设置参数占位符
        String sql = "UPDATE " + table + " SET ";
        sql += fields[0] + "=?";
        for (int i = 1; i < fields.length; i++) {
            sql += ", " + fields[i] + "=?";
        }
        // 条件
        sql += " WHERE " + where;
        System.out.println("sql=" + sql);

        // 参数值
        Object[] param = new Object[values.length + obj.length];
        for (int i = 0; i < values.length; i++) {
            param[i] = values[i];
        }
        int lastIndexPos = values.length;
        for (int i = 0; i < obj.length; i++) {
            param[lastIndexPos + i] = obj[i];
        }
        // 执行更新
        return db.update(sql, param);
    }

    public int update(Object[] fields, Object[] values, String id) {
        // 执行更新
        return update(fields, values, idField + "=?", id);
    }

    public int update(Map map, String where, Object... obj) {
        Object[][] fieldAndValue = getFieldAndValue(map);
        return update(fieldAndValue[0], fieldAndValue[1], where, obj);
    }

    public int update(Map map, String id) {
        Object[][] fieldAndValue = getFieldAndValue(map);
        return update(fieldAndValue[0], fieldAndValue[1], id);
    }

    /**
     * 可变长度参数列表转为 字段数组和值数组 对象
     *
     * @param obj 参数列表
     * @return 返回一个数组2个元素的数组,索引0是字段的数组,索引1是对应字段值的数组
     */
    public static Object[][] getFieldAndValue(Object[] obj) {
        int count = obj.length / 2;
        Object[] fields = new Object[count];
        Object[] values = new Object[count];
        // 字段名
        for (int i = 0; i < count; i++) {
            fields[i] = obj[i];
        }
        // 对应的值
        for (int i = 0; i < count; i++) {
            values[i] = obj[count + i];
        }
        return new Object[][]{fields, values};
    }

    /**
     * map 转为 字段数组和值数组 对象
     *
     * @param map map 数据
     * @return 返回一个数组2个元素的数组,索引0是字段的数组,索引1是对应字段值的数组
     */
    public static Object[][] getFieldAndValue(Map map) {
        int count = map.size();

        Object[] fields = new Object[count];
        Object[] values = new Object[count];
        // 字段名
        Set sets = map.keySet();
        int index = 0;
        for (Object key : sets) {
            fields[index] = key;
            index++;
        }
        // 值
        Collection v = map.values();
        index = 0;
        for (Object value : v) {
            values[index] = value;
            index++;
        }
        Object[][] objects = {
                fields, values
        };
        return objects;
    }

    /**
     * Map 数据转为 Where 条件字符串
     *
     * @param map Map 数据
     * @return 返回一个数组2个元素的数组,索引0是字段的数组,索引1是对应字段值的数组
     */
    private String mapToWhere(Map map) {
        StringBuilder sb = new StringBuilder();
        int i = 0;
        for (Object key : map.keySet()) {
            if (i > 0) {
                sb.append(" AND ");
            }
            sb.append(key);
            sb.append("=?");
            i++;
        }
        return sb.toString();
    }


}


//==========================================================================
//============================     分隔     ================================
//==========================================================================


/**
 * 数据库工具类
 *
 * @author z
 */
class DBUtil {

    private String dbname;
    private String user;
    private String password;

    private Connection conn = null;
    private ResultSet rst = null;
    private PreparedStatement pst = null;

    static {
        try {
//            Class.forName("com.mysql.jdbc.Driver");    // 5.7
            Class.forName("com.mysql.cj.jdbc.Driver");  // 8.0
            System.out.println("驱动加载成功!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public DBUtil(String databaseName, String user, String password) {
        this.dbname = databaseName;
        this.user = user;
        this.password = password;
    }

    private void getConn() {
        try {
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/" + dbname + "?useSSL=false&serverTimezone=UTC&characterEncoding=utf8", user, password);
            System.out.println("链接建立成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //通过map对象代替我们resultset结果集返回
    // 查询
    public List<Map> query(String sql, Object... obj) {
        getConn();
        try {
            pst = conn.prepareStatement(sql);
            System.out.println(sql);
            for (int i = 0; i < obj.length; i++) {
                System.out.println(obj[i]);
                pst.setObject(i + 1, obj[i]);
            }
            rst = pst.executeQuery();
            // 获取元数据
            ResultSetMetaData metaData = rst.getMetaData();
            List<Map> list = new ArrayList<>();
            while (rst.next()) {
                Map map = new HashMap();
                // 获取查询的元数据的总列数
                int count = metaData.getColumnCount();
                // 列数是从1开始
                for (int i = 1; i <= count; i++) {
                    // 获取当前记录当前索引的列名
                    String key = metaData.getColumnLabel(i);
                    // 获取记录的值
                    Object value = rst.getObject(key);
                    map.put(key, value);
                }
                list.add(map);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return null;
    }

    // 增,删,改
    public int update(String sql, Object... obj) {
        int num = 0;
        getConn();
        try {
            pst = conn.prepareStatement(sql);
            System.out.println(sql);
            for (int i = 0; i < obj.length; i++) {
                System.out.println(obj[i]);
                pst.setObject(i + 1, obj[i]);
            }
            num = pst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return num;
    }

    // 关闭流
    public void close() {
        try {
            if (rst != null) {
                rst.close();
            }
            if (pst != null) {
                pst.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


发表评论