java使用Field实现通用数据库操作

上次介绍了Field,可以其可以在运行时候获取类中的信息,这是个好东西,我们可以用它来实现数据库的增删改查操作

当然,需要有一些限制:

1.表和实体类字段要对应

2.表和实体类名字要对应

3.实体类的第一个字段必须是主键(这个主要在更新的时候用到,具体根据个人情况而定)

数据库操作类如下

public class ReflectDao {
	private static String uri = "jdbc:mysql://localhost/reflect";
	private static String password = "123";
	private static String username = "xhe";
	private String insert = "insert into ";
	private String update = "update ";
	private String delete = "delete from ";
	private String select = "select * from ";

	public Connection getConnection() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(uri, username, password);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public void save(Object obj, Class clazz) {
		Connection conn = null;
		Statement s = null;
		try {
			Field[] fields = clazz.getDeclaredFields();

			insert += clazz.getSimpleName() + " values(";

			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);
				if (fields[i].get(obj) != null) {
					if (i == 0) {
						insert = insert + "'" + fields[i].get(obj) + "'";
					} else {
						insert = insert + ",'" + fields[i].get(obj) + "'";
					}

				} else {
					if (i == 0) {
						insert = insert + "" + fields[i].get(obj) + "";
					} else {
						insert = insert + "," + fields[i].get(obj) + "";
					}
				}
			}
			insert += ")";
			System.out.println(insert);

			conn = getConnection();
			s = conn.createStatement();
			s.execute(insert);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (s != null)
					s.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public void update(Object obj, Class clazz) {
		Connection conn = null;
		Statement s = null;
		try {
			Field[] fields = clazz.getDeclaredFields();

			update += clazz.getSimpleName() + " set ";

			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);
				if (fields[i].get(obj) != null) {
					if (i == 0) {
						update = update + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
					} else {
						update = update + "," + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
					}

				}
			}
			update += " where " + fields[0].getName() + " = " + fields[0].get(obj);

			System.out.println(update);

			conn = getConnection();
			s = conn.createStatement();
			s.executeUpdate(update);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (s != null)
					s.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public List find(Object obj, Class clazz) {
		Connection conn = null;
		Statement s = null;
		ResultSet rs = null;
		List list = new ArrayList();

		try {
			Field[] fields = clazz.getDeclaredFields();

			select += clazz.getSimpleName() + " where 1 = 1";

			for (int i = 0, length = fields.length; i < length; i++) {
				fields[i].setAccessible(true);
				if (fields[i].get(obj) != null) {
					select = select + " and " + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
				}
			}
			System.out.println(select);

			conn = getConnection();
			s = conn.createStatement();
			rs = s.executeQuery(select);

			while (rs.next()) {
				Object o = clazz.newInstance();
				for (int i = 0, length = fields.length; i < length; i++) {
					fields[i].setAccessible(true);
					fields[i].set(o, rs.getObject(i + 1));
				}
				list.add(o);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (s != null)
					s.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return list;
	}

	public void delete(Object obj, Class clazz) {
		Connection conn = null;
		Statement s = null;
		ResultSet rs = null;

		try {
			Field[] fields = clazz.getDeclaredFields();

			delete += clazz.getSimpleName() + " where 1 = 1";

			for (int i = 0, length = fields.length; i < length; i++) {
				fields[i].setAccessible(true);
				if (fields[i].get(obj) != null) {
					delete = delete + " and " + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
				}
			}
			System.out.println(delete);

			conn = getConnection();
			s = conn.createStatement();
			s.executeUpdate(delete);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (s != null)
					s.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

这个类很简单,外部调用的时候只需要传入对应的对象和class对象,就可以进行增删改查操作

测试类如下

	public static void main(String[] args) {
		ReflectDao reflect = new ReflectDao();
		Student s = new Student();
		s.setAge(12);
		s.setName("tom");
		s.setSex("man");
		s.setStudentid(1130299110);
		reflect.save(s, s.getClass());
	}

这样就可以把Student的信息保存到数据库的Student表了(表就4个字段)

不得不说Field是一个好东西,不过这里主要是大概的提供一种应用,所以上面的程序会有BUG或者不完美的地方,各位可以使用Field去写一个自己的操作方法

时间: 2024-10-21 01:45:32

java使用Field实现通用数据库操作的相关文章

PHP类初识,通用数据库操作类,前端easyui-datagrid,form

实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[新增]按钮,[修改],[删除]按钮禁用,[保存]按钮启用 (3)点击[修改]按钮,[新增],[删除]按钮禁用 难点:通用数据库操作类中insert方法跟update方法 最终效果图: 前端功能不是很完善,按钮之间逻辑还是有点问题,最后补充前端代码 其中Formain.php对前端传值判断,并调用ac

二、JAVA通过JDBC连接mysql数据库(操作)

昨天时间限制只是写了如何连接数据库,连接数据库的目的无非就是查询.修改数据,仅仅连接上还是毫无意义的. 对于数据哭的操作就要用到Statement接口(java.sql.Statement)主要方法 int executeUpdate(String sql)throws SQLException 更新数据库 ResultSet executeQuery(String sql)throws SQLException 查询返回ResultSet结果集 代码演示 1 import java.sql.C

java之Hibernate框架实现数据库操作

之前我们用一个java类连接MySQL数据库实现了数据库的增删改查操作---------MySQL篇: 但是数据库种类之多,除了MySQL,还有Access.Oracle.DB2等等,而且每种数据库语言都不尽相同: 这时,我们就需要一个框架来实现对主流数据库操作的兼容,并且简化操作流程,Hibernate就是其中一款 主流框架.这里我们用Myeclipse作为开发软件来示例. 1.建立数据库连接 开启MySQL数据库服务,并在Myeclipse中,Window-->Show View-->DB

C#通用数据库操作类

ADO.NET操作 使用ADO.NET的方式操作数据库时,对于经常需要操作不同数据库的同学,需要对不同的数据库翻来覆去地写操作类. 对ADO.NET,操作数据库需要有几个核心的东西(以MySql为例): MySqlConnection 负责mysql的连接,在操作mysql前,需要先获得连接. MySqlCommand 负责具体命令的类,具体需要执行的sql的语句需要放到它的CommandText下. MySqlDataAdapter 对于查询数据,可以选择使用DataAdapter将数据一次性

log4php的配置--PHP类初识,通用数据库操作类代码问题

涉及的代码网址:http://www.cnblogs.com/leetao94/p/4690732.html 代码的点评 优点:代码通用性很好,能够根据传入的字段,自动拼接SQL语句缺点:不支持参数绑定,程序鲁棒性差          类变量使用不当,不应使用公用变量.构造函数传入参数过多,容易造成多点故障         代码格式缩进采用双tab制表位         程序未使用logger记录常见故障信息             数据库连接多次创建,未重用连接.getcolumn代码中采用硬

ADO.NET 使用通用数据库操作类Database (SQL Server)

一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString="server=192.168.1.139;uid=sa;pwd=123456;Trusted_Connection=no;Database=dabasename" providerName="system.data.sqlclient"/> </connection

(转)JSP+mysql数据库操作 连接,增加,删除,修改,查询例子

来源:ab蓝学网     时间:2013-06-06    点击:3894 简介:java教程|JSP中的数据库操作(1):MySQL数据库创建及管理本文目录顺序:安装MySQLMySQL管理软件SQLYogEnterprise--30天试用期到期解决方法使用SQLYogEnterprise建立... JSP中的数据库操作(1):MySQL数据库创建及管理 本文目录顺序: 安装MySQL MySQL管理软件SQLYog Enterprise --30天试用期到期解决方法 使用SQLYog Ent

数据库操作通用类

DataBase.java 说明: 1. 此类包含对数据库的查询,删除,更新操作.     2. 可以实现对大文本对象的增删改.     3. 利用自建的数据库连接池类, 得到数据库连接.     4. 可以利用Tomcat 自带的连接池, 得到数据库连接 变量:     1. 数据库连接 变量名     : conn 应用范围   : protect 变量类型   : Connection 数据库连接 初始值     : null 是否Static :  否     2. 声明语句 变量名  

完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难.Gradle:Gradle采用增量构建.Gradle通过Groovy编程而不是传统的XML声明进行配置.Gradle可以很好地配合Maven进行依赖管理,并且把Ant脚本当作头等公民.字节码操作 编程操作Java字节码的函数库. ASM:通用底层字节码操作及分析