1. 程式人生 > >Mybatis返回單個實體或者返回集合List

Mybatis返回單個實體或者返回集合List

Mybatis 的強大之處之一體現在對映語句上,讓我們可以使用簡單的配置,就可以實現對引數和返回結果的對映。

實體

package com.test.User

public class User{
private String userId;
private String userName;
private String userPassword;
private Date createTime;
...
setter getter....
}

DAO

public interface UserMapper{
	User getUserById(String userId);  //返回單個實體
List<User> getUserByName(String userName); //返回List Map<String,Object> getUserInfoById(String userId); List<Map<String,Object>> getUserInfoByName(String userName); }

資料庫

create table user{
ID varchar(40),
USER_NAME varchar(200),
USER_PASSWORD varchar(100),
CREATE_TIME datetime,
.... }

1.返回某個實體

mybatis對映檔案

	<select id="getUserById" parameterType="string" resultType="com.test.User">
		select * from user where id = #{userId}
	</select>
  • id :identification:語句的標識,在同一個mapper對映檔案下id需要唯一
  • parameterType: 引數型別,可以不寫。因為 MyBatis 可以推斷出傳入語句的具體引數
  • resultType: 全限定類名或者是類型別名.

此時需要 資料庫表的列名或列別名 和 類的屬性名相同

,這樣才能進行欄位的匹配(USER_ID 和userId 就不能匹配)。但是如果在Mybatis配置檔案中設定了

<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/> <!--開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。-->
</settings>

此時,表列名的下劃線標記方式可以對映到駝峰標記的形式。

TooManyResultsException

當實際返回值有多個時則丟擲異常。

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

除非可以確定最多隻能查詢到一條結果,否則的話不建議這麼寫.可以嘗試返回集合的方式。

2.返回List

	<select id="getUserInfoByName"  resultType="map">
		select * from user where user_name = #{userName}
	</select>

返回List< T > 集合時,resultType設定為集合元素的型別即T。

從上面可以看到,返回單個實體與返回集合的sql 是一樣的,不一樣的地方在Mapper介面或者sqlSession中定義的返回結果型別。實際上mybatis執行查詢的時候也都是使用selectList()來進行查詢的。

  1. 使用Mapper的方式的查詢結果時,Mybatis會生成該介面的代理類(MapperProxy),然後根據Method的getReturnType()方法,拿到返回型別。最後也是呼叫sqlSession的一些方法。
  2. 使用SqlSession時,提供了selectOne() 或者selectList()來返回單個實體或者集合。

當返回的查詢結果數量和返回型別不一致時,則會丟擲TooManyResultsException

推薦使用返回集合的方式來查詢結果

//查詢單條結果
List<User> userList= mapper.getUserList(userName);
if(userList.isEmpty() || userList.size() >1)//期望獲得一條結果
	//業務處理,一般是丟擲異常或者直接返回錯誤結果
	//return xx;	
	//throw xxx
User user = userList.get(0);

3.返回Map

	<select id="getUserInfoById"  resultType="map">
		select * from user where id=#{userId}
	</select>

如果想要返回單個Map<key,value>集合,只需要設定resultType="map"就可以了,此時返回的例項型別是HashMap。Map的key就是資料表的列名或者列別名

如果需要返回LinkedHashMap,需要使用全限定類名resultType="java.util.LinkedHashMap"

4.返回List< Map >

	<select id="" parameterType="" resultType="map">
		sql_caluse
	</select>

resultType設定為map,跟上面一樣resultType設定為List集合中元素的型別。

小結:

  • 返回集合與返回單個實體物件在對映檔案的寫法是一致的,不同的地方在於Mapper的返回型別不同。
  • 如果不確定返回值是否是唯一的,儘量使用 集合的返回方式。然乎使用get(0)的方式獲取實體。
  • 如果返回實體,一般情況會使用 resultMap來對映返回結果。這樣更清晰,直觀,而且還可以使用typeHandler對資料做進一步處理

相關推薦

Mybatis返回單個實體或者返回集合List

Mybatis 的強大之處之一體現在對映語句上,讓我們可以使用簡單的配置,就可以實現對引數和返回結果的對映。 實體 package com.test.User public class User{ private String userId; private

mybatis查詢結果集,返回List的物件集合

mapper介面中寫的方法的返回值為List的物件陣列首先需要在mapper.xml中對映一個resultmap,column為類中的屬性也就是表中所對應的欄位。程式碼如下:<resultMap id="seeShare" type="com.example.demo.

關於引數傳遞接受@RequestBody 寫的位置不同決定返回list還是單個實體

//關於引數傳遞接受,有些引數不是required,可以不傳進來, //寫在外面的時候裡面的只能是單個實體 @RequestMapping(value = "/savemobile") @RequestBody     public int saveMobile(@Req

使用MyBatis時接收值和返回值選擇Map型別或者實體型別

本文轉自:http://www.cnblogs.com/waliwaliwa/p/6924849.html今天換專案組了,給的專案,我看到mybatis框架寫的sql語句時,有點懵逼。。很久沒有用這種寫法了。就是接收引數和返回值都是用map而我之前所接觸的專案都是將引數和返回

Mybatis: 返回不同實體(物件陣列)

       現在有這樣一個需求:我這裡有20個表名,然後隨便選一個,你給我到這個所選的表裡面把所有資料給我拿回來。之前的話我們都是有一個確定的表名,根據這個表建立一個實體類,當返回資料時,把resultTyoe設成這個實體類就可以了。但是

【java專案】mybatis中的mapper查詢時返回其他實體(多用於多表查詢)

<select id="selectUserorder" resultType="com.pojo.Orderdetail" parameterType="java.lang.Integer"> SELECT a.o_status, a.o_no, a.uid,

Mybatis中《insert》返回map、list及巢狀、association和collection分佈查詢及延遲載入(懶載入)(按需載入)

本文目錄類容目錄結構: 一、select返回值 1、返回值記錄封裝為List 2、返回值記錄封裝為map 二、select_resultMap 1、自定義結果對映規則 2、關聯查詢_級聯屬性封裝結果,即<result column="did" pro

jQuery AJAX方法 後臺返回一個實體類的list

java程式碼 自定義實體類ChartSeries public class ChartSeries { private String name; //曲線名稱 p

mybatis學習之查詢結果返回List以及Map

當要查詢的結果不是單個記錄而是一個集合的時候,mybatis的resultType寫的依然是集合中的物件的型別名稱,例如: <select id="getPersonByNameLike"resultType="mybatis_01.Pers

SpringMVC的介面,接收json資料返回json資料並且解析為List物件集合

請求引數實體類 package com.lifuyi.entity; /** * 請求引數**重點內容** */ public class RequestPram { //訂單號 private String orderNum;

mybatis呼叫oracle儲存過程返回遊標 讀取到java的List

mapper: <select id="testP" statementType="CALLABLE" > {call P_TEST(#{v_cursor, mode=OUT, jdbcType=CURSOR})} </select> ja

springboot下將返回的null值變為空字串或者集合

       最近在專案中遇到了後臺將返回資料中的null值全處理成了空字串,導致前端在使用集合型別的時候報錯,看了下當前程式碼處理的邏輯,是把所有的null值轉換成了空字串,對集合型別的資料沒有做特別處理。         隨後自己搭建了一個springboot專案來測試

sql存儲過程,根據多個條件查詢,返回一個dataTable或者DataSet

bold new exc cnblogs 所有 sql存儲過程 存儲 ring table 不廢話,先直接代碼 首先sql部分(我在這裏加了一個@zx作為判斷,一般不需要這個參數): ALTER Proc [dbo].[Proc_Boss_Show] @StrIndex

springmvc+spring+mybatis+sqlserver----查詢sqlserver----有返回參數

cal sql mod spring varchar type arc tty server <resultMap type="java.util.HashMap" id="resultMap"> <result column="U

mybatis添加記錄時返回主鍵id

測試數據 image creat ger org 設計 efault 需要 generated 參考:https://www.cnblogs.com/nuccch/p/7687281.html 場景 有些時候我們在添加記錄成功後希望能直接獲取到該記錄的主鍵id值,而不需要

MyBatis傳入集合 list 數組 map參數的寫法

obi ray syn div ppa oracl emp myba decimal foreach的主要用在構建in條件中,它可以在SQL語句中進行叠代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,clo

mybatis插入數據後返回自增的主鍵id

pre tails isp entity CA ctc ron creat rod 在插入數據時候想自動返回mysql的自增的主鍵,需要在mapper.xml中配置下; <insert id="insert" parameterType="com.rograndec.

mybatis中使用selectKey,返回結果一直是1

batis type 這就是 字段 tis 屬性 筆記 getc tty mybatis中使用selectKey,返回結果一直是1,結合這個問題,筆記一下selectKey標簽以及問題的原因 先說需求,向數據庫插入一條記錄,表的id是自增的,插入以後返回插入記錄的id 下面

【java】【mybatis】在使用mybatis進行批量插入,批量更新等批量操作時,切割In集合List進行分批批量操作的java中的切割代碼

lse span ati 批量更新 次數 sublist 調用 size ==       紅字部分代表mybatis的批量操作調用方法:       int num = 0; int maxLength = 200; in

mybatis插入數據並返回主鍵(oracle)

數據庫 stat batis 還需 varchar 返回 序列值 long values 通常我們執行一個inser語句,即使有返回,也只是會返回影響了多少條數據 @insert("insert into t_user (id,name) values (suser.