一、传参处理
在Mybatis的使用过程中,Java接口方法中的参数如何与sql语句所需要传入的参数一一对应起来是一件非常重要的事情,接下来我们来看看Java各类参数在mybatis中的处理。
1.单个简单类型参数(Java内置类型,基本类型等)
mybatis不会做特殊处理,
取值方式:#{参数名/任意名}:取出参数值。
2.多个简单类型
二、多个参数:mybatis会做特殊处理:多个参数会被封装成 一个map,
这个封装起来的map的key为param1...paramN,或者参数的索引(形参名)也可以。
推荐:使用注解(@param(“索引1”)参数1,@param(“索引2”)参数2)
3.实体类(pojo)
mybatis内置类型处理器,所以想要取得实体类中的属性直接通过#{属性名}即可
4.实体类与普通参数混合
假设有方法 query(User user ,Integer id);
则对两个参数使用注解
query(@param("索引1")User user ,@param("索引2")Integer id)
想要调用对象中的属性则使用:#{索引1.属性名}
普通类型则直接#{索引2}
5.Map类型
map类型需要进行取值则通过#{key}取值
6.List、Set或者数组类型
(1)List、数组单独使用
如果是Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用这个key(list)
数组(array)
public Employee getEmpById(List<Integer> ids);
取值:取出第一个id的值: #{list[0]}
(2)结合foreach使用
Select * from user where id in
<foreach collection="array" item="user" open="(" separator="," close=")">
#{user}
</foreach>
二、结果集处理
1.返回简单类型
直接通过ResultType指明返回类型即可
2.返回类型为集合类型(List、Set)
注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。
resultType 和 resultMap 之间只能同时使用一个。
3.返回类型为Map
(1)返回单行数据时
每个字段对应着map中的一个key,查询的结果为value,注意将resultType设为java.util.HashMap
(2)返回多行数据时
需要使用MapperKey注解指明返回的map的key值,对应的Object应时能够包括单行所有查询记录类型
(Java类或者集合)
@MapKey("id")
Map<Integer, Employee> getAllEmp();
4.返回类型为pojo
此时mybatis的类型处理器会帮你自动映射与字段名相同的属性名进行赋值,如果两者存在差别可以在查询语句中使用别名进行处理。
5.需要使用resultMap的情形
mybatis包含类型处理器,所以很多类型能够帮我们进行自动映射,但是当结果集中有类型嵌套时我们就需要自定义结果集了
(1)返回结果为Java对象,对象成员属性中含有另一个对象。
需要使用association标签 指明JavaType,而且此时类型推断不会起作用(即使是同名变量也需要手动指明)
<resultMap id="userRoleMap" type="User">
<id property="id" column="id"></id>
<result property="userName" column="userName"></result>
<result property="userPassword" column="userPassword"></result>
<result property="address" column="address"></result>
<association property="role" javaType="com.openlab.pojo.Role" >
<id property="id" column="r_id"></id>
<result property="roleCode" column="roleCode"></result>
<result property="roleName" column="roleName"></result>
</association>
</resultMap>
(2)返回结果集为Java对象,并且成员属性含有集合类型
需要使用到collection标签,并且需要指明集合中保存的类型。
<resultMap id="userAddressMap" type="User">
<id property="id" column="id"></id>
<result property="userName" column="userName"></result>
<result property="phone" column="phone"></result>
<collection property="addresses" ofType="com.openlab.pojo.Address" resultMap="addressMap">
</collection>
</resultMap>