在映射器中select元素代表SQL的select语句,用于查询。在SQL中,select语句是用的最多的语句。在MyBatis中select也是非常关键的,也是用的最多的元素,因为它在性能上的强大,同时也和其他的持久层框架产生的差距。
| 元素 | 说明 | 备注 |
| id | 它和Mapper的命名空间组合起来是唯一的, 供MyBatis调用 | 如果命名空间和id结合起来不唯一, MyBatis将抛出异常 |
| parameterType | 可以给出类的全命名,也可以给出别名,但是别名必须是MyBatis内部定义或者自定义的 | 可以选择Java Bean Map等简单的参数类型传递给SQL |
| resultType | 定义类的全路径。在允许自动匹配的情况下,结果集将通过JavaBean的规范映射: 或定义为int、double. float、 map等参数: 也可以使用别名,但是要符合别名规范,且不能和resultMap同时使用 | 常用的参数之一,比如统计总条数时可以把它的值设置为int |
| resultMap | 它是映射集的引用,将执行强大的映射功能。我们可以使用resultType和resultMap其中的个, resultMap 能提供自定义映射规则的机会 | MyBais最复杂的元素,可以配置映射规则、级联、typeHandler 等 |
| flushCache | 它的作用是在调用SQL后,是否要求MyBatis清空之前查询本地缓存和二级缓存 | 取值为布尔值,true/false. 默认为false |
useCache | 启动二级缓存的开关,是否要求MyBatis将次结果缓存 | 取值为布尔值,true/false. 默认为false |
在实际工作中用到的最多就是id、parameterType、resultType、resultMap。
简单的查询select元素应用
我们做一个实体类
public class Role {
private Long id;
private String roleName;
private String note;
/**
setter and getter
**/
}
我们做一个简单的查询例子:
<select id="countUserByName" parameterType="string" resultType="int">
select count(*) total from t_user
where user_name like concat(#{firstName},'%')
</select>- id配合Mapper的全限定名,联合成为一个唯一的标识,用于标识这条SQL.
- parameterType 表示这条SQL接受的参数类型,可以是MyBatis 系统定义或者自定义的别名,比如int、string. flont等,也可以是类的全限定名,比如com.liefeng.pojo.User.
- resultType 表示这条SQL返回的结果类型,与parameterType样, 可以是系统定义或者自定义的别名,也可以是类的全限定名.
- #{fistName}是被传递进去的参数.
我们在给它加一个接口方法程序:
public Integer countUserByName (String firstName);
这样一个简单的查询就完成了
使用注解传递多个参数
@Param(org.apache.ibatis.annotations.Param)
public List<Role> findRolesByAnnotation (Param ("roleName") String rolename ,
@Param ("note") String note);<select id="findRolesByAnnotation" resultType="role">
select id, role_name as roleName, note from t_role
where role name like concat('%', #(roleName), '%')
and note like concat('%', #{note}, '%')
</select>
这时就不需要parameterType属性,MyBatis会自动探索。
使用java Bean传递多个参数
如果SQL很复杂,拥有很多的参数,那么我们就是用Java Bean老传递参数。
public List<Role> findRoleByBean(RoleParams roleParam);我们来更改配置文件
<select id="findRolesByBean" parameterType="com.learn.ssm.param.RoleParams" resultType="role">
select id, role_name as roleName, note from t_role
where role game like concat('%', #{roleName}, '%')
and note like concat('%', #(note}, '%')
</select>总结一下参数传递
- 使用@Param注解传递多个参数,受到参数个数(n) 的影响。当n≤5时,这是最佳的传参方式,它比用Java Bean更好,因为它更加直观:当n>5时,多个参数将给调用带来困难,此时不推荐使用它。
- 当参数个数多于5个时,建议使用Java Bean方式。
- 对于使用混合参数的,要明确参数的合理性。
使用resultMap映射结果集
自动映射和驼峰映射规则比较简单,无法定义多的属性,比如typeHandler、级联等。为了支持复杂的映射,select元素提供了resultMap属性。先定义resultMap属性
<mapper namespace="com.learn.ssm.mapper.RoleMapper">
<resultMap id="roleMap" type="role">
<id property="id” column="id"/>
<result property="roleName" column="role_name"/>
<result property-"note" column="note"/>
</resultMap>
<select id="getRoleUseResultMap"
parameterType="long" resultMap="roleMap">
select id, role name, note from t_role where id = #{id}
</select>
</mapper>
- resultMap元素定义了个 roleMap它的属性id代表它的标识,type代表使用哪个类作为其映射的类,可以是别名或者全限定名,role 是ccom.learn.ssm.mapper.Role的别名。
- 它的子元素id代表resultMap的主键,而result代表其属性id和result元素的属性property代表POJO的属性名称,而column代表SQL的列名。把POJO的属性和SQL的列名做对应,例如POJO的属性roleName,就用SQL的列名role_name 建立映射关系。
- 在select 元素中的属性resultMap制定了采用哪个resutMap作为其映射规则。
版权声明:本文为wfy2695766757原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。