怎样在JAVA 中封装数据库操作(增删改查)运用反射机制!已贴出删除和查询方法,求增加和修改!

具体情况是,发现自己在编写程序的时候,在数据库增删改查的时候,感觉都重复写了很多代码,但因为自己是初学者的原因,所以想请教下高手,JAVA把sqlserver数据库操作封装成 最终的4个方法:增加 删除 查询 修改。自己会一点反射!
下面是删除和查询,求助大神完善 增加和修改 两个方法!!!!!
package com.shop;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/** JDBC增删查改封装 **/
public class JdbcUtil {

private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

/**
 * 删除方法
 * @param obj
 * @return
 * @throws Exception
 */
public static int delete(Object obj) throws Exception {
/** 声明部分 **/
Class clazz = obj.getClass();// 获取对象反射信息
StringBuffer sql = new StringBuffer("delete from "
+ clazz.getSimpleName() + " where 1=1");
// 获取对象属性信息
Field[] fields = clazz.getDeclaredFields();

/** 拼接SQL语句 **/
for (Field f : fields) {
// 获取对象方法名
String methodName = getMethodNameByField("get", f.getName());
// 获得此方法的反射
Method method = clazz.getDeclaredMethod(methodName);
// 执行方法获取返回值
Object value = method.invoke(obj);
// 判断返回值是否为空,不为空则拼接到sql语句
if (value != null) {
if (f.getType() == String.class) {// 字符类型
sql.append(" and " + f.getName() + "='" + value + "'");
} else if (f.getType() == Date.class
|| f.getType() == Timestamp.class) {
sql.append(" and " + f.getName() + "=to_date('"
+ sdf.format(value) + "','yyyy-MM-dd')");
} else {
sql.append(" and " + f.getName() + "=" + value + "");
}
}
}
System.out.println(sql.toString());
/** 执行SQL语句 **/
Connection conn = null;
PreparedStatement ps = null;
int count = 0;
try {
conn = DbUtil.getConn();
ps = conn.prepareStatement(sql.toString());
count = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DbUtil.closeconn(conn, ps, null);
}
return count;
}

/**
 * 查询方法
 * 
 * @param obj
 * @param params
 * @return
 * @throws Exception
 */
public static List query(Object obj) throws Exception {
/** 声明部分 **/
Class clazz = obj.getClass();// 获取对象反射信息
// 拼接sql语句
StringBuffer sql = new StringBuffer("select * from "
+ clazz.getSimpleName() + " where 1=1");
List resultList = new ArrayList();// 返回结果
/** 拼接SQL **/
// 获取domain类的所有属性
Field[] fields = clazz.getDeclaredFields();
// 循环拼接SQL语句
for (int i = 0; i < fields.length; i++) {
// 根据属性获取get方法名  
String name = getMethodNameByField("get", fields[i].getName());
Method m = clazz.getDeclaredMethod(name);// 获取方法
Object value = m.invoke(obj);
if (value != null) {
// 判断获取到属性值的数据类型
if (fields[i].getType() == String.class) {
// String 字符型
sql.append(" and " + fields[i].getName() + "='" + value
+ "'");
} else if (fields[i].getType() == Date.class
|| fields[i].getType() == Timestamp.class) {
// 日期类型
sql.append(" and " + fields[i].getName() + "=to_date('"
+ sdf.format(value) + "','yyyy-MM-dd')");
} else {
// 其他类型
sql.append(" and " + fields[i].getName() + "=" + value);
}
}
}
/** 执行SQL语句 **/
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DbUtil.getConn();
System.out.println(sql.toString());
ps = conn.prepareStatement(sql.toString());
rs = ps.executeQuery();

/** 封装查询结果 **/
while (rs.next()) {
// 重新创建实体对象
Object obj2 = clazz.getConstructor().newInstance();
for (int i = 0; i < fields.length; i++) {
// 获取domain类的set方法
String name = getMethodNameByField("set",
fields[i].getName());
// 反射回去set方法
Method m = clazz.getDeclaredMethod(name,
fields[i].getType());
// 获取数据
Object value = rs.getObject(i + 1);
if (value != null) {
// 判断获取到属性值的数据类型
if ("BigDecimal".equals(value.getClass()
.getSimpleName())) {
// 数字类型
if (fields[i].getType() == Integer.class) {
// int 整型
m.invoke(obj2, ((BigDecimal) value).intValue());
} else if (fields[i].getType() == Float.class) {
// float 单精度浮点
m.invoke(obj2,
((BigDecimal) value).floatValue());
} else if (fields[i].getType() == Double.class) {
// double 双精度浮点
m.invoke(obj2,
((BigDecimal) value).doubleValue());
}
}
// 日期类型
else if ("Date"
.equals(value.getClass().getSimpleName())) {
if (fields[i].getType() == Timestamp.class) {
// timestamp 日期类型
m.invoke(obj2, (Timestamp) value);
} else {
// date 日期类型
m.invoke(obj2, (Date) value);
}
}
// 其他
else {
m.invoke(obj2, value);
}
}
}
resultList.add(obj2);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DbUtil.closeconn(conn, ps, rs);
}
return resultList;
}

public static String getMethodNameByField(String type, String name) {
return type + name.substring(0, 1).toUpperCase()
+ name.substring(1, name.length());
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package BookTest; import java.awt.*; import java.awt.event.*; import java.util.AbstractQueue; import java.util.Vector; import javax.swing.*; import javax.swing.table.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; import javax.swing.event.*; import javax.swing.table.TableColumnModel; //import DbHelp.OperatorJobs; import Dao.ArrayBook; public class Test extends JFrame { public JPanel jp=null; public String aa; //JTable jTable1 = new JTable(); public JTable jTable1=null; private JTree jTree1; DefaultTableModel mode; private JScrollPane scrollPane = null; DefaultMutableTreeNode node; JButton[] btn={new JButton("增加"),new JButton("删除"),new JButton("修改"),new JButton("查询"),new JButton("重置")}; public JTextField[] txt ={new JTextField(),new JTextField(),new JTextField(),new JTextField(),new JTextField(),new JTextField()}; public String[] str1={"1","summer","boy","20","",""}; public String[] str2={"2","wulei","girl","19","",""}; public String[] str3={"3","west","boy","20","",""}; public String[] str4={"4","fish","girl","18","",""}; public String[] str5={"5","youku","boy","21","",""}; public String[] str6={"6","aa","boy","21","",""}; public String[][] tempData1={str1,str2,str3,str4,str5,str6}; public String[] aa1={"1","summer","boy","20","123","123"}; public String[] aa2={"2","wulei","girl","19","123",""}; public String[] aa3={"3","west","boy","20","123",""}; public String[] aa4={"4","fish","girl","18","1",""}; public String[] aa5={"5","youku","boy","21","12",""}; public String[] aa6={"6","aa","boy","21","123",""}; public String[][] tempData4={aa1,aa2,aa3,aa4,aa5,aa6}; //设置表头数据 public String[] tempTitle={"ID","标题","内容","作者","时间","是否选"}; //设置表格的数据集合 Vector v1=new Vector(); Vecto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值