(五)MyBatis映射器—select元素(查询语句)

在映射器中select元素代表SQL的select语句,用于查询。在SQL中,select语句是用的最多的语句。在MyBatis中select也是非常关键的,也是用的最多的元素,因为它在性能上的强大,同时也和其他的持久层框架产生的差距。

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版权协议,转载请附上原文出处链接和本声明。