天天看點

自動生成mybatis中resultMap結果集     注意:這種方法僅适用于加了@Column注解的實體類

       上一篇文章提到,自己在建立表時如果表列特别多比如100多個字段時,mybatis中寫公共查詢字段baseColumn 或者resultMap時特别麻煩,用的是建立表時的sql腳本摘出來某些字段進行操作,但是并不是每次都會有現成的腳本供我們使用,是以我在原有的基礎上進行了改良,将entity實體類,通過反射的技術将屬性和列名擷取到,拼接成resultMap的項。

     注意:這種方法僅适用于加了@Column注解的實體類

1.首先你的實體類得是加了列注解的,比如:

package entity;

import javax.persistence.Column;

public class Animal {

	@Column(name="ANIMAL_NAME")
	private String AnimalName;
	
	@Column(name="ANIAL_AGE")
	private String AnimalAge;
	
	public String getAnimalName() {
		return AnimalName;
	}
	public void setAnimalName(String animalName) {
		AnimalName = animalName;
	}
	public String getAnimalAge() {
		return AnimalAge;
	}
	public void setAnimalAge(String animalAge) {
		AnimalAge = animalAge;
	}
	public Animal() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Animal(String animalName, String animalAge) {
		super();
		AnimalName = animalName;
		AnimalAge = animalAge;
	}
	@Override
	public String toString() {
		return "Animal [AnimalName=" + AnimalName + ", AnimalAge=" + AnimalAge + "]";
	}
	
	
}
           

2.我封裝了一個model用來将需要的列資料進行儲存;

package test.zytest;

public class ResultMapModel {

	private String attribute ; //entity中屬性的名稱
	
	private String column;  //表中的類名
	
	private String columType;  //jdbctype類型
	
	private int level;  //所在類的級别,最基礎為0,父類為1,祖父類2.。。以此類推

	public String getAttribute() {
		return attribute;
	}

	public void setAttribute(String attribute) {
		this.attribute = attribute;
	}

	public String getColumn() {
		return column;
	}

	public void setColumn(String column) {
		this.column = column;
	}

	public String getColumType() {
		return columType;
	}

	public void setColumType(String columType) {
		this.columType = columType;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}
	
}
           

3.最主要的代碼要來了,先說說思想吧,先通過一個類找到他的所有屬性,然後再找他的父類直到得到Object.class;

通過字元串拆分擷取到屬性的名稱和類型以及目前類的級别,同一級别的屬性值相同;

public class PostConnectionTest {
	 private static Logger logger = Logger.getLogger(PostConnectionTest.class);

	    public static void main(String[] args) {
	    	String programFix = "entity"; //包字首
	    	Object model = new Animal();
	    	List<ResultMapModel> reflex2 = getAttributeByReflex(model,programFix);
	    	for (ResultMapModel m : reflex2) {
				System.out.println("<result column=\""+m.getColumn()+"\" property=\""+
						m.getAttribute()+"\" jdbcType=\""+m.getColumType()+"\" />");
			}
	    }
	    private static List<ResultMapModel> getAttributeByReflex(Object object,String programFix) {
			Field[] fields = null;
			List<ResultMapModel> results = new ArrayList<ResultMapModel>();
			int count = 0;
			//通過反射查詢其父類
			for(Class<?> clazz = object.getClass();clazz!=Object.class;clazz = clazz.getSuperclass()){
				//擷取到該類下所有的屬性
				fields = clazz.getDeclaredFields();
				for (Field field : fields) {
					//對field進行拆分處理   private java.lang.String Entity.Animal.AnimalName
					ResultMapModel result = new ResultMapModel();
					String[] split = field.toString().split(" ");
					for (int i = 0; i < split.length; i++) {
						if(split[i].startsWith(programFix)){
							String[] split2 = split[i].split("\\.");
							String string = split2[split2.length-1];
							//擷取到最後一個項,并且把目前類下的屬性值都設為同一個
							result.setAttribute(string);
							result.setLevel(count);
						}
					}
					//擷取field的類型
					//Class<?> type = field.getType();可以直接通過自帶的type方法擷取屬性類型
					String[] types = split[1].split("\\.");
					String strType = types[types.length-1]; //擷取目前屬性的類型
					if("long".equals(strType)||"Integer".equals(strType)||"int".equals(strType)){ 
						result.setColumType("DECIMAL");
					}else if("String".equals(strType)){
						result.setColumType("VARCHAR");
					}else if("Date".equals(strType)){
						result.setColumType("TIMESTAMP");
					}
					results.add(result);
				}
				count++;
			}
			List<ResultMapModel> list = getCoumnByReflex(object,results);
			return list;
		}
	    private static List<ResultMapModel> getCoumnByReflex(Object object,List<ResultMapModel> model) {
	    	
	    	List<String> list = new ArrayList<String>();
	    	int count = 0;
	    	for(Class<?> clazz = object.getClass();clazz!=Object.class;clazz = clazz.getSuperclass()){
	    		Field field;
	    		try {
	    			for(ResultMapModel mapModel : model){
	    				if(mapModel!=null && count == mapModel.getLevel()){
	    					field = clazz.getDeclaredField(mapModel.getAttribute());
	    					//通過擷取注解資訊得到資料庫列資訊
	    					Column column = field.getAnnotation(Column.class); 
	    					if(column == null){
	    						continue;
	    					}
	    					String name = column.name();
	    					mapModel.setColumn(name);
	    				}
	    			}
	    			count++;
	    		} catch (Exception e) {
	    			e.printStackTrace();
	    		} 
	    	}
	    	return model;
	    }
}
           

4.得到的結果如下:

自動生成mybatis中resultMap結果集     注意:這種方法僅适用于加了@Column注解的實體類

 基本上可以把最普通的結果集加上去了,至于id嘛,自己寫!!!

如果有什麼問題,可以評論告訴我!畢竟菜鳥,還望體諒!

繼續閱讀