




版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡工程師真實經(jīng)驗分享試題及答案
- 安全短視頻考試題及答案
- 計算機軟件測試的常見問題分析試題及答案
- 機電工程智能化趨勢考題及答案
- 軟考網(wǎng)絡知識點試題及詳細答案
- 時間管理的有效策略與案例試題及答案
- 網(wǎng)絡裝備選型問題試題及答案
- 軟考網(wǎng)絡工程師試題及答案現(xiàn)代視角2025年
- 信息系統(tǒng)項目管理的最佳實踐與經(jīng)驗分享試題及答案
- 機電工程經(jīng)典案例試題及答案
- 2024年廣東省中考生物+地理試卷(含答案)
- 社區(qū)矯正人員心理健康講座模板課件
- 江蘇蘇州昆山2022-2023學年小升初考試數(shù)學試卷含答案
- 掘進機行走部減速器設計畢業(yè)設計論文
- 學校少先隊隊前知識闖關活動方案
- FZ/T 52004-2007充填用中空滌綸短纖維
- 西方合唱發(fā)展史課件
- 基本安全之個人求生新版課件
- 自然資源保護法案例分析
- 產(chǎn)品質量法企業(yè)培訓講座課件
- 路基路面工程試卷及答案二十套期末復習
評論
0/150
提交評論