java 根据实体对象生成 增删改的SQL语句

<pre name="code" class="java">import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Vector;

import org.apache.commons.lang3.reflect.FieldUtils;
/**
 * @author Gary Huang
 * 博客地址:http://blog.csdn.net/hfmbook/article/details/41290641
 * 
 * */
public class UpdateSql {
	private Object target ; 
	
	private String idName ; 
	
	private Object idValue ; 
	
	private SqlType currentType ; 
	
	public enum SqlType {
		INSERT, UPDATE, DELETE 
	}
	
	public UpdateSql(SqlType sqlType, Object target) {
		this.target = target ; 
		switch (sqlType) {
		case INSERT:
			currentType = SqlType.INSERT ;
			createInsert(); 
			break;  
		case UPDATE:
			currentType = SqlType.UPDATE ;
			createUpdate() ; 
			break;
		case DELETE:
			currentType = SqlType.DELETE ;
			createDelete() ;  
			break ;
		}
	}
	/**
	 * 创建跟删除
	 * */
	private void createDelete() {
		String tableName = getTableName() ;
		Field[] fields = target.getClass().getDeclaredFields() ;
		StringBuffer sqlBuffer = new StringBuffer() ; 
		sqlBuffer.append("DELETE FROM ").append(tableName).append(" WHERE ") ;
		for(Field field : fields){
			if(!Modifier.isStatic(field.getModifiers())){
				ID id = field.getAnnotation(ID.class);
				if(null != id){
					sqlBuffer.append( field.getName()).append("=?");
					param.add(readField(field));
				}
			}
		}
		this.sqlBuffer = sqlBuffer.toString();
	}
	
	
	public Object readField(Field field ){
		try {
			return FieldUtils.readField( field , target, true )  ; 
		} catch (Exception e) {
			throw new RuntimeException( currentType.name() ,e ) ;
		}
	}
	
	/**
	 * 创建跟新语句
	 * */
	private void createUpdate() {
		String tableName = getTableName() ;
		Field[] fields = target.getClass().getDeclaredFields() ;
		StringBuffer sqlBuffer = new StringBuffer() ; 
		sqlBuffer.append("UPDATE ").append(tableName).append(" SET ") ; 
		 
			for(Field field : fields){
				if(!Modifier.isStatic(field.getModifiers())){
					ID id = field.getAnnotation(ID.class);
					if(id == null){
						sqlBuffer.append( field.getName()).append("=?") ; 
						param.add( readField(field)  ) ;  
					}else{
						idName = field.getName() ; 
						idValue = readField(field)   ; 
					}
				}
			}
			if(idName == null){
				throw new RuntimeException( "not found of " + target.getClass() + "'s ID") ; 
			}
			sqlBuffer.append(" WHERE ").append(idName)
			.append("=?") ;
			param.add( idValue );
		 
		this.sqlBuffer = sqlBuffer.toString() ;
	}

	/**
	 * 根据注解获取表名
	 * */
	private String getTableName() {
		String tableName = null ;
		Class<?> clazz = target.getClass() ;
		Table table = clazz.getAnnotation(Table.class) ; 
		if(null != table){
			tableName = table.name() ;
			if("".equalsIgnoreCase(tableName)){
				tableName = clazz.getSimpleName() ;
			}
		}else{
			tableName = clazz.getSimpleName() ;
		}
		return tableName ;
	}
	
	/**
	 * 创建插入语句
	 * */
	private void createInsert() {
		String tableName = getTableName() ;
		Field[] fields = target.getClass().getDeclaredFields() ;
		StringBuffer sqlBuffer = new StringBuffer() ; 
		sqlBuffer.append("INSERT INTO ").append(tableName)
		.append("(");
		 
			for(Field field : fields){
				if(!Modifier.isStatic(field.getModifiers())){
					ID id = field.getAnnotation(ID.class);
					if(id == null){
						sqlBuffer.append( field.getName()).append(",") ; 
						param.add( readField(field) ) ; 
					}
				}
			}
			int length = sqlBuffer.length() ;
			sqlBuffer.delete(length-1, length).append(")values("); 
			int size = param.size() ;
			for(int x=0;x<size;x++){
				if(x != 0){
					sqlBuffer.append(",") ;  
				}
				sqlBuffer.append("?") ; 
			}
			sqlBuffer.append(")");
		 
		
		this.sqlBuffer = sqlBuffer.toString() ;
	}
	
	private List<Object> param = new Vector<Object>();

	private String sqlBuffer;

	public List<Object> getParam() {
		return param;
	}

	public String getSqlBuffer() {
		return sqlBuffer;
	}
	
	public String getIdName() {
		return idName;
	}

	public Object getIdValue() {
		return idValue;
	}
	
	@java.lang.annotation.Target(value={java.lang.annotation.ElementType.TYPE})
	@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
	public @interface Table {
		String name() default "";
	}
	
	@java.lang.annotation.Target(value={java.lang.annotation.ElementType.FIELD})
	@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
	public @interface ID{
	}
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。