java通用dao_Java学习笔记之使用反射+泛型构建通用DAO

该博客介绍了如何使用Java泛型和反射实现一个基础DAO接口的实现类,包括插入(insert)、删除(delete)、更新(update)和查询(select)四个基本操作。代码中定义了常量来标识不同的数据库操作类型,并通过反射获取实体类的字段信息动态生成SQL语句。此外,还使用了PreparedStatement进行参数设置和执行SQL,最后确保资源的释放。
摘要由CSDN通过智能技术生成

packagecom.example.daoimp;importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importcom.example.dao.BaseDao;importcom.example.helper.JdbcDaoHelper;//通用DAO

public class BaseDaoImp implements BaseDao{/**操作常量*/

public static final String SQL_INSERT = "insert";public static final String SQL_UPDATE = "update";public static final String SQL_DELETE = "delete";public static final String SQL_SELECT = "select";private Class EntityClass; //获取实体类

privatePreparedStatement statement;privateString sql;privateObject argType[];privateResultSet rs;

@SuppressWarnings("unchecked")publicBaseDaoImp() {/*** 传递User就是 com.example.daoimp.BaseDaoImp

* 传递Shop就是 com.example.daoimp.BaseDaoImp

**/ParameterizedType type=(ParameterizedType) getClass()

.getGenericSuperclass();/*** 这里如果传递的是User.那么就是class com.example.bean.User

* 如果传递的是Shop. 那么就是class com.example.bean.Shop

**/EntityClass= (Class) type.getActualTypeArguments()[0];

}

@Overridepublic voidadd(T t) {//TODO Auto-generated method stub

sql = this.getSql(SQL_INSERT); //获取sql.//赋值.

try{

argType=setArgs(t, SQL_INSERT);

statement= JdbcDaoHelper.getPreparedStatement(sql); //实例化PreparedStatement.//为sql语句赋值.

statement =JdbcDaoHelper.setPreparedStatementParam(statement,

argType);

statement.executeUpdate();//执行语句.

} catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{

JdbcDaoHelper.release(statement,null); //释放资源.

}

}

@Overridepublic voiddelete(T t) {//TODO Auto-generated method stub

sql = this.getSql(SQL_DELETE);try{

argType= this.setArgs(t, SQL_DELETE);

statement=JdbcDaoHelper.getPreparedStatement(sql);

statement=JdbcDaoHelper.setPreparedStatementParam(statement,

argType);

statement.executeUpdate();

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{

JdbcDaoHelper.release(statement,null);

}

}

@Overridepublic voidupdate(T t) {//TODO Auto-generated method stub

sql = this.getSql(SQL_UPDATE);try{

argType=setArgs(t, SQL_UPDATE);

statement=JdbcDaoHelper.getPreparedStatement(sql);

statement=JdbcDaoHelper.setPreparedStatementParam(statement,

argType);

statement.executeUpdate();

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{

JdbcDaoHelper.release(statement,null);

}

}

@OverridepublicT select(T t) {//TODO Auto-generated method stub

sql = this.getSql(SQL_SELECT);

T obj= null;try{

argType=setArgs(t, SQL_SELECT);

statement=JdbcDaoHelper.getPreparedStatement(sql);

statement=JdbcDaoHelper.setPreparedStatementParam(statement,

argType);

rs=statement.executeQuery();

Field fields[]=EntityClass.getDeclaredFields();while(rs.next()) {

obj=EntityClass.newInstance();for (int i = 0; i < fields.length; i++) {

fields[i].setAccessible(true);

fields[i].set(obj, rs.getObject(fields[i].getName()));

}

}

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}returnobj;

}//sql拼接函数 形如 : insert into User(id,username,password,email,grade) values(?,?,?,?,?)

privateString getSql(String operator) {

StringBuffer sql= newStringBuffer();//通过反射获取实体类中的所有变量

Field fields[] =EntityClass.getDeclaredFields();//插入操作

if(operator.equals(SQL_INSERT)) {

sql.append("insert into " +EntityClass.getSimpleName());

sql.append("(");for (int i = 0; fields != null && i < fields.length; i++) {

fields[i].setAccessible(true); //这句话必须要有,否则会抛出异常.

String column =fields[i].getName();

sql.append(column).append(",");

}

sql= sql.deleteCharAt(sql.length() - 1);

sql.append(") values (");for (int i = 0; fields != null && i < fields.length; i++) {

sql.append("?,");

}

sql.deleteCharAt(sql.length()- 1);//是否需要添加分号

sql.append(")");

}else if(operator.equals(SQL_UPDATE)) {

sql.append("update " + EntityClass.getSimpleName() + " set ");for (int i = 0; fields != null && i < fields.length; i++) {

fields[i].setAccessible(true);

String column=fields[i].getName();if (column.equals("id")) {continue;

}

sql.append(column).append("=").append("?,");

}

sql.deleteCharAt(sql.length()- 1);

sql.append(" where id=?");

}else if(operator.equals(SQL_DELETE)) {

sql.append("delete from " +EntityClass.getSimpleName()+ " where id=?");

}else if(operator.equals(SQL_SELECT)) {

sql.append("select * from " +EntityClass.getSimpleName()+ " where id=?");

}returnsql.toString();

}//获取参数.

privateObject[] setArgs(T entity, String operator)throwsIllegalArgumentException, IllegalAccessException {

Field fields[]=EntityClass.getDeclaredFields();if(operator.equals(SQL_INSERT)) {

Object obj[]= newObject[fields.length];for (int i = 0; obj != null && i < fields.length; i++) {

fields[i].setAccessible(true);

obj[i]=fields[i].get(entity);

}returnobj;

}else if(operator.equals(SQL_UPDATE)) {

Object Tempobj[]= newObject[fields.length];for (int i = 0; Tempobj != null && i < fields.length; i++) {

fields[i].setAccessible(true);

Tempobj[i]=fields[i].get(entity);

}

Object obj[]= newObject[fields.length];

System.arraycopy(Tempobj,1, obj, 0, Tempobj.length - 1);

obj[obj.length- 1] = Tempobj[0];returnobj;

}else if(operator.equals(SQL_DELETE)) {

Object obj[]= new Object[1];

fields[0].setAccessible(true);

obj[0] = fields[0].get(entity);returnobj;

}else if(operator.equals(SQL_SELECT)) {

Object obj[]= new Object[1];

fields[0].setAccessible(true);

obj[0] = fields[0].get(entity);returnobj;

}return null;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值