Mybatis输入输出映射
输入映射
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。
1. 传递pojo的包装对象
(1) 需求
完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)
(2)定义包装类型pojo
针对上边需求,建议使用自定义的包装类型的pojo。
在包装类型的pojo中将复杂的查询条件包装进去。
User.java
package com.ren.mybatis.po;
import java.util.Date;
import java.util.List;
/**
* POJO类
*
* @author 任志燕
* 2017年4月18日
*
*/
public class User {
private int id;//使用自增字段
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User() {
// TODO Auto-generated constructor stub
}
public User(String username, String sex, Date birthday, String address) {
super();
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
}
UserCustom.java
package com.ren.mybatis.po;
/**
* User的扩展类:如果修改了用户表后,不要修改User类,可以定义一个它的扩展类
*
* @author 任志燕
* 2017年4月19日
*
*/
public class UserCustom extends User {
}
UserQueryVo.java
package com.ren.mybatis.po;
import java.util.List;
/**
* POJO的包装类型:
* 用于包装所需要的查询条件:
* @author 任志燕
* 2017年4月19日
*
*/
public class UserQueryVo {
//用户查询条件
private UserCustom userCustom;
//包含其他的查询条件:订单、商品..
private List
ids;//定义一个查询id集合,用于如果查询id在某一个范围内时使用
public void setIds(List
ids) {
this.ids = ids;
}
public List
getIds() {
return ids;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
public UserCustom getUserCustom() {
return userCustom;
}
}
(3)mapper.xml
在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。
select * from user where user.sex=#{userCustom.sex}
and user.username like '%${userCustom.username}%'
select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
(4) mapper.java
//多条件查询:使用POJO包装模型
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
//查询总记录条数
public int findTotalCount(UserQueryVo userQueryVo) throws Exception;
(5)测试代码
//多条件查询:使用POJO包装模型
@Test
public void testfindUserList() throws Exception
{
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到Mapper接口的代理类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserCustom userCustom = new UserCustom();
UserQueryVo userQueryVo = new UserQueryVo();
userCustom.setSex("1");
userCustom.setUsername("小明");
userQueryVo.setUserCustom(userCustom);
List<Integer>ids = new ArrayList<>();
ids.add(16);
ids.add(22);
ids.add(42);
userQueryVo.setIds(ids);
List<UserCustom> list = userMapper.findUserList(userQueryVo);
for (UserCustom userCustom2 : list) {
System.out.println(userCustom2.getUsername());
}
}
//查询总记录条数
@Test
public void testfindCount() throws Exception
{
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到Mapper接口的代理类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserCustom userCustom = new UserCustom();
UserQueryVo userQueryVo = new UserQueryVo();
userCustom.setSex("1");
userCustom.setUsername("小明");
userQueryVo.setUserCustom(userCustom);
int totalCount = userMapper.findTotalCount(userQueryVo);
System.out.println(totalCount);
}
输出映射
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,就不会创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
1.输出简单类型
(1)需求
用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。
(2)mapper.xml
<!--查询总记录条数 -->
<select id="findTotalCount" parameterType="UserQueryVo" resultType="int">
select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
</select>
(3) mapper.java
public int findTotalCount(UserQueryVo userQueryVo) throws Exception;
(4)测试代码
//查询总记录条数
@Test
public void testfindCount() throws Exception
{
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到Mapper接口的代理类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserCustom userCustom = new UserCustom();
UserQueryVo userQueryVo = new UserQueryVo();
userCustom.setSex("1");
userCustom.setUsername("小明");
userQueryVo.setUserCustom(userCustom);
int totalCount = userMapper.findTotalCount(userQueryVo);
System.out.println(totalCount);
}
(5) 小结
查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。
2. 输出pojo对象和pojo列表
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的;
在mapper.java指定的方法返回值类型不一样;
①输出单个pojo对象,方法返回值是单个对象类型
②输出pojo对象list,方法返回值是List<Pojo>
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList(返回集合对象调用 ).
resultMap
mybatis中使用resultMap完成高级输出结果映射。
(1) resultMap使用方法
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
1、定义resultMap;
2、使用resultMap作为statement的输出映射类型;
(2)将下边的sql使用User完成映射
SELECT id id_,username username_ FROM USER WHERE id=#{value}
User类中属性名和上边查询列名不一致。
①定义reusltMap:
<!--
定义resultMap:
映射select id id_,username username_ from user和User类的属性
type:resultMap最终映射的java类型(可以使用别名)
id:是对resultMap的唯一标识
-->
<resultMap type="User" id="userResultMap">
<!--id:表示查询结果集中唯一标识(主键): column:查询出的列名;property:对应的java对象的属性名 -->
<id column="id_" property="id"/>
<!--result:表示查询结果集中普通字段: column:查询出的列名;property:对应的java对象的属性名 -->
<result column="username_" property="username"/>
</resultMap>
② 使用resultMap作为statement的输出映射类型
<!--
2.根据id查询用户,使用resultMap输出类型:
3.select id id_,username username_ from user查询出来的列名
和User属性名不一致,所以需要定义一个resultMap将列名和User类的属性名
做一个映射;
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
select id id_,username username_ from user where id = #{id}
</select>
③ mapper.java
public User findUserByIdResultMap(int id) throws Exception;
④ 测试
@Test
public void findUserByIdResultMap() throws Exception
{
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到Mapper接口的代理类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserByIdResultMap(25);
System.out.println(user.getUsername());
}
小结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。