用注解編寫創(chuàng)建表的SQL語句
今晚讀了think in java 的章節(jié),感覺很不錯(cuò),我就敲了下來,貼上代碼給以后一個(gè)回顧:
建議提前讀一下think in java 注解 。
說明創(chuàng)建注解我在第一個(gè)注解說明下,以后的注解不在說明。‘
DBTable 注解:
/**
* Project Name:myannotation
* File Name:DBTable.java
* Package Name:com.iflytek.db
* Date:2016-8-28下午08:20:54
* Copyright (c) 2016, syzhao@iflytek.com All Rights Reserved.
*
*/
package com.iflytek.db;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
@Target:
@Target說明了Annotation所修飾的對(duì)象范圍:Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)。
作用:用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
@Retention:
@Retention定義了該Annotation被保留的時(shí)間長(zhǎng)短:某些Annotation僅出現(xiàn)在源代碼中,而被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會(huì)被虛擬機(jī)忽略,而另一些在class被裝載時(shí)將被讀取(請(qǐng)注意并不影響class的執(zhí)行,因?yàn)锳nnotation與class在使用上是被分離的)。使用這個(gè)meta-Annotation可以對(duì) Annotation的“生命周期”限制。
作用:表示需要在什么級(jí)別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
Retention meta-annotation類型有唯一的value作為成員,它的取值來自java.lang.annotation.RetentionPolicy的枚舉類型值
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBTable
{
public String name() default "";
}
Constraints 約束注解:
/**
* Project Name:myannotation
* File Name:Constraints.java
* Package Name:com.iflytek.db
* Date:2016-8-28下午08:27:08
* Copyright (c) 2016, syzhao@iflytek.com All Rights Reserved.
*
*/
package com.iflytek.db;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints
{
boolean primaryKey() default false;
boolean allowNull() default true;
boolean unique() default false;
}
SQLInteger int注解:
/**
* Project Name:myannotation
* File Name:SQLInteger.java
* Package Name:com.iflytek.db
* Date:2016-8-29下午10:24:11
* Copyright (c) 2016, syzhao@iflytek.com All Rights Reserved.
*
*/
package com.iflytek.db;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger
{
String name() default "";
Constraints constraints() default @Constraints;
}
SQLString 字符注解:
/**
* Project Name:myannotation
* File Name:SQLString.java
* Package Name:com.iflytek.db
* Date:2016-8-29下午10:28:04
* Copyright (c) 2016, syzhao@iflytek.com All Rights Reserved.
*
*/
package com.iflytek.db;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString
{
int value() default 0;
String name() default "";
Constraints constraints() default @Constraints;
}
創(chuàng)建表的處理器:
/**
* Project Name:myannotation
* File Name:TableCreator.java
* Package Name:com.iflytek.table
* Date:2016-8-29下午10:57:52
* Copyright (c) 2016, syzhao@iflytek.com All Rights Reserved.
*
*/
package com.iflytek.table;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import com.iflytek.db.Constraints;
import com.iflytek.db.DBTable;
import com.iflytek.db.SQLInteger;
import com.iflytek.db.SQLString;
public class TableCreator
{
public static void main(String[] args)
{
createTable(Member.class);
}
//創(chuàng)建表SQL語句
private static void createTable(Class<?> cl)
{
//獲取DBTable注解
DBTable dbTable = cl.getAnnotation(DBTable.class);
//判斷DBTable注解是否存在
if (dbTable == null)
{
System.out.println("沒有找到關(guān)于DBTable");
return;
}
//如果@DBTable注解存在獲取表明
String tableName = dbTable.name();
//判斷表名是否存在
if (tableName.length() < 1)
{
//不存在,說明默認(rèn)就是類名,通過 cl.getSimpleName()獲取類名并且大寫
tableName = cl.getSimpleName().toUpperCase();
}
//定義獲取column的容器
List<String> columnDefs = new ArrayList<String>();
//循環(huán)屬性字段
//說明:getDeclaredFields()獲得某個(gè)類的所有申明的字段,即包括public、private和proteced,但是不包括父類的申明字段。
//getFields()獲得某個(gè)類的所有的公共(public)的字段,包括父類。
for (Field field : cl.getDeclaredFields())
{
//定義表字段名稱變量
String columnName = null;
//獲取字段上的注解(現(xiàn)在字段允許多個(gè)注解,因此返回的是數(shù)組)
Annotation[] anns = field.getDeclaredAnnotations();
//判斷屬性是否存在注解
if (anns.length < 1)
continue;
//判斷是否是我們定義的數(shù)據(jù)類型
if (anns[0] instanceof SQLInteger)
{
//獲取SQLInteger 注解
SQLInteger sInt = (SQLInteger)anns[0];
//判斷是否注解的name是否有值
if (sInt.name().length() < 1)
{
//如果沒有值,說明是類的屬性字段,獲取屬性并轉(zhuǎn)換大寫
columnName = field.getName().toUpperCase();
}
else
{ //如果有值,獲取設(shè)置的name值
columnName = sInt.name();
}
//放到屬性的容器內(nèi)
columnDefs.add(columnName + " INT " + getConstraints(sInt.constraints()));
}
//同上SQLInteger,這里不寫注釋了
if (anns[0] instanceof SQLString)
{
SQLString sString = (SQLString)anns[0];
if (sString.name().length() < 1)
{
columnName = field.getName().toUpperCase();
}
else
{
columnName = sString.name();
}
columnDefs.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints()));
}
//定義生成創(chuàng)建表的SQL語句
StringBuilder createCommand = new StringBuilder("CREATE TABLE " + tableName + "(");
//循環(huán)上面屬性容器,
for (String columnDef : columnDefs)
{
//把屬性添加到sql語句中
createCommand.append("\n " + columnDef + ",");
//去掉最后一個(gè)逗號(hào)
String tableCreate = createCommand.substring(0, createCommand.length() - 1) + ");";
//打印
System.out.println("Table creation SQL for " + cl.getName() + " is :\n" + tableCreate);
}
}
}
private static String getConstraints(Constraints con)
{
String constraints = "";
//判斷是否為null
if (!con.allowNull())
{
constraints += " NOT NULL ";
}
//判斷是否是主鍵
if (con.primaryKey())
{
constraints += " PRIMARY KEY ";
}
//是否唯一
if (con.unique())
{
constraints += " UNIQUE ";
}
return constraints;
}
}
以上代碼拷貝出來,就可以運(yùn)行了!
上面雖然是簡(jiǎn)單的創(chuàng)建表語句,但我們可以蔓延到hibernate的domain類里的注解,各種CURD ,何嘗不是這樣處理的呢,只是hibernate有很多東西,但是萬變不離其宗,以后有機(jī)會(huì)研究一下hibernate 。
收獲:
讀了以后,對(duì)于注解知道為什么要這么用了,其實(shí)顧名思義就是一個(gè)注解,只是有一個(gè)處理器來處理這個(gè)注解,這對(duì)我以后用到注解方面應(yīng)該有幫助的,
時(shí)間不早了,就寫到這里!
結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
sqlserver循環(huán)刪除表中的數(shù)據(jù)最好方案
這篇文章主要介紹了sqlserver?中?循環(huán)刪除表中的數(shù)據(jù),這樣不會(huì)鎖表,導(dǎo)致業(yè)務(wù)出現(xiàn)問題,本文給大家分享最新解決方案,文中給大家補(bǔ)充介紹了foreach 循環(huán)中刪除一條數(shù)據(jù)_SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法,需要的朋友可以參考下2023-11-11
SQL語句實(shí)現(xiàn)SQL Server 2000及Sql Server 2005日志收縮(批量)
SQL語句實(shí)現(xiàn)SQL Server 2000及Sql Server 2005日志收縮(批量)2008-08-08
SQL?server常見的數(shù)據(jù)類型轉(zhuǎn)換整理大全
這篇文章主要給大家介紹了關(guān)于SQL?server常見的數(shù)據(jù)類型轉(zhuǎn)換整理的相關(guān)資料,在 SQL Server中可以使用CAST或CONVERT函數(shù)來進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,需要的朋友可以參考下2023-11-11
SQL?Server數(shù)據(jù)庫分離和附加數(shù)據(jù)庫的操作步驟
數(shù)據(jù)庫的附加是數(shù)據(jù)庫在數(shù)據(jù)庫文件中添加到數(shù)據(jù)庫當(dāng)中的操作,下面這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫分離和附加數(shù)據(jù)庫的操作步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
SQL Server誤區(qū)30日談 第17天 有關(guān)頁校驗(yàn)和的誤區(qū)
從舊的實(shí)例升級(jí)上來的數(shù)據(jù)庫不會(huì)自動(dòng)開啟頁校驗(yàn)和,除非你顯式使用ALTER DATABASE databasename SET PAGE_VERIFY CHECKSUM進(jìn)行開啟。而在SQL Server 2005或2008新建的數(shù)據(jù)庫頁校驗(yàn)和是默認(rèn)開啟的2013-01-01
mssql中得到當(dāng)天數(shù)據(jù)的語句
mssql中得到當(dāng)天數(shù)據(jù)的語句...2007-08-08
SQL Server恢復(fù)模型之批量日志恢復(fù)模式
這篇文章主要介紹了SQL Server恢復(fù)模型之批量日志恢復(fù)模式,需要的朋友可以參考下2014-10-10

