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建立實體(Filter過濾器)的類:) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); }
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,