1. 定义通用Dao接口
package utils;
import java.util.List;
public interface GenicaDao<T,PK> {
public List<T> findAll(Integer currentPage, Integer limit);
public List<T> findAll();
public T findByPK(PK id);
public boolean delByPK(PK id);
public boolean add(T t);
public boolean update(T t);
}
2.通用DAO的实现类
package utils;
import annotion.Column;
import annotion.Id;
import annotion.Relation;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GenicaDaoImpl<T, PK extends Serializable> implements GenicaDao<T, PK> {
private Class<T> tClazz = null;
private Class<PK> pkClazz = null;
String tableName = null;
String pk = null;
private static final Logger logger = LoggerFactory.getLogger(GenicaDaoImpl.class);
public GenicaDaoImpl() {
tClazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
pkClazz = (Class<PK>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
tableName = DaoUtil.getTable(tClazz);
pk = DaoUtil.getPK(tClazz);
}
@Override
public List<T> findAll(Integer currentPage, Integer limit) {
currentPage = (currentPage - 1) * limit;
String sql = "select * from " + tableName + " limit ?,?";
return DaoUtil.queryList(tClazz, sql, currentPage, limit);
}
@Override
public List<T> findAll() {
String sql = "select * from " + tableName;
return DaoUtil.queryList(tClazz, sql);
}
@Override
public T findByPK(PK id) {
T t = null;
String sql = "select * from " + tableName + " where " + pk + "=?";
t = DaoUtil.query(tClazz, sql, id);
return t;
}
@Override
public boolean delByPK(PK id) {
String sql = "delete from " + tableName + " where " + pk + "=?";
return DaoUtil.update(sql, id);
}
@Override
public boolean add(T t) {
String sql = "insert into " + tableName + "(";
StringBuffer sb = new StringBuffer(sql);
Map map = DaoUtil.getNameAndValue(tClazz);
Object[] params = new Object[tClazz.getDeclaredFields().length - 1];
String id = DaoUtil.getPK(tClazz);
int index = 0;
try {
for (Object key : map.keySet()) {
String methodName = "get" + getName(map.get(key).toString());
Method method = tClazz.getDeclaredMethod(methodName);
Field field = tClazz.getDeclaredField(map.get(key).toString());
if (id != key&&!field.isAnnotationPresent(Relation.class)) {
params[index] = method.invoke(t);
sb.append(key.toString() + ",");
index++;
}
if(field.isAnnotationPresent(Relation.class)){
Field[] rfields = field.getType().getDeclaredFields();
for(Field rfield: rfields){
if (rfield.isAnnotationPresent(Id.class)){
rfield.setAccessible(true);
String rMethodName = "get"+getName(rfield.getName());
Method rMethod = field.getType().getDeclaredMethod(rMethodName);
params[index]=rMethod.invoke(method.invoke(t));
index++;
break;
}
}
sb.append(key.toString() + ",");
}
}
sb = new StringBuffer(sb.substring(0,sb.length()-1));
sb.append(") values(");
for(int i=0;i<index;i++){
if(i+1!=index){
sb.append("?,");
}else {
sb.append("?)");
}
}
return DaoUtil.update(sb.toString(), params);
} catch (NoSuchMethodException | IllegalAccessException |InvocationTargetException |NoSuchFieldException e) {
logger.error("GenicaDaoImpl类add方法异常",e);
}
return false;
}
@Override
public boolean update(T t) {
StringBuffer sb = new StringBuffer("update " + tableName + " set ");
Field[] fields = tClazz.getDeclaredFields();
Object[] params = new Object[fields.length + 1];
boolean flag = false;
Object id = null;
try {
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
String methodName = "get" + getName(fields[i].getName());
Method method = tClazz.getDeclaredMethod(methodName);
if (fields[i].isAnnotationPresent(Id.class)) {
String pk = fields[i].getAnnotation(Id.class).value();
if (pk == null || pk.equals("")) {
sb.append(fields[i].getName() + "=?");
} else {
sb.append(pk + "=?");
}
flag = true;
params[i] = method.invoke(t);
} else if (fields[i].isAnnotationPresent(Column.class)) {
sb.append(fields[i].getAnnotation(Column.class).value() + "=?");
params[i] = method.invoke(t);
} else if (fields[i].isAnnotationPresent(Relation.class)) {
Object fk = null;
sb.append(fields[i].getAnnotation(Relation.class).value() + "=?");
Field[] rfields = fields[i].getType().getDeclaredFields();
for (Field rfield : rfields) {
if (rfield.isAnnotationPresent(Id.class)) {
rfield.setAccessible(true);
String rMethodName = "get" + getName(rfield.getName());
Method rMethod = fields[i].getType().getDeclaredMethod(rMethodName);
fk = rMethod.invoke(method.invoke(t));
System.out.println(fk);
break;
}
}
params[i] = fk;
} else {
sb.append(fields[i].getName() + "=?");
params[i] = method.invoke(t);
}
if (i + 1 != fields.length) {
sb.append(",");
}
if (flag) {
params[fields.length] = params[i];
flag = false;
}
}
sb.append(" where " + pk + "=?");
return DaoUtil.update(sb.toString(), params);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
logger.error("GenicaDaoImpl类update方法异常",e);
}
return false;
}
public static String getName(String name) {
name = name.substring(0, 1).toUpperCase() + name.substring(1);
return name;
}
}
3.接口继承于接口
package dao;
import model.RotationImg;
import utils.GenicaDao;
public interface RotationImgDao extends GenicaDao<RotationImg,Integer> {
}
4.实现类继承于实现类
package dao.impl;
import dao.RotationImgDao;
import model.RotationImg;
import utils.GenicaDao;
import utils.GenicaDaoImpl;
public class RotationImgDaoImpl extends GenicaDaoImpl<RotationImg,Integer> implements RotationImgDao {
}