java JDBC 万能DAO的实现的补充 实现了增删查改

有了这个类  ,基本后台的所有逻辑操作都能实现,后端雏形就算搭建出来了

说说写这个类遇到的坑

1。Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

 

ResultSetMetaData中的getColumnCount()方法是从1开始的

代码如下:

resultSet = DbHelper.getStatement().executeQuery(sql);

ResultSetMetaData data = resultSet.getMetaData();

int columnsCount = data.getColumnCount();

for (int i = 1; i <= columnsCount; i++) {
            String s = data.getColumnName(i);
            list.add(s);
    }

2。这些代码都实现了所需要的功能,但是没有优化

package com.lp.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.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.lp.bean.city;
import com.lp.bean.goods;
import com.sun.org.apache.bcel.internal.generic.GETSTATIC;

/**
 * 2015.7.20 利用java反射机制实现万能DAO 即使bean层的实体类字段改变 也能实现增删查改
 *
 * @author  liupeng
 */
public class DaoPro {

	// 由数据库名称得到数据库中的所有列
	public List<String> getColumns(String tableName) {
		Connection connection = DbHelper.getCon();
		Statement statement = DbHelper.getStatement();
		ResultSet resultSet = null;
		List<String> list = new ArrayList<String>();
		try {
			String sql = "select * from " + tableName + " where 1=2";
			resultSet = DbHelper.getStatement().executeQuery(sql);
			ResultSetMetaData data = resultSet.getMetaData();
			int columnsCount = data.getColumnCount();
			for (int i = 1; i <= columnsCount; i++) {
				String s = data.getColumnName(i);
				list.add(s);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.cloRes(connection, statement, resultSet);
		}
		return list;
	}

	// 得到数据库中的所有数据
	public List getList(Class cl) {

		int i = 0;
		List objs = new ArrayList();
		Connection connection = DbHelper.getCon();
		Statement statement = DbHelper.getStatement();
		ResultSet resultSet = null;
		Field[] fields = cl.getDeclaredFields();
		List<String> columnsName = getColumns(cl.getSimpleName());
		String sql = "select * from " + cl.getSimpleName();
		try {
			System.out.println(sql);
			resultSet = statement.executeQuery(sql);
			System.out.println(i++);

			while (resultSet.next()) {
				System.out.println(i++);
				Object obj = cl.newInstance();
				for (String str : columnsName) {

					for (Field ff : fields) {

						if (str.equals(ff.getName())) {

							ff.setAccessible(true);
							ff.set(obj, resultSet.getObject(ff.getName()));

							break;
						}
					}

				}
				objs.add(obj);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return objs;
	}

	// 添加数据返回主键的方法
	public int addData(Object object) {
		int id = 0;
		Connection connection = DbHelper.getCon();
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;
		String tableName = object.getClass().getSimpleName();
		Field[] fields = object.getClass().getDeclaredFields();
		List<String> allColumns = getColumns(tableName);
		StringBuffer buffer = new StringBuffer();
		StringBuffer buffer1 = new StringBuffer();
		buffer.append("insert into ");
		buffer.append(tableName);
		buffer.append(" (");
		for (int i = 1; i < allColumns.size(); i++) {
			buffer.append(allColumns.get(i));
			buffer1.append("?");
			if (i != allColumns.size() - 1) {
				buffer.append(",");
				buffer1.append(",");
			}

		}
		buffer.append(") values (");
		buffer.append(buffer1);
		buffer.append(")");
		// System.out.println(buffer.toString());
		try {
			preparedStatement = connection.prepareStatement(buffer.toString());
			for (int i = 1; i < allColumns.size(); i++) {

				for (int j = 0; j < fields.length; j++) {

					if ((fields[j].getName()).equals(allColumns.get(i))) {

						fields[j].setAccessible(true);
						if (fields[j].get(object) == null) {
							preparedStatement.setObject(i, "此字段无填充");
						} else {
							preparedStatement.setObject(i,
									fields[j].get(object));
						}

						break;
					}

				}

			}
			int a = preparedStatement.executeUpdate();

			if (a > 0) {
				resultSet = preparedStatement.getGeneratedKeys();
				if (resultSet.next()) {
					id = resultSet.getInt(1);
				}

			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} finally {

			DbHelper.cloRes(connection, preparedStatement, resultSet);
		}
		return id;

	}

	// 根据实体类实现一个或者多个条件查询
	public List getByBean(Object object) {
		List some = new ArrayList();
		Connection connection = DbHelper.getCon();
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			// 得到实体类不为空的属性和属性值
			List<String> listVal = new ArrayList<String>();
			List<String> listField = new ArrayList<String>();
			Field[] fields = object.getClass().getDeclaredFields();
			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);
				// 把id字段除去,知道id就不用查了
				if (fields[i].get(object) != null
						&& !(fields[i].get(object) instanceof Integer)) {
					listVal.add((String) fields[i].get(object));
					listField.add(fields[i].getName());
				}
			}
			// 拼接sql语句
			StringBuffer buffer = new StringBuffer();
			buffer.append("select ");
			buffer.append("*");
			buffer.append(" from ");
			buffer.append(object.getClass().getSimpleName());
			buffer.append(" where ");
			for (int i = 0; i < listField.size(); i++) {
				buffer.append(listField.get(i));
				buffer.append("=");
				buffer.append("‘" + listVal.get(i) + "‘");
				if (i != listField.size() - 1) {
					buffer.append(" and ");
				}

			}
			System.out.println(buffer.toString());
			// 执行查询
			preparedStatement = connection.prepareStatement(buffer.toString());
			resultSet = preparedStatement.executeQuery();

			int count = resultSet.getMetaData().getColumnCount();

			while (resultSet.next()) {
				Object ob = object.getClass().newInstance();
				//获取不含id的列
				List<String> list = getColumns(object.getClass()
						.getSimpleName());
				list.add("id");
				Field[] fields2 = object.getClass().getDeclaredFields();
				for (int j = 0; j < fields2.length; j++) {
					fields2[j].setAccessible(true);
					for (int i = 1; i <= list.size()-1; i++) {
						if (list.get(i).equals(fields2[j].getName())) {
							fields2[j].set(ob, resultSet.getObject(list.get(i)));
						}
					}

				}
				some.add(ob);

			}

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} finally {

			DbHelper.cloRes(connection, preparedStatement, resultSet);
		}
		return some;
	}

	// 更新数据,由实体类封装的id,得到主键,实现更新
	public boolean updateBean(Object object) {
		int id = 0;
		int a = 0;
		Connection connection = DbHelper.getCon();
		Statement statement = null;
		ResultSet resultSet = null;
		Field[] fields = object.getClass().getDeclaredFields();
		// 得到id的值,确定要更新那一条数据
		try {
			for (int i = 0; i < fields.length; i++) {
				fields[i].setAccessible(true);
				if (fields[i].getName().equals("id")) {
					if ((Integer) fields[i].get(object) != 0) {
						id = (Integer) fields[i].get(object);
					} else {
						return false;
					}

				}
			}
			// 拼接 sql 语句
			StringBuffer buffer = new StringBuffer();
			buffer.append("update ");
			buffer.append(object.getClass().getSimpleName());
			buffer.append(" set ");
			List<String> list = getColumns(object.getClass().getSimpleName());
			list.remove("id");
			for (int i = 0; i < list.size(); i++) {
				for (int j = 0; j < fields.length; j++) {
					if (fields[j].getName().equals(list.get(i))) {
						if (fields[j].get(object) != null) {
							buffer.append(list.get(i));
							buffer.append("=");
							buffer.append("‘" + fields[j].get(object) + "‘,");

						}

					}
				}

			}
			buffer.delete(buffer.length() - 1, buffer.length());

			buffer.append(" where id=");
			buffer.append(id);
			System.out.println(buffer.toString());
			statement = connection.createStatement();
			a = statement.executeUpdate(buffer.toString());
			System.out.println(a);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DbHelper.cloRes(connection, statement, resultSet);
		}

		if (a > 0) {
			return true;
		}
		return false;

	}

	public static void main(String[] args) {
		goods c = new goods();
		c.setGoodDetail("我的更改");
		goods good = (goods) new DaoPro().getByBean(c).get(0);
		System.out.println(good.getId());
	}

}

  

时间: 2024-10-15 10:15:22

java JDBC 万能DAO的实现的补充 实现了增删查改的相关文章

java JDBC 万能DAO的实现

数据库和实体类设计好以后,有几个实体类就需要几个Dao吗?显然不是... 利用java的反射机制,一个Dao就可以实现对所有实体类的操作 思路就是,传过来一个实体类,利用实体类得到表,把实体类的每一个字段取出,放到表对应的字段.... 但是,如果实体类字段发生变化,这个时候往数据库插入数据就会出错,原因是表里面没有与实体类属性对应的字段, 这个时候就要用到java的反射机制了 我们首先需要得到表的所有字段,然后得到实体类的所有属性,两个一一比较,实体类中有的属性而数据库没有与之对应的字段,就舍去

Java数据库编程之JDBC增删查改

前言 众多的ORM框架使我们从原生的JDBC编码摆脱出来,但在学习数据库编程之初,应该先掌握底层的JDBC编程,熟练应用后,学起框架才会更得心应手.就像金庸笔下的武侠人物,只要内功深厚,再去学习其他武功绝学,只不过是招式罢了.正所谓,温故而知新,本文回顾了最基础的JDBC增删查改操作. 连接数据库 在之前一篇随笔讲过如何连接数据库——<Java数据库编程之JDBC配置>. 数据库连接工具类 DBConnection package database; import java.sql.*; im

2015.8.2 jdbc实现商品类的增删查改

在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几天茫然无头绪的时候闫老师指点迷津了一下,讲了具体的流程,如下: 1.创建项目2.导入相关JAR3.组织项目结构  util:工具类,公共类  po:实体类对象  dao:数据访问  biz:业务类  view:显示 第一步不多陈述 第二步具体如何配置可以参见蔡振华的博客http://qmkkd.bl

JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql

JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` int(3) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `password` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 2.工程结构    

java实现简单的数据库的增删查改,并布局交互界面

一.系统简介 1.1.简介  本系统提供了学生信息管理中常见的基本功能,主要包括管理员.管理员的主要功能有对学生信息进行增加.删除.修改.查找等操作,对信息进行管理,对信息进行修改.查找等操作. 二.功能设计 2.1  需求分析 21世纪是信息化时代,信息化已更快捷更方便为目标来融入各行各业.学校也不例外.当前,我国的学校正在加紧实施信息化建设,其中学生信息管理是相对重要的 一部分. 目前,社会上信息管理系统发展飞快,各个企事业单位都引入了信息化管理软件来管理自己日益增长的各种信息,学生信息管理

少量代码带你熟悉MongoDB在Java下的增删查改

我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打开mongod.exe,程序运行期间要一直开着. 2.Java项目里面要导入mongo的jar包,mongo-版本号-jar. 以下为代码: public class MongoTest { public static void main(String args[]) throws UnknownH

mvc模式下dao中的增删查改

1.新建Dao包 并创建实体的dao类 2.以DBHelper为基础具体实现增删查改 具体代码如下: public static int insert(User u) { String sql = "insert into user(userID,userName) values(?,?)"; Object[] params = new Object[] { u.getUserID(), u.getUserName() }; return DBHelper.ExecSql(sql, p

JAVA原生mvc实现用户信息的增删查改

笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2.使用ajax交互 目录结构: java目录: 前端目录 需求分析: 1.能够实现用户的登录和注册 2.能够实现对用户信息的增删查改 3.登录过一次的用户保存登录记录,也就是记录session 由于笔者不是很擅长写界面,所以后台界面部分不是写的很好看,这里就先预览一遍 由于代码量太多了,我就把这个项

java 利用注解实现BaseDao 增删查改

第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.ElementType.TYPE; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /* * TableName对应表名称