码迷,mamicode.com
首页 > 数据库 > 详细

JDBC通用的数据库数据操作[CRUD]封装

时间:2020-03-24 22:58:27      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:false   tar   column   tin   statement   页码   ack   查询   turn   

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;
    }

}

JDBC通用的数据库数据操作[CRUD]封装

标签:false   tar   column   tin   statement   页码   ack   查询   turn   

原文地址:https://www.cnblogs.com/lyang-a/p/12562669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!