上一篇文章提到,自己在建立表時如果表列特别多比如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.得到的結果如下:
基本上可以把最普通的結果集加上去了,至于id嘛,自己寫!!!
如果有什麼問題,可以評論告訴我!畢竟菜鳥,還望體諒!