使用反射机制创建万能的数据库的增删查改

该博客介绍了一个使用Java反射机制来实现通用的数据库增删查改操作的类`MyConn`。通过获取类的属性并映射到SQL语句,实现了根据对象创建SQL语句并执行的能力,支持查询、添加、更新和删除记录。

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

package com.huoguo.common;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.huoguo.bean.TbReader;
import com.mysql.jdbc.PreparedStatement;

public class MyConn {
	protected Connection conn;
	protected PreparedStatement sql;
	protected ResultSet rs;

	public MyConn() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager
					.getConnection(
							"jdbc:mysql://localhost:3306/bookmanage?useUnicode=true&characterEncoding=utf-8",
							"root", "");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 查询所有记录
	 * 
	 * @param ob
	 * @return
	 */
	public ArrayList getList(Object ob) {
		ArrayList list = new ArrayList();
		Class cls = ob.getClass();
		// 要求:数据表中的字段必须与类中的属性一一对应
		Field[] fi = cls.getDeclaredFields();// 获取类中的所有的属性
		String strsql = "select * from "
				+ cls.getSimpleName().replace("Tb", "").toLowerCase();// 获取表名(类名必须与数据表一致)
		try {
			sql = (PreparedStatement) conn.prepareStatement(strsql);
			rs = sql.executeQuery();
			while (rs.next()) {
				Object obj = cls.newInstance();// 创建指定类的实例化对象
				for (Field f : fi) {
					f.setAccessible(true);// 暴力访问
					f.set(obj, rs.getObject(f.getName()));// 调用类中指定属性的set方法赋值
				}
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 通过主键查询
	 * 
	 * @param cl
	 * @param id
	 * @return
	 */
	public Object getObjectById(Class cl, int id) {
		Object obj = null;
		Field[] fi = cl.getDeclaredFields();// 获取类中的所有的属性
		String strsql = "select * from "
				+ cl.getSimpleName().replace("Tb", "").toLowerCase()
				+ " where " + fi[0].getName() + " = " + id;// fi[0].getName()获取数据表中第一列字段
		try {
			sql = (PreparedStatement) conn.prepareStatement(strsql);
			rs = sql.executeQuery();
			if (rs.next()) {
				obj = cl.newInstance();// 创建指定类的实例化对象
				for (Field f : fi) {
					f.setAccessible(true);// 表示可以访问类中的私有属性
					f.set(obj, rs.getObject(f.getName()));// 调用类中指定属性的set方法赋值
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return obj;
	}

	/**
	 * 根据数据表中的一个字段和值查询
	 * 
	 * @param cl
	 * @param name
	 * @param value
	 * @return
	 */
	public ArrayList getListBySome(Class cl, String name, Object value) {

		ArrayList list = new ArrayList();
		Field[] fi = cl.getDeclaredFields();// 获取类中的所有的属性
		String strsql = "select * from "
				+ cl.getSimpleName().replace("Tb", "").toLowerCase()
				+ " where " + name + " = '" + value + "'";
		try {
			sql = (PreparedStatement) conn.prepareStatement(strsql);
			rs = sql.executeQuery();
			while (rs.next()) {
				Object obj = cl.newInstance();
				for (Field f : fi) {
					f.setAccessible(true);// 暴力访问
					f.set(obj, rs.getObject(f.getName()));// 调用类中指定属性的set方法赋值
				}
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 添加记录
	 * 
	 * @param ob
	 * @return
	 */
	public int insert(Object ob) {
		int row = 0;// 记录数
		Class clz = ob.getClass();
		String table = clz.getSimpleName().replace("Tb", "").toLowerCase();// 数据表名
		Field[] fi = clz.getDeclaredFields();// 字段名
		StringBuilder sb = new StringBuilder();// 拼装sql语句用

		// 拼装sql语句
		sb.append("insert into ").append(table).append(" (");
		for (int i = 0; i < fi.length - 1; i++) {
			sb.append(fi[i].getName() + ",");
		}
		sb.append(fi[fi.length - 1].getName() + ") values (");// 最后一个不加逗号
		for (int i = 0; i < fi.length - 1; i++) {
			sb.append("?,");
		}
		sb.append("?)");// 最后一个不加逗号

		// 设置值
		try {
			sql = (PreparedStatement) conn.prepareStatement(sb.toString());
			for (int i = 0; i < fi.length; i++) {
				fi[i].setAccessible(true);// 暴力访问字段
				sql.setObject(i + 1, fi[i].get(ob));
			}
			row = sql.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return row;
	}

	/**
	 * 更新数据
	 * @param obj
	 * @return
	 */
	public int update(Object obj) {
		int row=0;
		Class clz = obj.getClass();
		Field[] fi = clz.getDeclaredFields();// 获取类中的所有的属性
		StringBuilder sb = new StringBuilder();
		sb.append("update ");
		sb.append(clz.getSimpleName().replace("Tb", "").toLowerCase());
		sb.append(" set ");
		for (int i = 1; i < fi.length; i++) {
			sb.append(fi[i].getName());// 获取列名
			sb.append(" =? ");
			if (i != fi.length - 1)// 最后一列不用加逗号
				sb.append(",");
		}
		sb.append(" where ");
		sb.append(fi[0].getName());
		sb.append(" =? ");
		try {
			sql = (PreparedStatement) conn.prepareStatement(sb.toString());
			for (int i = 1; i < fi.length; i++) {
				fi[i].setAccessible(true);
				sql.setObject(i, fi[i].get(obj));
			}
			//设置主键
			fi[0].setAccessible(true);
			sql.setObject(fi.length, fi[0].get(obj));
			row = sql.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return row;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值