利用反射,註解獲取建表的sql

2021-07-27 22:46:35 字數 4252 閱讀 8825

前言:因為專案很老,還是用的原生sqlite,因為建表還是手動構建sql,cursor轉bean或者list都不靈活,特此用反射註解做了優化處理

首先建立我們的標註,有tablename,primary,notnull,defaulttext,defaultint,defaultdecimal,autoincrement

@target(elementtype.type)

@retention(retentionpolicy.runtime)

public @inte***ce

tablename

@target(elementtype.field)

@retention(retentionpolicy.runtime)

@documented

public @inte***ce

primary

@target(elementtype.field)

@retention(retentionpolicy.runtime)

public @inte***ce

notnull

@target(elementtype.field)

@retention(retentionpolicy.runtime)

public @inte***ce

defaulttext

@target(elementtype.field)

@retention(retentionpolicy.runtime)

public @inte***ce

defaultint

@target(elementtype.field)

@retention(retentionpolicy.runtime)

public @inte***ce

defaultdecimal

@target(elementtype.field)

@retention(retentionpolicy.runtime)

public @inte***ce

autoincrement

然後建立我們的book類

@tablename(tablename = "book")

public

class

book

public

void

setname(string name)

public

intgetid()

public

void

setid(int id)

public

intgetpages()

public

void

setpages(int pages)

public

double

getprice()

public

void

setprice(double price)

public string getmem()

public

void

setmem(string mem)

public

long

getdate()

public

void

setdate(long date)

}

最後建立dbutil類

public

class

dbutil

/*** 根據類結構構造表。

*/public

static string gettablebuildingsql(class<?> clazz) else

// getdeclaredfields():獲取該類檔案中宣告的字段

// getfields():獲取該類public宣告字段

field arrfield = clazz.getdeclaredfields();

for (int i = arrfield.length - 1; i >= 0; i--) else

if (f.isannotationpresent(defaulttext.class))

if (f.isannotationpresent(defaultint.class))

if (f.isannotationpresent(defaultdecimal.class))

if (f.isannotationpresent(autoincrement.class))

if(f.isannotationpresent(notnull.class))

if (i > 0) }}

return strbuilder.tostring();

}/**

* 構造插入contvalues

**@param bean

*@return

*/public

static contentvalues translate2contentvalues(object bean)

//排除自動增長的字段

if (f.isannotationpresent(autoincrement.class))

string name = f.getname();

object value = f.get(bean);

if (value instanceof byte) else

if (value instanceof short) else

if (value instanceof integer) else

if (value instanceof long) else

if (value instanceof string) else

if (value instanceof

byte) else

if (value instanceof boolean) else

if (value instanceof float) else

if (value instanceof double)

}} catch (exception e)

return cv;

}/**

* 從cursor中提取bean

**@param cursor

*@param cls

*@param

*@return

*/public

static

t cursortobean(cursor cursor, classcls) );

setmethod.invoke(bean, getvaluebyfield(cursor, column, field));}}

}} catch (exception e) finally

}return bean;

}/**

* 從cursor中提取bean 列表

**@param cursor

*@param cls

*@param

*@return

*/public

static

listcursortobeans(cursor cursor, classcls) );

setmethod.invoke(bean, getvaluebyfield(cursor, column, field));}}

beans.add(bean);

}} catch (exception e) finally

}return beans;

}/**

* 根據字段取出值

**@param cursor

*@param columnname

*@param field

*@return

*/private

static object getvaluebyfield(cursor cursor, string columnname, field field)

private

static field findfieldbyname(field fields, string name)

}return

null;

}}

利用註解獲取greendao的表名

greendao entity註解類原始碼中 retention retentionpolicy.source 表示編譯時有效,執行時是沒有效果的所以無法使用greendao的註解來進行對映獲取表名等屬性 首先自己新建註解類後重新註解 retention retentionpolicy.runtim...

C 利用 SQL檔案自動建庫建表等的類

自動建庫建表 public class operationsqlfile 開始執行 public void start 執行sql語句 連線字串 資料庫名 sql語句 private void executesql string connstring,string databasename,stri...

反射中獲取類的註解名

1.首先定義乙個類 public class cartcode 標籤code displayname 標籤code public virtual string code 序列號 displayname 序列號 public virtual string serialnumber 2.下面通過反射獲取...