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