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