目录
前言
通过 paramterType
指定输入参数类型,类型可以是 简单类型
、pojo
、hashmap
,这里只讲究相对较难的 pojo
;
输入映射 — — 传递 pojo
包装类型 (复杂查询 )
需求
:完成用户信息的综合查询,需要 传入查询条件(可能包括用户信息、其他信息,比如:商品信息、订单信息) ;
例子
:查询所有买了 i7-4710 cpu
电脑的用户信息 ;
针对上面需求,建议使用自定义的 包装类型 pojo
,在包装类型的 pojo
中将复杂的 查询条件
包装起来 ;将需要查询的条件,作为包装类型的属性,封装进去 ;
后面学到逆向工程的时候,我们就不再需要手写 User
这样的类,直接使用工具根据数据库的字段,自动生成 ;
假如,生成的类,我们需要做一些改动,我们推荐写一个增强类继承生成的类,在增强类中改动 ;
事例代码
:
public class UserStrengthen extends User {
//.... 要增强的内容
}
说明
:其实复杂查询,也很好理解,就是当查询条件比较复杂的时候,我们需要对其进行封装,这里我们将复杂条件封装到 UserQueryVo
中 ,需要对该类,设置 get 、set
方法,为了mybatis
使用反射获取其属性 ;
UserQueryVo
类 :
/**
* 封装复杂查询条件
* @author An
*/
public class UserQueryVo {
/**
* 封装用户条件
*/
private UserStrengthen userStrengthen ;
public UserStrengthen getUserStrengthen() {
return userStrengthen;
}
public void setUserStrengthen(UserStrengthen userStrengthen) {
this.userStrengthen = userStrengthen;
}
//.... 封装其他条件,比如商品订单
}
在映射文件中,写出 sql
语句,参数类型就是我们封装的 UserQueryVo
类 ;
<!--复杂查询-->
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen">
SELECT * from user where sex = #{userStrengthen.sex} and name like '%${userStrengthen.name}%'
</select>
在 mapper
代理接口中,构建出方法:
/**
* 复杂查询
* @param userQueryVo
* @return
* @throws Exception
*/
public List<UserStrengthen> findUsersByVo(UserQueryVo userQueryVo) throws Exception ;
输出映射 — — resultType
输出映射可以,可以输出 简单类型
,pojo 对象
,pojo 列表
、hashmap
;
其中输出 pojo 对象
可改为输出 hashmap
,其中字段名是 key
,名字值是 value
;输出 pojo 列表
可改为输出 List<HashMap>
;
说明:在使用 resultType
进行输出映射的时候,只要查询出来的列名
和 pojo
对象的属性
名一致的时候,该列结果才会得到映射; 如果查询结果的列,没有一列
得到映射,则不会创建 pojo 对象,但是 只要有一列
得到映射,就会创建 pojo
对象 ;
输出映射 — — resultMap
mybatis 中完成高级输出结果映射的东西,完成 一对多、多对多、多对一
;(以后会讲)
简单的使用场景
如果查询出来的列名
和 pojo
对象的属性名
不一致,那么可以通过定义一个 resultMap
对列名和属性名之间,进行映射 ;
在映射关系中定义
resultMap
<!--定义一个 resultMap--> <!-- id 是 resultMap 的唯一标识 ; type 是 resultMap 最终要将查询的列名和谁进行映射的类 --> <resultMap id="userMap" type="user"> <!--对 结果集中的唯一标识,例如主键,使用 id标签 进行映射--> <id column="id_" property="id"></id> <!--其他属性使用 result 进行映射--> <result column="sex_" property="sex"></result> </resultMap>
使用
resultMap
作为statement
的输出映射类型 ;<!--如果 map 定义在其他映射关系文件中,则需要加上命名空间--> <select id="findUserByMap" parameterType="int" resultMap="userMap"> SELECT id id_,sex sex_ from user where id = #{id} </select>
在
mapper
接口中,定义方法,方法的返回值,是 **resultMap
中的type
类型 ;public User findUserByMap(int id) throws Exception ;