java使用反射实现对数据库的增删改查

本文介绍了如何使用Java反射API实现对数据库的增删改查操作。通过定义BaseDao接口,接口中包含了add、update、delete和query方法,利用反射技术可以动态地根据传入的对象和注解进行数据库操作。同时,CurrentUtil工具类用于实现分页查询功能,提高了代码的可复用性和灵活性。

CurrentUtil 是一个分页工具类  在查找的时候使用

接口

package com.dao;


import java.util.List;


import com.util.CurrentUtil;


public interface BaseDao<T> {


/**
*@param t
*@return
*@作者Administrator
*@作用 数据库添加
*@要求 类名与数据库表名一致,字段名以及类型与属性一致
*/
public<T> int add(T t);

/**
*@param t
*@return
*@作者Administrator
*@作用 数据库修改
*@要求 主键Id加注解 注解明为IsId 
*/
public<T> int update(T t);

/**
*@param t
*@return
*@作者Administrator
*@作用 删除数据
*@要求 主键Id加注解 注解明为IsId 且为第一个注解
*/
public<T> int delete(T... t);


/**
*@param cu
*@return
*@作者Administrator
*@作用 根据工具类来获取当前页数据
*/
public<T> List<T> query(CurrentUtil cu);



/**
*@param t
*@return
*@作者Administrator
*@作用 根据传入的类的对象来简易获取表里面的数据条数
*/
public<T> int queryCount(T t);
}     







实现类


package com.dao.impl;


import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


import com.dao.BaseDao;
import com.util.CurrentUtil;
import com.util.JdbcUtil;
import com.util.JdbcUtil2;

public class BaseDaoImpl implements BaseDao{

private Connection con;

/** (non-Javadoc)
* @see com.dao.BaseDao#add(java.lang.Object)
* 添加数据
*/
public int add(Object t) {

PreparedStatement pre=null;
try{
Class<? extends Object> c=t.getClass();
StringBuffer sb=new StringBuffer("insert into ");
String tableName=c.getSimpleName();//获取类名 即为 表名
sb.append(tableName+" (");

Field[] fields=c.getDeclaredFields();//获取所有属性数组
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
sb.append(fields[i].getName());
if(i!=fields.length-1){
sb.append(",");
}
}
sb.append(") values(");
for (int i = 0; i < fields.length; i++) {
sb.append("?");
if(i!=fields.length-1){
sb.append(",");
}else{
sb.append(")");
}
}
pre = JdbcUtil.getOracleCon().prepareStatement(sb.toString());
for (int i = 0; i < fields.length; i++) {
Object o=fields[i].get(t);//获取属性值
String type=fields[i].getType().getSimpleName();//获取属性类型
if("String".equals(type)){
if(o==null){
pre.setString((i+1),"");
}else{
pre.setString((i+1), o.toString());
}
}else if("int".equals(type)){
if(o==null){
pre.setInt((i+1),0);
}else{
pre.setInt(i+1, Integer.parseInt(o.toString()));
}
}else if("float".equals(type)){
if(o==null){
pre.setFloat((i+1),0f);
}else{
pre.setFloat(i+1,Float.parseFloat(o.toString()));
}
}else if("Date".equals(type)){
if(o==null){
pre.setDate((i+1),new Date(0));
}else{
pre.setDate(i+1,Date.valueOf(o.toString()));
}
}
}
return pre.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeCon(null, pre, null);
}
return 0;
}

/** (non-Javadoc)
* @see com.dao.BaseDao#update(java.lang.Object)
* 修改数据
* 要求 必须在主键上加注注解 注解为 IsId
*/
public int update(Object t) {
PreparedStatement pre=null;
try{
Class<? extends Object> c=t.getClass(); //加载反射
StringBuffer sb=new StringBuffer("update ");
String tableName=c.getSimpleName();//获取类名 即为 表名
sb.append(tableName+" t set ");
String id="";//主键Id
String idValue="";//主键Id值
String sql="";
Object obj=null;
Field[] fields=c.getDeclaredFields();//获取属性列表
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
obj=fields[j].get(t);//获取属性
String type=fields[j].getType().getSimpleName();//获取属性类型
String tname=fields[j].getName();//获取属性名
if(obj!=null){
if(fields[j].getDeclaredAnnotations().length<1||!"IsId".equals(fields[j].getAnnotations()[0].annotationType().getSimpleName())){
if("String".equals(type)){
sb.append(tname+"='"+obj+"',");
}else if("Date".equals(type)){
sb.append(tname+"=to_date('"+obj+"','yyyy-mm-dd'),");
}else{
sb.append(tname+"="+obj+",");
}
// else if("int".equals(type)){
// sb.append(tname+"="+obj+",");
// }else if("float".equals(type)){
// sb.append(tname+"="+obj+",");
// }else if("Date".equals(type)){
// sb.append(tname+"="+obj+",");
// }else if("double".equals(type)){
// sb.append(tname+"="+obj+",");
// }
}else{ //判断如果有注解 则认定此是主键Id 获取到相应的值以便之后使用
idValue=obj.toString();
id=tname;
}
}
}
sb=new StringBuffer(sb.substring(0,sb.lastIndexOf(",")));
sb.append(" where t."+id+"='"+idValue+"'");
sql=sb.toString();
pre=JdbcUtil.getOracleCon().prepareStatement(sql);
return pre.executeUpdate();
}catch(Exception e){
e.printStackTrace();
return 0;
}finally{
JdbcUtil.closeCon(null, pre, null);
}

}


/** (non-Javadoc)
* @see com.dao.BaseDao#delete(T[])
* 数据库删除
* 主键Id加注解
*/
public int delete(Object... t) {
PreparedStatement pre=null;
try{
Class<? extends Object> c=t[0].getClass();
StringBuffer sb=new StringBuffer("delete ");
String tableName=c.getSimpleName();//获取类名 即为 表名
sb.append(tableName+" t where t.");
String id="";
String sql="";
boolean isFirst=true;
Object obj=null;
for (int i = 0; i < t.length; i++) {
Class<? extends Object> cs=t[i].getClass();
Field[] fields=cs.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
obj=fields[j].get(t[i]);
if(obj==null){
continue;
}
if(fields[j].getDeclaredAnnotations().length>0&&"IsId".equals(fields[j].getAnnotations()[0].annotationType().getSimpleName())){
id=fields[j].getName();
if(isFirst){
sb.append(id+" in (");
isFirst=false;
}
sb.append("'"+obj+"'");
if(i!=t.length-1){
sb.append(",");
}else{
sb.append(")");
}
}

}
}
sql=sb.toString();
pre=JdbcUtil.getOracleCon().prepareStatement(sql);
return pre.executeUpdate();
}catch(Exception e){
e.printStackTrace();
return 0;
}finally{
JdbcUtil.closeCon(null, pre, null);
}
}


/** (non-Javadoc)
* @see com.dao.BaseDao#query(com.util.CurrentUtil)
* @要求 工具类要有一个Object 属性,该属性需初始化要查询的表的一个对象,如果该对象的String属性都没值则会返回该表当前页的数据
* 默认一页显示为全部
*/
public List<?> query(CurrentUtil cu) {
PreparedStatement pre = null;// 定义预编译语句对象
ResultSet result = null;// 定义一个结果集对象
List list=new ArrayList(); //定义返回集合
String sql="";
Object obj=cu.t;
try{
Class<?> c=obj.getClass(); //根据类名获取Class对象
String cName=c.getSimpleName(); //获取简写的类名 即为表名
StringBuffer sb=new StringBuffer("select * from (select t.*,rownum r from "+cName+" t where 1=1 ");
Field[] fields=c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Object value=fields[i].get(obj);
String type=fields[i].getType().getSimpleName();//获取属性类型
String tname=fields[i].getName();//获取属性名
if(value!=null){
if("String".equals(type)){
sb.append(" and t."+tname+"='"+value+"'");
}
}
}
sb.append(") a where a.r>="+cu.startPage+" and a.r<="+cu.endPage);
sql=sb.toString();

pre = JdbcUtil.getOracleCon().prepareStatement(sql);
result=pre.executeQuery();
while(result.next()){
Object ins=c.newInstance();
for (int i = 0; i < fields.length; i++) {
String type=fields[i].getType().getSimpleName();//获取属性类型
String tname=fields[i].getName();//获取属性名
if("String".equals(type)){
fields[i].set(ins, result.getString(tname));
}else if("Date".equals(type)){
fields[i].set(ins, result.getDate(tname));
}else if("int".equals(type)){
fields[i].set(ins, result.getInt(tname));
}else if("double".equals(type)){
fields[i].set(ins, result.getDouble(tname));
}else if("float".equals(type)){
fields[i].set(ins, result.getFloat(tname));
}
}
list.add(ins);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeCon(null, pre, null);
}
return list;
}

public int queryCount(Object t) {
PreparedStatement pre = null;// 定义预编译语句对象
ResultSet result = null;// 定义一个结果集对象
int count =0;
String sql="";
Object obj=t;
try{
Class<?> c=obj.getClass(); //根据类名获取Class对象
String cName=c.getSimpleName(); //获取简写的类名 即为表名
StringBuffer sb=new StringBuffer("select count(*) count from "+cName+" t where 1=1 ");
//) a where a.r>=? and a.r<=?
Field[] fields=c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Object value=fields[i].get(obj);
String type=fields[i].getType().getSimpleName();//获取属性类型
String tname=fields[i].getName();//获取属性名
if(value!=null){
if("String".equals(type)){
sb.append(" and t."+tname+"='"+value+"'");
}
// else if("Date".equals(type)){
// sb.append(tname+"=to_date('"+obj+"','yyyy-mm-dd'),");
// }else{
// sb.append(tname+"="+obj+",");
// }
}
}
sql=sb.toString();
pre = JdbcUtil.getOracleCon().prepareStatement(sql);
result=pre.executeQuery();
while(result.next()){
count=result.getInt("count");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeCon(null, pre, null);
}
return count;

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值