1. 程式人生 > >Java註解專案實戰即模擬Hibenernate生成sql語句

Java註解專案實戰即模擬Hibenernate生成sql語句

專案結構:


建立表單的註解:(注意與屬性註解的作用域的不同)

package HibernateSimulate;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Created by codessl on 2017/9/5 0005.
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME
) public @interface Table { String value(); }
建立表單屬性的註解:
package HibernateSimulate;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Created by codessl on 2017/9/5 0005.
 */
@Target(ElementType.FIELD
) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); }
建立實體(Filter過濾器)的類:
package HibernateSimulate;
/**
 * Created by codessl on 2017/9/5 0005.
 */
@Table("user")
public class Filter {
    @Column("name")
    String name;
    public String getName() {
        return name;
} public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Column("id") int id; @Column("email") String email; }

建立測試執行的類:

package HibernateSimulate;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * Created by codessl on 2017/9/5 0005.
 */
public class Test {
    public static void main(String[] args) {
        //根據name查詢
Filter filter1 = new Filter();
//根據ID查詢
Filter filter2 = new Filter();
//根據email查詢
Filter filter3 = new Filter();
//設定過濾器的各個屬性
filter1.setName("ruanjianlin");
filter2.setId(66);
filter3.setEmail("[email protected],[email protected]");
//根據相關的屬性查詢
query(filter1);
query(filter2);
query(filter3);
}

    public static void query(Object o) {

        //建立sql語句字串拼接物件
StringBuffer sql = new StringBuffer();
sql.append("select * from ");
//獲取註解且通過反射方式獲得屬性
Class c = o.getClass();
Boolean isExistTable = c.isAnnotationPresent(Table.class);
//如果存在表的名稱的註解
if (isExistTable) {
            Table tb = (Table) c.getAnnotation(Table.class);
sql.append(tb.value() + " ");
sql.append("where 1=1 ");
Field[] fields = c.getDeclaredFields();
            for (Field field : fields) {
                Boolean isExistColumn = field.isAnnotationPresent(Column.class);
                if (isExistColumn) {
                    Object result = null;
Column column = field.getAnnotation(Column.class);
String columnGet = column.value();
//通過反射invoke執行method
String methodName = "get" + columnGet.substring(0, 1).toString().toUpperCase() + columnGet.substring(1, columnGet.length());
                    try {
                        try {
                            Method methodInvoke = c.getMethod(methodName);
result = methodInvoke.invoke(o, null);
} catch (NoSuchMethodException e) {
                            e.printStackTrace();
}
                        if (result == null || result instanceof Integer && (int) result == 0) {
                            continue;
} else if (result instanceof Integer) {
                            sql.append("and " + columnGet + "=");
sql.append(result);
}

                        //如果是郵箱的屬性
else if (result.toString().contains(",")) {
                            sql.append("and " + columnGet + " in(");
String[] email = result.toString().split(",");
/* for (String string:email) {
                               sql.append("'"+string+"',");
                           }*/
for (int i = 0; i < email.length; i++) {
                                if (i != email.length - 1) {
                                    sql.append("'" + email[i] + "',");
} else {
                                    sql.append("'" + email[i] + "')");
}
                            }
                        }

                        //如果是姓名
else {
                            sql.append("and " + columnGet + "=");
                            if (result != null) {
                                sql.append("'" + result + "'");
}

                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
} catch (InvocationTargetException e) {
                        e.printStackTrace();
}

                }

            }

            System.out.println(sql);
}
    }

}

原理概括:通過表的註解獲取實體類(表單)名,然後獲取表單的各個屬性資訊,進而通過屬性資訊與反射呼叫get set等方法,然後進行sql語句的拼接,當然進行sql語句拼接時的細節仍需注意比如where的設定,單引號,型別的處理,and連線符等等,需要自行進行實踐方可體會相關技巧。

相關推薦

Java註解專案實戰模擬Hibenernate生成sql語句

專案結構: 建立表單的註解:(注意與屬性註解的作用域的不同) package HibernateSimulate; import java.lang.annotation.ElementType; import java.lang.annotation.Retentio

LINQ學習實戰:檢視LINQ生成SQL語句的幾種方法

方式一:DataContext類的Log屬性與.GetCommand方法 DataContext.Log = Console.Out;  //控制檯的輸出視窗顯示 DataContext.GetCommand(LinqQuery).CommandText;  //返回一個查詢

Java 爬蟲專案實戰之爬蟲簡介

Java 爬蟲專案實戰之爬蟲簡介 0. 前言 今年三四月份學習Hbase,瞭解到openTSDB的底層儲存使用到了Hbase,於是乎,學習openTSDB,在閱讀openTSDB原始碼【其原始碼使用java編寫】的過程中, 發現裡面全是I/O,多執行緒,httpclient等。

Java爬蟲專案實戰案例四之Jsoup使用

Java爬蟲專案實戰案例四之 Jsoup 使用 1. Jsoup簡介 Jsoup是一款java的HTML解析器,可直接解析某個URL地址,HTML文字內容。它提供了一套非常簡便的API,可通過DOM,C

java自定義註解-生成sql語句

一、自定義Table註解@Target(value=ElementType.TYPE)//使用在類或介面上 @Retention(value=RetentionPolicy.RUNTIME)//在執行期間可以獲取 @Documented//文件含有該註解 public @in

java web專案實戰

最近,我想學點後臺的知識,於是找了一篇教程跟著做。本文是結合教程做點補充和記錄,畢竟小白懂的太少。 1、教程使用的是Javaee IDE,我的eclipse沒有建立動態web專案這個按鈕我還裝外掛吭哧了好久各種報錯,最後還是用了Javaee。按照教程建立好檔案、寫上內容後

Eclipse建立Java Web專案時,沒有自動生成web.xml檔案

今天建立動態Web專案時,發現WEB-INF下面沒有自動生成web.xml配置檔案。解決方案:        1)方法一:            File--->新建動態專案出現如下圖,這時候不要急於Finish,請點選next--->出現如下圖--->繼續

mybatis使用註解替代xml配置,動態生成Sql

key list 數據 很難 pro ring 參考 rec 不知道 mybatis使用註解替代xml配置時,遇到判斷條件是否為null或者為空時,@Select很難搞定,不知道怎麽辦? mybatis3中增加了使用註解來配置Mapper的新特性,使用 SelectPro

Java讀取Excel檔案,生成SQL語句

import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import java.io.*; public class Main { public static void

Java動態生成SQL語句通過JDBC達成資料庫操作

在java中使用jdbc進行資料庫操作的時候 我們或許需要從多個表中進行查詢和插入操作 特別是如果多個表還有相互的依賴關係的話,插入操作就顯得非常難受 因為或許每一個動作,都需要重寫一個完全不同的sql語句 這樣的話程式碼量確實十分的大 而且程式碼會顯

利用反射生成SQL語句

mman com inf get bool 通過 公開 public .get // 修改學員信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映獲取類對所有屬性,用來動態生成SQL語句

C# 讀取指定文件夾中的全部文件,並按規則生成SQL語句

fun .text line -m ava inf hid 語句 ade 本實例的目的在於: 1 了解怎樣遍歷指定文件夾中的全部文件 2 控制臺怎樣輸入和輸出數據 代碼: using System; using System.IO; nam

使用pdm建表並生成SQL語句

clas 圖片 png nbsp div ima class pos 使用 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 使用pdm建表並生成SQL語句

hibernateTemplate.delete(t);刪除不了語句,沒有生成sql語句

在spring那個檔案裡生命事務即可 <!-- 生命事務 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&g

檢視LINQ生成SQL語句的幾種方法

原文如下: http://hi.baidu.com/king%B3%CC%D0%F2%C8%CB%C9%FA/blog/item/9d2696f03c9e05ca7831aa79.html   記錄LINQ生成的SQL語句是常用的除錯方式,而且能根據需要來優化LINQ生成

Python指令碼批量生成SQL語句

通過Python指令碼批量生成插入資料的SQL語句 原始SQL語句: INSERT INTO system_user (id, login_name, name, password, salt, code, createtime, email, main_org, positio

Excel中,用CONCATENATE函式生成SQL語句

  1、語法 CONCATENATE(text1, [text2], ...)CONCATENATE 函式語法具有下列引數(引數為:操作、事件、方法、屬性、函式或過程提供資訊的值。):Text1 必需。要連線的第一個文字項。Text2, ... 可選。其他文字項,最多為 255 項。項與項之間必

根據DELTA自動生成SQL語句

上傳客戶端的CLIENTDATASET.delta到伺服器的clientdataset.data,服務端解析clientdataset的資料生成相應的SQL語句。 相對於直接呼叫datasetprovider.applyupdates()方法提交資料而言,前者的可控性更強,對於某些要求靈活性很強的場合,前者

反射+註釋,根據實體類物件生成SQL語句工具類

最近在寫一個公司內部專案,由於覺得配置Hibernate過於繁瑣,索性使用了spring的jdbc,可是又要寫很多的sql語句,為了偷偷懶,於是就寫個能通過實體類物件生成SQL語句的工具類。 目前只在MySql資料庫上實驗通過,其他資料庫未測試。 本工具類還有很多不足之

Java將檔案中的內容轉換為sql語句(和併發定時讀取檔案)

資料檔案內容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11-11 18:08:08.0,TABLE_NUM=T17,OPTIONS=FIND,