1. 程式人生 > >DAO層介面定義多個入參(Mybatis)

DAO層介面定義多個入參(Mybatis)

本文將介紹本人接觸過的在DAO層定義多個入參的三種方法:

方法一:將入參封裝在一個實體類中。
接觸mybatis一般都會接觸工具generator;大部分人也是從自動生成的sql介面來了解DAO層介面的定義。
觀察generator自動生成的程式碼可以發現在多個入參(多個PrimaryKey)的情況下,會將它們定義為一個實體類,用實體類作為入參。
以類Photo為例,定義Photo表字段為id,name, md5, url;主鍵為id,name
DROP TABLE IF EXISTSphoto;
CREATE TABLE
photo(

idint(11) NOT NULL,
md5varchar(255) NOT NULL,
namevarchar(255) NOT NULL,
urlvarchar(255) NOT NULL,
PRIMARY KEY (
id,name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用工具generator生成時,可以看到id,name定義為PhotoKey類

public class PHOTOKey {
    private Integer id;
    private String name;
//省略set,get,toString方法
}

DAO層介面的查詢方法selectByPrimaryKey入參為PhotoKey類:
PHOTO selectByPrimaryKey(PHOTOKey key);
mapping檔案中的實現為

 <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="com.cn21.yuntu.entity.db.file.PHOTOKey" >
    select 
    <include refid="Base_Column_List" />
    from
photo where id = #{id,jdbcType=INTEGER} and name = #{name,jdbcType=VARCHAR} </select>

方法二:將入參封裝進map中,使用map作為入參。
Photo selectByIdandName(Map<String,String> map);
mapping檔案中的實現為

 <select id="selectByIdandName" resultMap="BaseResultMap" parameterType="Map" >
    select  
    <include refid="Base_Column_List" />
    from photo a
    where a.ID = #{Id,jdbcType=INTEGER} 
    and a.NAME = #{name,jdbcType=VARCHAR} 
  </select>

這個方法用起來容易出錯,因為map的封裝很難一眼讓人瞭解引數的意義,呼叫時也容易出現變數名的定義與mapping.xml檔案變數名不一致的情況,比如大小寫或這下劃線的簡單錯誤,不建議使用

方法三:使用@Param定義入參。
在介面入參處,用@Param定義好入參的變數名,單個入參可以不定義,多個入參就必須增加定義。

Photo selectByIdandName(@Param("Id") Integer Id, @Param("name") String name);

mapping檔案中的實現為

 <select id="selectByIdandName" resultMap="BaseResultMap" >
    select  
    <include refid="Base_Column_List" />
    from photo a
    where a.ID = #{Id,jdbcType=INTEGER} 
    and a.NAME = # {name,jdbcType=VARCHAR}
  </select>

這個方法相比方法二就比較一目瞭然 。

相關推薦

DAO介面定義Mybatis

本文將介紹本人接觸過的在DAO層定義多個入參的三種方法: 方法一:將入參封裝在一個實體類中。 接觸mybatis一般都會接觸工具generator;大部分人也是從自動生成的sql介面來了解DAO層介面的定義。 觀察genera

mybatis介面傳入問題

實際專案開發時,經常會遇到mybatis的介面需要多個入參的情況,但是由於可能引數只有兩三個,不願意把這些引數封裝成一個物件,這時就面臨著引數直接傳入的情景。這時如果按照下面寫法,會報錯誤: org.mybatis.spring.MyBatisSystemException: nested ex

JS動態寫入HTML程式碼《變數,方法,函式拼接》

寫這篇文章,主要是想mark一下,因為JS動態生成HTML(這裡都預設是生成大段的HTML,而不是簡單的標籤元素),常用的兩種語法格式: 一種是es6的寫法,反撇,' `` ',在英文語法輸入狀態下,esc正下方的按鍵。但是這種語法存在相容性的問題,我在移動端的專案中遇到過,使用JQuery,沒

java的dao如何返回list

比如一個場景 我要這樣展示(相同的元素只要展示一次) 前臺是這樣寫的 el表示式是不能對資料進行處理的,所以資料有重複的那麼就一定會顯示出來 所以,考慮,能不能直接在dao中查詢的時候直接返回三個list,這樣前臺直接取就行了 搜了一下,有類似需求   看起來是可以實現的,

mybatis的對映檔案當時Map時應注意,還有用@Param註解出現繫結失敗時

<select id="findPostsBetweenRange" parameterType="java.util.Map" resultMap="PostResultMap"> SELECT p.id as post_id,

基於動態代理的WebAPI/RPC/webSocket框架,一套介面定義,通訊方式

API/RPC/webSocket三個看起來好像沒啥相同的地方,在開發時,服務端,客戶端實現程式碼也大不一樣 最近整理了一下,通過動態代理的形式,整合了這些開發,都通過統一的介面約束,服務端實現和客戶端呼叫 基於這樣的形式,WebAPI/RPC/webSocket只需要定義一套介面,就能達到通用的效果 &nb

Excel文件合並到一個Excel文件的工作表Sheet

ger xlsx eww 右擊 對話 如果 work excel 對話框 實現的功能是把多個Excel文件的第一個工作表(Sheet)合並到一個Excel文件的多個工作表裏,並且新工作表的名稱等於原Excel文件的文件名。開發環境Excel2007,但是Excel

JDBC資料庫連線池連線資料庫及資料庫操作DAO設計通用更新及查詢方法

上篇文章主要介紹了通過資料庫連線池連線資料庫,然後設計了對資料庫通用更新和查詢方法,本篇文章主要通過例項介紹上篇文章定義的對資料庫操作的幾個方法的使用:     首先我們先在資料庫建立一個學生資訊表Student欄位如圖: 建立好表將配置檔案的資訊改好然後需要建立一

JDBC資料庫連線池連線資料庫及資料庫操作DAO設計通用更新及查詢方法

該篇文章介紹了資料庫連線池獲取資料庫連線以及資料庫操作的基本使用,然後主要提供了java專案案例中dao層的一種設計,利用反射的原理定義了通用的查詢方法可以對應所有的表和例項。文章中的每段程式碼都提供了詳細的註釋及邏輯步驟 首先匯入資料庫連線的所需要的jar包:    

excel合併excel2007

1.新建一個空的excel檔案,在需要合併的目錄下。 2.右鍵點選sheet1,點選檢視程式碼 3.執行此段程式碼 Sub 合併當前目錄下所有工作簿的全部工作表() Dim MyPath, MyName, AWbName Dim Wb As Workbook, WbN As String D

Caffe實現標籤影象分類1——基於Python介面實現標籤影象分類VOC2012

1.前言         Caffe可以通過LMDB或LevelDB資料格式實現影象資料及標籤的輸入,不過這隻限於單標籤影象資料的輸入。由於研究生期間所從事的研究是影象標註領域,在進行影象標註時,每幅影象都是多標籤的,因此在使用Caffe進行遷移學習時需要實現多標籤影象資料

XAMPP下apache部署網站,虛擬機器空間配置

1、首先修改C盤WINDOWS/system32/drivers/etc目錄下的 hosts 檔案,用記事本開啟,加入:127.0.0.1 www.a.com127.0.0.1 www.b.com

CAS+ tomcat 在同一臺機器測試如何啟動動tomcat筆記

       首先假定你的機器上已經安裝配置好了一個tomcat,我們先拷貝這個tomcat到另外一個目錄或是改一個名字放在同一個目錄也行,然後配置新的tomcat的環境變數,在環境變數中已經存在如下圖配置好的tomcat的環境變數 現在我們在新建一個新的tomcat的環

使用GatewayWorker框架,workerman程序businessworker負載不均衡的問題解決過程

公司搭建一套智慧社群、智慧對講管控雲平臺時,使用GatewayWorker框架搭建app端外推送的服務。發現效能比預期的低。也就是GatewayWorker(https://github.com/walkor/GatewayWorker/)中的workerman元件往goog

Linux Yum安裝MYSQL例項轉載

LINUX作業系統:centOS6.3 64bit(安裝了系統預設開發包) 資料庫一: MYSQL版本:mysql-5.0.56 PORT:3306 系統目錄:/usr/local/mysql3306 資料庫二: MYSQL版本:mysql-5.1.72 PORT:330

mysql將欄位合併成一個欄位一列

一:sql語句SELECT declare_type_id,support_model,project_name,CONCAT(declare_type_id,support_model,project_name) from gf_index;二:結果

MyBatis傳入引數筆記

一、傳入一個引數 1、Controller裡面的方法 selectUser(@Param("user_id") int user_id) 2、Dao層的方法 public Li

在一臺Linux伺服器上安裝MySQL例項--使用mysqld_multi方式

(一)MySQL多例項概述例項是程序與記憶體的一個概述,所謂MySQL多例項,就是在伺服器上啟動多個相同的MySQL程序,執行在不同的埠(如3306,3307,3308),通過不同的埠對外提供服務。由於MySQL在一個例項下面可以建立多個數據庫,所以通常在一臺伺服器上只要安裝一個MySQL例項即可滿足使用。但

Mybatis定義註解實現DAO--實現DAO介面

  Java新增自定義註解:https://www.cnblogs.com/0xcafedaddy/p/6095187.html 1、自定義一個註解@MybatisRepository用作dao掃描 /** * @author cao * @description 前沿my

在一個進程中定義線程

daemon 之前 args 設置 tar main art blog thread import threadingfrom time import ctime,sleepimport timedef music(name): print(‘listening to