`
yunchow
  • 浏览: 328009 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • DBI
阅读更多
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());
	}
}
分享到:
评论

相关推荐

    在C#中使用控件DataGridView实现数据库增删改查

    在 C# 中使用控件 DataGridView 实现数据库增删改查是指在 Windows 窗体应用程序中使用 DataGridView 控件来实现对数据库的增删改查操作。下面将详细介绍实现该功能的知识点。 一、DataGridView 控件概述 ...

    python实现数据库增删改查,通讯录 学号管理等

    python实现数据库增删改查,通讯录。学号管理等python实现数据库增删改查,通讯录。学号管理等python实现数据库增删改查,通讯录。学号管理等python实现数据库增删改查,通讯录。学号管理等python实现数据库增删改查...

    数据库增删改查

    java数据库的增删改查代码

    WPF链接数据库进行增删改查操作

    一个简单的数据库链接例子 在WPF界面上进行操作 实现对数据库数据的增删改查 适合初初初学者 高手不要下 也别喷我

    oracle 数据库 增删改查

    实现Oracle数据库的增删改查功能通常涉及以下几个核心组件: 1. **工具类(BaseDao)**:封装了数据库连接、关闭等通用方法。 2. **实体类(Entity)**:用于表示数据库表中的每一行数据。 3. **DAO层(Dao)**:负责执行...

    python界面实现数据库增删改查

    将txt中的数据读取并存入sqlite中,利用tkinter将数据库增删改查界面化,并将数据库数据显示至treedata树结构中,详情请看博文https://blog.csdn.net/qq_40435493/article/details/103567881

    利用高级表格演示易语言数据库增删改查

    在这个“利用高级表格演示易语言数据库增删改查”的主题中,我们将深入探讨如何在易语言中使用高级表格控件来实现对数据库的基本操作。 首先,我们需要理解数据库的基础概念。数据库是一种有组织地存储和检索数据的...

    Java连接数据库增删改查

    综上所述,从数据库连接到实体类设计,再到GUI界面的实现,Java连接数据库进行增删改查不仅涉及到后端数据库操作,还涵盖了前端用户界面的设计和实现。这些知识对于开发全栈应用程序至关重要,能够帮助开发者构建既...

    VS实现SQL数据库的增删改查

    以下将详细介绍如何在VS中实现SQL数据库的增删改查功能。 首先,我们需要了解SQL Server数据库的基本概念。SQL(Structured Query Language)是一种用于管理关系数据库的标准语言,包括创建、查询、更新和删除数据...

    .NET 控制台应用程序连接 MySQL 数据库实现增删改查源码

    本文将详细介绍如何使用 .NET 控制台应用程序连接 MySQL 数据库,并实现数据的增删改查(CRUD)操作。CRUD 操作是数据库应用中最基本的操作,分别代表创建(Create)、读取(Read)、更新(Update)和删除(Delete)。在 ...

    javaFX实现的图书馆后台管理系统,有数据库增删改查,基于sqlserver数据库.zip

    javaFX实现的图书馆后台管理系统,有数据库增删改查,基于sqlserver数据库.zip

    qt数据库sqlite3增删改查.docx

    在Qt中使用SQLite3数据库进行增删改查操作,首先需要在Qt项目中包含相应的SQLite模块。从Qt 5开始,SQLite数据库支持被直接集成在Qt SQL模块中,无需额外安装SQLite数据库软件。 以下是如何在Qt项目中使用SQLite3...

    相当简单Android SQLite数据库增删改查【自己写的】

    相当简单Android SQLite数据库增删改查,绝对适合新手,包您一看就会, 1.这是我照着网上的资料和帮助手册写的; 2.数据库的增删改查都涉及到了; 3.导入项目,运行,然后 在终端进入数据库,命令为 adb shell cd ...

    面试常用数据库增删改查

    在IT行业的面试中,数据库操作是核心技术之一,尤其对于数据密集型的应用,如电商、社交网络等,掌握数据库的增删改查(CRUD:Create, Read, Update, Delete)能力至关重要。本篇将深入探讨这些核心知识点。 一、...

    简单的数据库增删改查

    简单的数据库增删改查insert(); update(); delete(); query();

    Spring Boot+MySQL+Mybatis+Maven+IDEA(一个简单的数据库增删改查项目)

    在本项目中,我们主要探讨的是如何利用Spring Boot、MySQL、Mybatis以及Maven这四大核心技术,配合IDEA集成开发环境来实现一个基础的数据库增删改查功能。这是一个典型的Web应用开发流程,旨在帮助开发者快速搭建...

    jsp连接Oracle数据库实现增删改查

    在JavaWeb开发中,连接Oracle数据库并实现增删改查操作是常见的需求。"jsp连接Oracle数据库实现增删改查"这个项目旨在教你如何利用JSP(JavaServer Pages)技术来构建一个完整的用户管理系统,包括登录、注册以及对...

    vb.net操作Oracle数据库增删改查以及存储过程调用1

    VB.NET 操作 Oracle 数据库增删改查以及存储过程调用 在本篇文章中,我们将详细介绍如何使用 VB.NET 操作 Oracle 数据库,包括增删改查操作以及存储过程的调用。 VB.NET 操作 Oracle 数据库的准备工作 在开始操作...

    Android xutils的数据库增删改查带数据库升级

    在Android开发中,数据存储是不可或缺的一部分,XUtils是一个强大的工具库,它为开发者提供了方便的数据操作接口,包括对SQLite数据库的增删改查以及数据库版本管理。本篇将详细介绍如何利用XUtils进行数据库操作...

Global site tag (gtag.js) - Google Analytics