java JDBC 万能DAO的实现

数据库和实体类设计好以后,有几个实体类就需要几个Dao吗?显然不是。。。

利用java的反射机制,一个Dao就可以实现对所有实体类的操作

思路就是,传过来一个实体类,利用实体类得到表,把实体类的每一个字段取出,放到表对应的字段。。。。

但是,如果实体类字段发生变化,这个时候往数据库插入数据就会出错,原因是表里面没有与实体类属性对应的字段,

这个时候就要用到java的反射机制了

我们首先需要得到表的所有字段,然后得到实体类的所有属性,两个一一比较,实体类中有的属性而数据库没有与之对应的字段,就舍去,这就是基本的思路

代码如下:


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.goods;

/**
* 2015.7.20 利用java反射实现万能DAO 即使bean层的实体类字段改变 也能实现增删查改
*
* @author    lp
*/
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 void addData(Object object) {
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();
System.out.println(a);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {

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

}

public static void main(String[] args) {
goods c = new goods();
new DaoPro().addData(c);
}

}

  

时间: 2024-08-24 10:04:04

java JDBC 万能DAO的实现的相关文章

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

有了这个类  ,基本后台的所有逻辑操作都能实现,后端雏形就算搭建出来了 说说写这个类遇到的坑 1.Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6   ResultSetMetaData中的getColumnCount()方法是从1开始的 代码如下: resultSet = DbHelper.getStatement().executeQuery(sql); ResultS

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

Java JDBC高级特性

1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现了批处理.测试表结构如下: Statement批处理程序示例 1 package server; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 impor

Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 及sql2008外围服务器

转载:Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 错误原因如下: Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConver

第15篇-JAVA JDBC编程

第15篇-JAVA JDBC编程 每篇一句 :对于勇敢者,尝试是一条崭新的生活之路 初学心得: 但对于坎坷与泥泞,能以平常之心视之,就非常不容易 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-08| JAVA JDBC编程 ] 1.JDBC概述 通过使用JDBC API,Java程序可以非常方便地操作各种主流数据库,这是是Java语言的巨大魅力所在 由于Java语言的跨平台特性,所以使用JDBC API所编写的程序不仅可以实现跨数据库,还可以跨平台,具有非常优秀的可移植性

java JDBC 数据库链接

1.准备环境搭建: myeclipse,sql2005,jdbc. 2.都下载完之后开始进行安装 ,前两个是属于数据库软件,正常安装即可(注意数据库登陆不要使用windows验证) <1> 将JDBC解压缩到任意位置,比如解压到C盘program files下面,并在安装目录里找到sqljdbc.jar文件,得到其路径开始配置环境变量 在环境变量classpath 后面追加 C:\Program Files\Microsoft SQL Server2005 JDBC Driver\sqljdb

java jdbc操作SQLServer数据库

public static void main(String args[]){         System.out.println(321);         PreparedStatement ps = null;         ResultSet rs = null;         Connection ct = null;         try{             Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDri

java jdbc操作mysql

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet; public class test {    public static final String DBDRIVER = "com.mysql.jdbc.Driver";    // 定义MySQL数据库的连接地址    public static fi

Java JDBC批处理插入数据操作

在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及如何优化批量操作. 首先,使用Java JDBC基本的API批量插入数据到数据库中. Simple Batch - 简单批处理    我把它叫做简单批处理.要求很简单,执行批量插入列表,而不是为每个INSERT语句每次提交数据库,我们将使用JDBC批处理操作和优化性能. 想想一下下面的代码: Bad