package com.czq.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.czq.util.JDBCUtil;
import com.czq.util.PageInfo;
public class BaseDao {
```
/**
* 通用查询数据列表
* @param <T>
* @param 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
* @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
* @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
* @param param
* @return
*/
public int insert(String sql,Object... param) {
Connection conn = JDBCUtil.getConn();
PreparedStatement prep = null;
ResultSet rs = null;
try {
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);
}
return 1;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, prep);
}
return 0;
}
/**
* 通用更新
* @param 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 == 1?true:false;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, prep);
}
return false;
}
```
/**
* 分页查询
* @param <T>
* @return
*/
/**
* 分页查询
* @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值小于1 则为1
if(page < 1) {
page = 1;
}
//如果page比最大页码大 则值为最大页码
if(page > maxPage) {
page = maxPage;
}
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
* @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;
}
```
}
BaseDao数据库操作
最新推荐文章于 2023-11-29 16:35:16 发布
本文介绍了一种基于Java的通用DAO层设计,通过反射机制实现不同类型数据的查询、插入、更新和删除操作,同时提供了分页查询功能。文章详细解释了如何使用PreparedStatement和ResultSet进行数据操作,以及如何将查询结果转化为对应的JavaBean。
摘要由CSDN通过智能技术生成