1. 程式人生 > >Java註解實現增刪改查CRUD

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為InsertUpdateDeleteSelect

注:這些(代理)方法最好不要過載,避免不必要的問題。

注:我們可以單獨建立一個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