詳解Java注解實現(xiàn)自己的ORM_第1頁
詳解Java注解實現(xiàn)自己的ORM_第2頁
詳解Java注解實現(xiàn)自己的ORM_第3頁
詳解Java注解實現(xiàn)自己的ORM_第4頁
詳解Java注解實現(xiàn)自己的ORM_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第詳解Java注解實現(xiàn)自己的ORM搞過Java的碼農(nóng)都知道,在J2EE開發(fā)中一個(確切地說,應該是一類)很重要的框架,那就是ORM(ObjectRelationalMapping,對象關系映射)。它把Java中的類和數(shù)據(jù)庫中的表關聯(lián)起來,可以像操作對象那樣操作數(shù)據(jù)表,十分方便。給碼農(nóng)們節(jié)約了大量的時間去摸魚。其實它的本質一點都不復雜,而最核心的就是怎么實現(xiàn)對象和表之間的轉換。之前對反射和注解有了一點了解,所以就試著來實現(xiàn)咱們自己的縫合怪。

首先,需要建立一個「表格」:

/**

*類注解,將類注解成數(shù)據(jù)庫表

*@authorxiangwang

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceDBTable{

Stringname()default"";

}

然后,定義需要的數(shù)據(jù)庫數(shù)據(jù)類型:

/**

*字段類型枚舉

*@authorxiangwang

publicenumType{

CHAR,

STRING,

BOOLEAN,

INTEGER,

LONG,

FLOAT,

DOUBLE,

DATETIME

*數(shù)據(jù)庫字段類型

*@authorxiangwang

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceColumnType{

Typevalue()defaultType.INTEGER;

}

再來完善字段相關信息:

/**

*字段信息

*@authorxiangwang

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceExtraInfo{

Stringname()default"";

intlength()default0;

*明確字段約束

*@authorxiangwang

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceConstraints{

booleanprimaryKey()defaultfalse;

booleanallowNull()defaulttrue;

booleanunique()defaultfalse;

//還可以增加默認值

}

把他們拼起來,成為完整的字段描述:

/**

*拼裝注解,形成完整的字段嵌套注解

*@authorxiangwang

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceTableColumn{

ColumnTypecolumntype()default@ColumnType;

ExtraInfoextrainfo()default@ExtraInfo;

Constraintsconstraints()default@Constraints;

}

最后,創(chuàng)建實體類,應用剛才寫好的這些注解:

/**

*用戶實體類

*@authorxiangwang

@DBTable(name="User")

publicclassUser{

@TableColumn(

columntype=@ColumnType(Type.INTEGER),

extrainfo=@ExtraInfo(name="id",length=4),

constraints=@Constraints(primaryKey=true))

privateStringid;

@TableColumn(

columntype=@ColumnType(Type.STRING),

extrainfo=@ExtraInfo(name="name",length=32),

constraints=@Constraints(primaryKey=false,allowNull=false,unique=true))

privateStringname;

@TableColumn(

columntype=@ColumnType(Type.INTEGER),

extrainfo=@ExtraInfo(name="age",length=4),

constraints=@Constraints(primaryKey=false))

privateIntegerage;

publicStringgetId(){returnid;}

publicvoidsetId(Stringid){this.id=id;}

publicStringgetName(){returnname;}

publicvoidsetName(Stringname){=name;}

publicIntegergetAge(){returnage;}

publicvoidsetAge(Integerage){this.age=age;}

@Override

publicStringtoString(){

return"User[id="+id+",name="+name+",age="+age+"]";

}

來看看ORM是怎么工作的吧:

/**

*解析類型注解

privatestaticStringgetColumnType(ColumnTypecolumntype){

Stringtype="";

switch(columntype.value()){

caseCHAR:

type+="CHAR";

break;

caseSTRING:

type+="VARCHAR";

break;

caseBOOLEAN:

type+="BIT";

break;

caseINTEGER:

type+="INT";

break;

caseLONG:

type+="BIGINT";

break;

caseFLOAT:

type+="FLOAT";

break;

caseDOUBLE:

type+="DOUBLE";

break;

caseDATETIME:

type+="DATETIME";

break;

default:

type+="VARCHAR";

break;

returntype;

*解析信息注解

privatestaticStringgetExtraInfo(ExtraInfoextrainfo){

Stringinfo="";

if(null!=()){

info=();

}else{

returnnull;

if(0extrainfo.length()){

info+="("+extrainfo.length()+")";

}else{

returnnull;

returninfo;

*解析約束注解

privatestaticStringgetConstraints(Constraintscon){

Stringconstraints="";

if(con.primaryKey()){

constraints+="PRIMARYKEY";

if(!con.allowNull()){

constraints+="NOTNULL";

if(con.unique()){

constraints+="UNIQUE";

returnconstraints;

}

做了那么多的鋪墊,終于到了臨門一腳了,實現(xiàn)一個縫合怪了:

/**

*臨門一腳:實現(xiàn)一個縫合怪

privatestaticvoidcreateTable(ListStringlist){

for(StringclassName:list){

Classclazz;

try{

clazz=Class.forName(className);

DBTabledbTable=clazz.getAnnotation(DBTable.class);

if(dbTable==null){//無DBTable注解

continue;

//轉大寫

StringtableName=clazz.getSimpleName().toUpperCase();

StringBuildersql=newStringBuilder("CREATETABLE"+tableName+"(");

for(Fieldfield:clazz.getDeclaredFields()){

//反射得到注解

Annotation[]anns=field.getDeclaredAnnotations();

if(anns.length1){

continue;

StringcolumnInfo="";

//類型判斷

if(anns[0]instanceofTableColumn){

TableColumncolumn=(TableColumn)anns[0];

Stringtype=getColumnType(column.columntype());

columnInfo=getExtraInfo(column.extrainfo());

//代替(

columnInfo=columnInfo.replace("(",type+"(");

columnInfo+=getConstraints(column.constraints());

sql.append("\n"+columnInfo+",");

//刪除尾部的逗號

StringtableCreate=sql.substring(0,sql.length()-1)+"\n);";

System.out.println(tableCreate);

}catch(ClassNotFoundExceptione){

e.printStack

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論