package com.fang.bbks.common.persistence.jdbc;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.Resource;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.StringUtils;
/**
* @Intro mysql实现
* @author Lee
* @Date 2013-8-13
*/
public abstract class BaseDaoMySqlImpl<T, ID extends Serializable> extends JdbcDaoSupport implements BaseDao<T, ID>{
public final Log log = LogFactory.getLog(this.getClass());
private Class<T> persistentClass;
private String tableName = "";
private String pk = "";
private GenerationType strategy;
protected List<String> transientPropertys=new ArrayList<String>();
protected BaseDaoMySqlImpl(Class<T> persistentClass){
this.persistentClass=persistentClass;
Table table = AnnotationUtils.findAnnotation(persistentClass, Table.class);
if(table == null){
throw new RuntimeException(persistentClass + "没有定义的@table");
}
this.tableName = table.name();
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(persistentClass);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
Id id = AnnotationUtils.findAnnotation(pd.getReadMethod(), Id.class);
if(pk.equals("") && id != null){
pk = pd.getName();
GeneratedValue gv = AnnotationUtils.findAnnotation(pd.getReadMethod(), GeneratedValue.class);
if(gv == null){
strategy = GenerationType.IDENTITY;
}else{
strategy = gv.strategy();
}
}
Transient transient_ = AnnotationUtils.findAnnotation(pd.getReadMethod(), Transient.class);
if(transient_ == null){
transientPropertys.add(pd.getName());
}
}
if("".equals(this.getPk())){
throw new RuntimeException(persistentClass+"类型没有在get方法上定义@Id");
}
}
protected BaseDaoMySqlImpl(){}
@Resource(name="jdbcTemplate")
public void setJDBC(JdbcTemplate jdbc){
super.setJdbcTemplate(jdbc);
}
@Override
public String getPk() {
return pk;
}
@Override
public String getTableName() {
return tableName;
}
@Override
public List<T> getAll() {
StringBuilder sb=new StringBuilder("select * from ");
sb.append(this.getTableName());
return this.search(sb.toString(), null);
}
@Override
public ID addReturnId(String sql, List<Object> values) {
// TODO Auto-generated method stub
return null;
}
@Override
public T save(T t) {
// TODO Auto-generated method stub
return null;
}
@Override
public int[] batchAdd(String sql, Object[][] values) {
// TODO Auto-generated method stub
return null;
}
@Override
public int del(String sql, Object[] values) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(String sql, Object[] values) {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getLong(String sql, Object[] values) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getInt(String sql, Object[] values) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<T> search(String sql, Object[] values) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> List<T> search(String sql,Object[] values, Class<T> e) {
if(StringUtils.isEmpty(sql))
return new ArrayList<T>();
if(values==null || values.length < 1){
values = new Object[]{};
}
if(log.isDebugEnabled()){
log.debug("sql : "+sql+" values:"+ values );
}
@SuppressWarnings("unchecked")
List<T> list = this.getJdbcTemplate().query(sql, values,new BeanPropertyRowMapper<T>((Class<T>) this.persistentClass));
return list == null ? new ArrayList<T>() : list;
}
@Override
public List<T> search(T t) {
// TODO Auto-generated method stub
return null;
}
@Override
public T searchOne(T t) {
// TODO Auto-generated method stub
return null;
}
@Override
public Paging<T> search(T t, Paging<T> Paging) {
Map<String, Object> map;
try {
map = BeanUtils.getInstance().describe(t);
for(String property : transientPropertys){
map.remove(property);
}
} catch (Exception e) {
throw new DaoException("模型解析失败!",e);
}
return this.search(map, Paging);
}
@Override
public List<Map<String, Object>> searchForMap(String sql,
List<Object> values) {
return null;
}
@Override
public Paging<T> search(String sql, Object[] values, Paging<T> Paging) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> Paging<T> search(String sql, Object[] values, Paging<T> Paging,
Class<T> e) {
// TODO Auto-generated method stub
return null;
}
@Override
public T update(T t) {
// TODO Auto-generated method stub
return null;
}
@Override
public int[] batchSave(List<T> list) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getCount(String sql, Object[] values) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int delByIds(List<ID> ids) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int del(ID id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<T> getByIds(List<ID> ids) {
// TODO Auto-generated method stub
return null;
}
@Override
public T get(ID id) {
// TODO Auto-generated method stub
return null;
}
@SuppressWarnings("unchecked")
protected Paging<T> search(Map<String, Object> map, Paging<T> pageBean) {
ID id=(ID) map.get(this.getPk());
if(map!=null&&id!=null){
map.remove(id);
}
List<String> removekeys=new ArrayList<String>();
for(Entry<String,Object> entry:map.entrySet()){
if(entry.getValue()==null){
removekeys.add(entry.getKey());
}
}
for(String key:removekeys){
map.remove(key);
}
Object[] values = new Object[map.size()];
int i = 0;
StringBuilder sb=new StringBuilder("select * from ");
sb.append(this.getTableName());
if(map.size()!=0){
sb.append(" where ");
for(Entry<String,Object> entry:map.entrySet()){
sb.append(entry.getKey());
sb.append("=? ");
values[i++] = entry.getValue();
sb.append(" and ");
}
}
this.deleteLastStr(sb, "and");
this.search(sb.toString(), values, pageBean);
return pageBean;
}
private void deleteLastStr(StringBuilder sb,String str){
int index = sb.lastIndexOf(str);
if(index!=-1){
sb.delete(index, index+str.length());
}
}
}