• 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}

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>