- select 標簽屬性。
- select 標簽的簡單使用。
- resultType 返回值類型。
- 多參數傳遞。
開發中對數據庫的操作,基本上都是查詢操作遠多於其他幾種操作。因此 select 標簽的使用也是最多的。
下面列出了 select 標簽支持的屬性:
1 <select 2 id="" 3 parameterType="" 4 parameterMap="" 5 resultType="" 6 resultMap="" 7 flushCache="" 8 useCache="" 9 timeout="" 10 fetchSize="" 11 statementType="" 12 resultSetType=""> 13 </select>
- id 命名空間的唯一標識符,一般是 dao 中對應的方法名。
- parameterType 參數類型,可選屬性。MyBatis 可以通過 TypeHandler 推斷出具體傳入語句的參數,默認值為 unset。
- resultType 期望返回的數據類型的類的全限定名。
- resultMap 結果集映射,不可以和 resultType 同時使用。一般如果返回數據類型是常用的類型,比如 String Map List 的時候,可以使用 resultType。如果返回的是簡單 POJO 類的時候,也可以直接使用 resultType,如果是復雜的映射或者連級查詢的時候就需要使用 resultMap。
- flushCache 將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:false。
- useCache 將其設置為 true,將會導致本條語句的結果被二級緩存,默認值:對 select 元素為 true。
簡單查詢
下面是一個簡單的查詢,查詢 user_info 表里的所有數據,並返回 UserInfo 類型的 List 集合。
1 //POJO 類定義 2 public class UserInfo { 3 Integer user_id; 4 String userName; 5 String password; 6 Integer age; 7 String address; 8 9 //構造器和 get/set 方法此次省略。 10 } 11 12 //mapper xml 配置 13 <select id="queryUserAll" resultType="util.UserInfo"> 14 SELECT * FROM USER_INFO 15 </select> 16 17 //dao 接口方法定義 18 public interface IResmDao { 19 List<UserInfo> queryUserAll(); 20 } 21 22 //test 23 IResmDao iResmDao = session.getMapper(IResmDao.class); 24 List<UserInfo> userInfos = iResmDao.queryUserAll();
resultType 返回值類型
當我們使用 select 標簽查詢的時候,根據業務的不同,會對返回的數據類型有不同的要求。
比如返回值可能是基本數據類型,String,Integer,POJO,List,Map 等。又應該怎樣使用呢?
返回基本數據類型
以基本數據類型 int 為例。
dao 層接口定義:
1 int queryUserAgeById(int userId);
mapper.xml 配置文件:
1 <select id="queryUserAgeById" resultType="int"> 2 select age from user_info where user_id = #{userId} 3 </select>
返回 List 集合
dao 層接口定義:
1 List<UserInfo> queryUserListByIds(List<Integer> ids);
mapper.xml 配置文件:
1 <select id="queryUserListByIds" resultType="util.UserInfo"> 2 <if test="list != null and list.size > 0"> 3 select * from user_info where user_id in 4 <foreach collection="list" index="index" item="item" open="(" close=")" separator=","> 5 #{item} 6 </foreach> 7 </if> 8 </select>
返回 Map 集合
dao 層接口定義:
注解 @MapKey("user_id") 用於指定 Map 的 key,也是 POJO 定義的字段。例子里的 value 是封裝的 POJO 類。
1 @MapKey("user_id") 2 Map<Integer,UserInfo> queryUserMapByIds(List<Integer> ids);
mapper.xml 配置文件:
<select id="queryUserMapByIds" resultType="util.UserInfo"> select * from user_info where user_id in <foreach collection="list" index="index" item="item" open="(" close=")" separator=","> #{item} </foreach> </select>
返回實體字段與數據庫字段不一致的 Map 集合
dao 層接口定義:
注解 @MapKey("user_id") 用於指定 Map 的 key,是 POJO 字段屬性。例子里的 value 是封裝的 POJO 類。
1 @MapKey("user_id") 2 Map<Integer,UserInfo> queryAllMap();
mapper.xml
1 <resultMap id="userInfoEntry" type="util.UserInfo"> 2 <result column="id" property="user_id"/> 3 <result column="username" property="userName"/> 4 <result column="password" property="password"/> 5 <result column="age" property="age"/> 6 <result column="address" property="address"/> 7 </resultMap> 8 9 <select id="queryAllMap" resultMap="userInfoEntry"> 10 select * from USER_INFO 11 </select>
返回 POJO 類:
dao 層接口定義:
1 UserInfo queryPOJOById(int userId);
mapper.xml 配置文件:
1 <select id="queryPOJOById" resultType="util.UserInfo"> 2 select * from user_info where user_id = #{userId} 3 </select>
多個參數傳遞的情況
使用注解
dao 層接口定義:
1 List<UserInfo> queryUserByMultPara(@Param("age") Integer age, @Param("userName") String userName, @Param("address") String address);
mapper.xml 配置文件:
1 <select id="queryUserByMultPara" resultType="util.UserInfo"> 2 select * from user_info 3 where age = #{age} and username = #{userName} and address = #{address} 4 </select>
使用 Map 傳參
使用 Map 傳參,value 值就是參數值。
dao 層接口定義:
1 List<UserInfo> queryUserByMultMap(Map<String,Object> param);
mapper.xml 配置文件:
#{age} 中的 age 即 Map 中的 key,#{age} 可以直接獲取 Map 的 value。
1 <select id="queryUserByMultMap" resultType="util.UserInfo"> 2 select * from user_info 3 where age = #{age} and username = #{userName} and address = #{address} 4 </select>
使用 POJO 來傳參
dao 層接口定義:
1 List<UserInfo> queryUserByMultPOJO(UserInfo userInfo);
mapper.xml 配置文件:
#{age} 其實就是 UserInfo 的屬性。
1 <select id="queryUserByMultPOJO" resultType="util.UserInfo"> 2 select * from user_info 3 where age = #{age} and username = #{userName} and address = #{address} 4 </select>
參考:
https://blog.csdn.net/moakun/article/details/80057181
https://www.w3cschool.cn/mybatis/f4uw1ilx.html
https://blog.csdn.net/codejas/article/details/79520246