Java註解實現增刪改查CRUD
以前,我們都把對資料庫的增刪改查語句寫在xml檔案中(詳見:《程式設計師成長筆記(一)》第三部分,第四章,第四節)。
由於Java註解的簡潔高效,在Java註解的思想(幹掉xml)下,現在越來越多的人使用java註解來進行增刪改查操作。
而且MyBatis3也支援並鼓勵我們使用Java註解來進行CRUD操作。
注:CRUD即:增Create、查Retrive、刪Delete、改Update。
下面以示例進行說明
本例子的軟硬體環境:
Windows7、Eclipse(Oxygen.3a Release)、Jdk1.8、MyBatis(3.4.5)、SpringBoot(2.0.1.RELEASE)、MySQL。
一級顏色:綠色 二級顏色:黃色 注意事項:紅色 插入說明:藍
增@Insert
先給出MySQL資料庫中的相關employee表
增(簡單增)示例:
資料訪問層中的查詢語句示例:
注:如果引數只有一個,那麼可以直接#{屬性名}進行屬性值獲取,如果有多個引數,必須使用@Param指明。
增(同時獲取主鍵)方式一:
注:如果只有一個引數的話,那麼可以不使用@Param,此時#{xxx}和keyProperty = “xxx”中的xxx可以直接寫實體類模型的屬性名。
注:如果有多個引數,那麼我們需要使用@Param來進行指明,當然也推薦一個引數時也使用@Param註解。如果使用@Param指明引數了,且在註解中使用到了該引數的某些值時,一定要指明是該引數的。
如:這裡的keyProperty = “e.id”是可以的;而keyProperty = “id”不可以。
增(同時獲取主鍵)方式二:
注:方式二的注意事項與方式一一樣。
增(既有實體引數,又有普通引數):
注:使用註解CRUD時,可以多個引數,這些引數可以是普通引數,也可以是複雜引數。
注:使用自動獲取主鍵@Options或@SelectKey能正常獲取到該物件插入資料庫表中後的主鍵。
刪@Delete
先給出MySQL資料庫中的相關employee表
刪(簡單刪)示例:
改@Update
先給出MySQL資料庫中的相關employee表
改(簡單改)示例:
查@Select
先給出MySQL資料庫中的相關employee表
簡單查(以“一般”型別 接收資料)示例:
資料訪問層中的查詢語句示例一:
資料訪問層中的查詢語句示例二:
簡單查(以 物件模型 接收資料)示例:
資料訪問層中的查詢語句示例:
注:id = true出現在哪裡,就說明那個引數是主鍵。
如:
就說明idCard是主鍵。
注:如果接收查詢結果的,是一個物件模型,那麼程式是通過對應的有參構造或則無參構造+setter方法,將結果放進實體類模 型的。
即:這就要求我們,在建立實體類模型時,一定要建立有對應的有參構造或無參構造+setter方法。
注:如果column名字與property不一致,那麼需要在Result中指出來。
簡單查(以 Map<String, Object> 接收資料)示例:
上圖中的此寫法只能接收一條(一行)資料內容。如果想接收多條(多行)資料內容,那麼可以:
法一:以形如List<Map<String, Object>>這樣的來接收多行資料。一個Map<String, Object>只儲存一行資料。
法二:
每一行資料專門拿一個物件模型來接收,並指定以該模型的哪一個屬性作為key。
注:法一是List的每一個Map中只有一條資料;法二是多條資料都放在同一個Map中,以不同的key來對應不同的行。
注:法二依賴於物件模型,且法二在選擇以物件的什麼屬性作為key時,要考慮是否會重複(如果作為key的屬性的屬性
值可能會重複,那麼在Map裡可能發生資料覆蓋的情況)。
簡單查(以 集合型別 接收資料)示例:
示例一:
示例二:
注:如果查詢結果橫跨多個實體模型,那麼我們使用List來接收資料。
動態語句:
我們都知道如何在xml中處理動態的SQL語句,那麼使用Java註解如何處理呢?需要使用@xxxProvider,並指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
注:使用@xxxProvider時,就不要使用@Param了,否者容易出錯。
注:xxx為Insert、Update、Delete、Select。
注:這些(代理)方法最好不要過載,避免不必要的問題。
注:我們可以單獨建立一個package、建立一個類來放置這些方法,如:
動態增@InsertProvider
單個引數:
資料訪問層中的方法示例:
注:@InsertProvider需要指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
給出邏輯處理方法示例:
多個引數:
資料訪問層中的方法示例:
注:@InsertProvider需要指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
給出邏輯處理方法示例:
注:如果資料訪問層中的對應的方法有多個引數時,那麼此方法的引數型別必須為Map<String,Object>;
注:此方法需要返回一個SQL字串。
同時獲得主鍵(獲得主鍵的方式和@Insert是一樣的):
獲得主鍵方式一:
獲得主鍵方式二:
批量增:
提示:批量增也能同時獲取到主鍵,與上面的單個增的自動獲取主鍵方式一樣;這裡就不再演示了。
資料訪問層中的方法示例:
注:@InsertProvider需要指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
給出邏輯處理方法示例一(直接迴圈拼接sql語句):
注:使用#{}防止sql注入
注:在拼接的sql字串中,用的直接是map中的key(即:上圖Map中的key為listTest),而不是我們新new的集合物件(我們新new一個集合來獲取map中對應key的集合的目的是:幫助我們知道集合的長度,進而進行邏輯判斷)。
呼叫上圖的方法,傳過去的是這個:
注:由於我們的目的只是利用新new的集合來獲取對應key的集合的長度,所以,即使我們不使用泛型,直接使用Map<String,Object>,(經測試)也是可以的。
給出邏輯處理方法示例二(採用MessageFormat拼接sql語句):
注:MessageFormat模板中的{0}即為第一個佔位符。
注:使用#{}防止sql注入
注:和方式一一樣,引數可以直接Map<String, Object>也行。
拼接sql字串時,用的直接是map中的key(即:上圖Map中的key為listTest),而不是我們新new的集合物件。
特別說明:
在資料訪問層(即:Mapper層)呼叫SQL的代理方法時,我們也可以直接傳遞List過去,代理方法用Map接收,如:
Mapper層中的方法
處理SQL的方法
注:此時Mapper中的方法裡的引數前,務必要有@Param,其值將被作為Map中的key;否者就要嚴格按照原始碼中的arg0之類的作為key了,最下面會講到。
注:Provider中接收時,可以在接收引數時,就指定對應的泛型;也可以用Map<String, Object>接收後,再拆箱。
如果我們是將連庫操作的資料放在Map<String ,Object>中項資料庫表中插入的話,我們可以這麼獲取主鍵
Mapper層中的方法為:
注:這裡以@Options為例的,使用@SelectKey獲取主鍵也是一樣的。
我們在呼叫dynamicInsertMultiParam這個方法時,在傳過去的Map引數中,多放一個key,來接收新增後查詢出來的id,如:
注意:key要和@Options註解中的keyProperty對應。
可以看見,獲取到了新增後的id:
動態刪@DeleteProvider
資料訪問層中的方法示例:
注:@InsertProvider需要指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
給出邏輯處理方法示例:
注:此方法需要返回一個SQL字串。
注:當需要傳遞多個引數時,處理方式與@InsertProvider一樣。
動態改@DeleteUpdate
資料訪問層中的方法示例:
注:@InsertProvider需要指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
給出邏輯處理方法示例:
注:此方法需要返回一個SQL字串。
注:當需要傳遞多個引數時,處理方式與@InsertProvider一樣。
動態查@SelectProvider(示例一)
資料訪問層中的方法示例:
注:@InsertProvider需要指定(經過邏輯處理後)返回SQL語句的方法,以及該方法所在的類。
注:@InsertProvide與@Insert一樣,如果column與property不一致,那麼需要使用@Results指明對應關係。
給出邏輯處理方法示例:
注:因為引數沒有放入一個實體類或Map中,所以這裡#{}無法使用;因此建議:如果是使用了xxxProvider註解,那麼引數都儘量放入實體類或Map中進行傳參。
注:此方法需要返回一個SQL字串。
注:當需要傳遞多個引數時,處理方式與@InsertProvider一樣。
持有物件、集合:
宣告:在分散式叢集專案中,我們一般都會盡量避免顯示的主外來鍵關係、持有物件、持有集合等情況,目的是:降低耦合,方便程式的擴充套件以及後期維護等。
注:如果遇見了持有物件持有集合等情況,如果多次查詢能夠解決問題,那麼就儘量避免一次性全部查詢;如果非要一次查詢解決持有物件持有集合的問題,那麼需要引入xml檔案,在xml檔案中配置對映。
注:雖然@Result註解有@One、@Many註解,但是目前來說個人感覺並不那麼好用。
動態查@SelectProvider(示例二)
資料訪問層中的方法示例
Sql代理方法為
單元測試中的測試方法為
xml示例(持有物件):
說明:一個people持有一個身份證idcard物件
People實體類:
people表:
Idcard實體類:
idcard表:
xml檔案位置:
資料訪問層中的方法:
xml中的相關配置為:
注:更多關於xml中配置sql對映的內容,詳見《程式設計師成長筆記(一)》第三部分,第四章,第四節。
Mapper介面中,呼叫方法時,引數是這麼與sqlProvider中的形參匹配的(這是原始碼)
extractProviderMethodArguments方法是這樣的:
所以,其實我們的mapper中的方法裡,可以有多個形參,代理方法中也可以有多個形參如:
對應的代理方法為
注:由原始碼可知:時通過key來進行引數的匹配的。我們可以通過使用@Param來指定引數的key為多少,這樣就能準確地匹配了。
注:引數前其實不使用@Param也是可以的。但是不建議這麼做,因為如果我們不使用@Param來指定key的話,那麼程式就會按照引數的順序依次以arg0、arg1、arg2……來作為Map中的key;所以如果我們在mapper中對應的方的引數前不寫key的話,那麼在sqlProvider中的對應的方法的形參的順序就要和傳入時引數的順序一致。而使用@Param的話,則沒有此顧忌。
注:如果Mapper層中的方法傳遞多引數時,部分引數前使用了@Param()註解(或sqlProvider中對應方法的部分形參前使用了@Param()註解),那麼其會頂替原來預設的key;以Mapper中的方法為例:
那麼key依次為map1 和 arg1,即:map1取代了arg0作為key。對應sqlProvider中就要以相應的key取值。
注:更多細節上的使用,這裡就不再一一說明了。感興趣的話,可以去看下對應的原始碼。
使用Junit對所寫方法進行的測試
如有不當之處,歡迎指正
本文已經被收錄進《程式設計師成長筆記(二)》,作者JustryDeng
相關推薦
Java註解實現增刪改查CRUD
以前,我們都把對資料庫的增刪改查語句寫在xml檔案中(詳見:《程式設計師成長筆記(一)》第三部分,第四章,第四節)。 由於Java註解的簡潔高效,在Java註解的思想(幹掉xml)下,現在越來越多的人使用java註解來進行增刪改查操作。 而且MyBatis3也支援並鼓勵我
java連線Oracle並實用儲存過程實現增刪改查(CRUD)
public class User_oracle {//增public void insert_exp_user(String username,String password){Connection con=DBUtil.getConnection();CallableStatement cs=null;R
基於MongoDB資料庫的Java程式實現增刪改查功能
今天我來說一下使用Java程式去實現MongoDB資料庫的增刪改查功能。 首先需要匯入連線資料庫的jar包,需要的話這是連結:http://pan.baidu.com/s/1eSDytAM,把jar包
HBASE 使用java api 實現增刪改查例項
我們使用windows 本地myeclipse測試程式,具體搭建教程請看首先建立maven 專案,並修改pom.xml,匯入hbase 第三方jar包,首次會自動下載<dependency> <groupId>org.apache.hbas
MyBatis使用註解實現增刪改查
使用Spring與MyBatis整合,即把mybatis資料來源的配置、事務的管理、SqlSessionFactory的建立以及資料對映器介面Mapper的建立交由spring去管理”,所以mybatis的配置檔案mybatis-config.xml中不需要再配置資料來源及
mybatis3使用@Select等註解實現增刪改查
1.需要的jar包 2.目錄樹 3.具體程式碼 一.需要的jar包 第一個:mybatis的jar包 第二個:mysql資料的驅動 二.目錄樹 三.具體程式碼 使用框架,配置檔案先行! c
SSM框架實現增刪改查(CRUD)
2:步驟說明 2.1:StudentService新增相應的方法public interface StudentService { List<Student> list(); int total(); List<Student> list(Pag
java連接Oracle數據庫實現增刪改查並在Navicat中顯示
execute etag while args 自動 rest getc from lose 創建TEST表 eclipse中的java項目 代碼 數據庫方法類 DBUtil: package util; import java.sql.Connection;
JAVA資料管理系統(用ArrayList實現增刪改查等操作)
通過查詢大量有關ArrayList操作的文章,終於將這個小東西寫完了。感覺心累。 //import java.util.ArrayList; //import java.util.List; //import java.util.Scanner;// I/O庫函式 /
Java操作Oracle並實現增刪改查
在這裡我選擇的是maven專案,但是找了良久沒有發現依賴,或者就是不能用,於是就去Oracle官網下載了ojdbc的jar包. 連線程式碼如下: package oracle; import java.sql.Connection; import java.sql.Dr
JavaWeb 實現基礎增刪改查 CRUD
1.資料庫表如下 CREATE TABLE `employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(40) NOT NULL, `note` varchar(200) DEFAULT NULL,
Java中使用mongodb實現增刪改查
Java 安裝 要想在 Java 程式中使用 MongoDB,需要先確定是否安裝了 MongoDB JDBC 驅動,並且要在機器上安裝了 Java。檢視 Java 教程來確保在機器上安裝好 Java。下面來介紹如何安裝 MongoDB JDBC 驅動。 從路徑 Download mongo.jar 處下載
基於mongodb的java之增刪改查(CRUD)
2,建立測試程式碼 import java.net.UnknownHostException;import java.util.Set; import com.mongodb.BasicDBObject;import com.mongodb.DB;import com.mo
Java 利用 JDBC 連線 Sqlsever2012 實現 增刪改查
所需驅動檔案下載 http://download.csdn.net/detail/u012320991/9378730 資料表如下: 執行結果如下: 解決過程(預設SqlSever 已安裝並配置好): 下載 JDBC 4.0 For SqlSever --->
一步步實現:JPA的基本增刪改查CRUD(jpa基於hibernate)
1.建立一個JPA工程 jar包說明 2.建立實體類 有關實體類中相關注解的說明 * @Table 標註類對應的表 * 若表名和型別相同時,省略@Table,比如類Users 和表 users; * 若不相同時,必須有@Table,並設定name,為該類對應
java 順序表實現增刪改查,合併,排序功能
/** * @param args */ public int []data; public int yupeijie_length; final int Maxsize=1024; public yupeijie_Seq(){ data=new int[1024]; this
java基於jdbc操作mysql實現增刪改查日誌完整程式碼 不足之處歡迎留言指導
1、建立Java Project專案 2、匯入Jar包 3、建立資料庫 //根據實體類建立資料庫 4、建立實體類 (Bm.java) public class Bm { private int id; private String rq;
mongodb--java連線資料庫實現增刪改查
1.新建一個maven專案,匯入 <dependencies> <dependency> <groupId>junit</grou
idea+spring4+springmvc+mybatis+maven實現簡單增刪改查CRUD
type https suffix rec 項目目錄結構 inject btree 控制器 clu 在學習spring4+springmvc+mybatis的ssm框架,idea整合簡單實現增刪改查功能,在這裏記錄一下。 原文在這裏:https://my.oschina.n
用註解的方式實現增刪改查
和上一個實現增刪改查的區別就是將UserMapper.xml變成了現在的UserMapper.javaUser11Mapper.javapackage com.sxau.rjxy.MyBatis_tes