数据库增,删,改,查通用范形实现

本文介绍了一个通用的DAO支持类DaoSupport,它支持多种常见的数据库操作功能,如增删改查等,并提供了灵活的条件筛选及分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.yunchow.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
* 能用DaoSupport类, 支持常见的功能如下:
* 1, 增加一条记录, 并且返回主键值
* 2, 可以按照Id, 或是任意条件删除N条记录
* 3, 修改一条记录
* 4, 统计指定表中总的记录条数, 还可以根据条件统计记录条数
* 5, 返回表中的所有数据
* 6, 返回表中指定页的数据, 页码和每页条数可更改,
* 7, 返回表中指定页的指定条件的数据, 并且还能为该记录集合进行排序
* @author yunchow
* @version 1.2 09/9/3 15:14
*/
public class DaoSupport<T> {
/** 要操作的实体对象 */
protected Class<T> entityClass;
/** Jdbc操作模板 */
protected JdbcTemplate template = new JdbcTemplate();
/** 通用行映射器 */
protected RowMapper<T> mapper;
/** 得到配置文件的信息 */
protected ConfigBean config = ConfigBean.getInstance("pk-mapping.ini");
/** 所对应表的主键值 */
private String pk;

public DaoSupport(Class<T> clazz) {
this.entityClass = clazz;
mapper = new GenericRowMapper<T>(entityClass);
pk = config.getProperty(this.entityClass.getSimpleName());
if(pk == null) pk="cafebabe";
init();
// System.out.println(entityClass.getName());
}
protected Class<T> getPersistenceClass() {
return this.entityClass;
}
// 子类用于扩展.
public void init() {
System.out.println("DaoSupport 初始化!");
}
/**
* 更改行映射器.
*/
public void setMapper(RowMapper<T> mapper) {
this.mapper = mapper;
}
/**
* 统计表中总共行数
* @return
*/
public int count() {
return template.count(entityClass.getSimpleName());
}
/**
* 根据条件统计行数
* @param sqlwhere
* @return
*/
public int count(String sqlwhere) {
return template.count(entityClass.getSimpleName(), sqlwhere);
}
/**
* 删除一个对象, 根据某个非空条件
*/
public boolean remove(T t) {
try {
StringBuffer sql = new StringBuffer();
sql.append("delete from ").append(entityClass.getSimpleName());
sql.append(" where ");
List<Object> params = new ArrayList<Object>();
for(Field field : entityClass.getDeclaredFields()) {
String sql0 = field.getName() + "=? and ";
Method getter = this.getReadMethod(field);
Object value = getter.invoke(t);
// System.out.println(field.getName() + " = " + value);
if(value!=null && !"".equals(value)) {
sql.append(sql0);
params.add(value);
}
}
int index = sql.lastIndexOf("and");
if(index > 0)
sql.delete(index, sql.length()-1);
System.out.println("sql = " + sql);
return (template.update(sql.toString(), params.toArray()) > 0 );
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 根据ID删除一个对象
*/
public boolean remove(int id) {
String sql = "delete from "+this.entityClass.getSimpleName()
+" where " + pk + "=" + id;
System.out.println(sql);
return (template.update(sql) > 0);
}
/**
* 清空表
*/
public boolean clear() {
String sql = "delete from "+this.entityClass.getSimpleName();
System.out.println(sql);
return (template.update(sql) > 0);
}
/**
* 查找所有的信息
*/
public List<T> findAll() {
String sql = "select * from " + this.entityClass.getSimpleName();
System.out.println(sql);
return template.findList(sql, mapper);
}
/**
* 根据某个属性查找对象
*/
public List<T> find(String propertyName, Object value) {
StringBuffer sql = new StringBuffer();
sql.append("select * from ")
.append(this.entityClass.getSimpleName());
sql.append(" where ")
.append(propertyName)
.append("=")
.append(value);
System.out.println(sql);
return template.findList(sql.toString(), mapper);
}
/**
* 根据where子句查找对象的集合
*/
public List<T> find(String sqlwhere) {
String sql = "select * from " + this.entityClass.getSimpleName();
sql += " where " + sqlwhere;
System.out.println(sql);
return template.findList(sql, mapper);
}
/**
* 根据where子句查找指定页的对象的集合
* 并且根据传过来的orderby子句, 对结果进行排序
*/
public List<T> find(int pageSize, int pageNo, String sqlwhere, String orderby) {
if(pageNo <= 0) pageNo = 1;
if(pageSize <= 0) pageSize = 5;
boolean boo = true;
if(sqlwhere==null || "".equals(sqlwhere.trim())) {
boo = false;
}
StringBuffer sql = new StringBuffer();
sql.append("select top ").append(pageSize)
.append(" * from "+ entityClass.getSimpleName() +" where ").append(sqlwhere);
if(boo)
sql.append(" and ");
sql.append(pk +" not in( select top ")
.append(pageSize*(pageNo-1))
.append(" "+ pk +" from "+ entityClass.getSimpleName());
if(boo)
sql.append(" where ");
sql.append(sqlwhere).append(")");
if(orderby!=null && !"".equals(orderby.trim()))
sql.append(" order by ")
.append(orderby);
System.out.println(sql);
return template.findList(sql.toString(), mapper);
}
/**
* 查找符合条件的指定页记录
* @param pageSize
* @param pageNo
* @param sqlwhere
* @return
*/
public List<T> find(int pageSize, int pageNo, String sqlwhere){
return find(pageSize, pageNo, sqlwhere, "");
}
/**
* 查找指定页记录
* @param pageSize
* @param pageNo
* @return
*/
public List<T> find(int pageSize, int pageNo){
return find(pageSize, pageNo, "", "");
}
/**
* 保存一个对象, 并且插入主键值, 而不是由数据库产生.
* 返回数据库产生的主键值, 如果保存失败则返回-1
*/
public int save(T t) {
return save(t, false);
}
/**
* 保存一个对象
* 返回数据库产生的主键值, 如果保存失败则返回-1
* @param boo 为true时则插入主键值, 否则不插入
*/
public int save(T t, boolean boo) {
try {
StringBuffer sql = new StringBuffer("insert into ");
StringBuffer values = new StringBuffer(" values( ");
List<Object> params = new ArrayList<Object>();
sql.append(entityClass.getSimpleName() + "(");
for(Field field : t.getClass().getDeclaredFields()) {
if(boo || !pk.equals(field.getName())) {
Method getter = getReadMethod(field);
Object value = getter.invoke(t);
if(value!=null) {
sql.append(field.getName() + ",");
values.append("?,");
params.add(value);
}
}
}
values.deleteCharAt(values.length()-1);
values.append(")");
sql.deleteCharAt(sql.length()-1);
sql.append(")").append(values);
System.out.println(sql);
/*for(Object obj : params) {
System.out.println(obj);
}*/
return template.save(sql.toString(), params.toArray());
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
/**
* 更新一个对象
*/
public boolean update(T t) {
try {
StringBuffer sql = new StringBuffer("update ");
sql.append(entityClass.getSimpleName() + " set ");
List<Object> params = new ArrayList<Object>();
Object pkValue = "";
for(Field field : t.getClass().getDeclaredFields()) {
if(!pk.equals(field.getName())) {
sql.append(field.getName() + "=?,");
Method getter = getReadMethod(field);
params.add(getter.invoke(t));
} else {
Method getter = getReadMethod(field);
pkValue = getter.invoke(t);
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(" where ")
.append(pk + "=?");
params.add(pkValue);
System.out.println(sql);
for(Object obj : params) {
System.out.println(obj);
}
System.out.println(sql);
return (template.update(sql.toString(), params.toArray()) > 0);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 得到属性的read方法
* @param field
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
protected Method getReadMethod(Field field) throws SecurityException, NoSuchMethodException {
String name = field.getName();
String firstLetter = name.substring(0,1).toUpperCase();
String methodName = "get" + firstLetter + name.substring(1);
// System.out.println("方法名为:" + methodName);
return entityClass.getMethod(methodName);
}
/**
* 得到属性的write方法
* @param field
* @return
* @throws NoSuchMethodException
* @throws SecurityException
* @throws SecurityException
* @throws NoSuchMethodException
*/
protected Method getWriteMethod(Field field) throws SecurityException, NoSuchMethodException {
String name = field.getName();
String firstLetter = name.substring(0,1).toUpperCase();
String methodName = "set" + firstLetter + name.substring(1);
System.out.println("方法名为:" + methodName);
return entityClass.getMethod(methodName, field.getType());
}
}
电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值