一、输入映射-包装类型
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。
1.需求
条件查询用户的综合信息
User.java
package entity;
import java.util.Date;
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
UserCustom.java
package entity;
public class UserCustom extends User {
//扩展User类
}
UserQuerVo.java
package entity;
public class UserQuerVo {
private UserCustom userCustom;
//包装UserCustom
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
userMapper.xml
<!--综合信息查询 根据姓名和性别-->
<!-- #{userCustom.username} 取出pojo包装对象中姓名-->
<select id="findUserByinfo" parameterType="entity.UserQuerVo" resultType="entity.UserCustom">
SELECT * FROM user WHERE username = #{userCustom.username} AND sex LIKE "%${userCustom.sex}%"
</select>
UserDaoMapperTest.java
@Test
public void findUserByinfo() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建userDaoMapper对象,mybatis自动生成mapper代理对象
UserDaoMapper userDaoMapper = sqlSession.getMapper(UserDaoMapper.class);
//创建包装对象,设置查询条件
UserQuerVo userQuerVo = new UserQuerVo();
UserCustom userCustom = new UserCustom();
userCustom.setUsername("马云");
userCustom.setSex("男");
userQuerVo.setUserCustom(userCustom);
UserCustom userCustom1= userDaoMapper.findUserByinfo(userQuerVo);
System.out.println(userCustom1);
}
二、输出映射
- resultType
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
1.输出简单类型
userMapper.xml
<!--输出映射 pojo resultType-->
<select id="findUserCount" parameterType="entity.UserQuerVo" resultType="int">
SELECT COUNT(*) FROM user WHERE username LIKE "%${userCustom.username}%"
</select>
UserDaoMapper.java
//输出映射 pojo resultType
public int findUserCount(UserQuerVo userQuerVo) throws Exception;
UserDaoMapperTest.java
@Test
public void findUserCount() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDaoMapper userDaoMapper = sqlSession.getMapper(UserDaoMapper.class);
UserQuerVo userQuerVo = new UserQuerVo();
UserCustom userCustom = new UserCustom();
userCustom.setUsername("马");
userQuerVo.setUserCustom(userCustom);
int num = userDaoMapper.findUserCount(userQuerVo);
System.out.println(num);
}
2.输出pojo对象和pojo列表
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml
中resultType指定的类型是一样的。
在mapper.java
指定的方法返回值类型不一样
- 输出单个pojo对象,方法返回值是单个对象类型
- 输出pojo对象list,方法返回值是List<Pojo>
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 ).
- resultMap
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。- 1.定义resultMap
- 2.使用 resultMap作为输出映射类型
userMapper.xml
<!--配置resultMap映射-->
<resultMap id="PojoresultMap" type="entity.User">
<!-- id表示查询结果集中唯一标识
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作为一个映射关系(对应关系)
-->
<id column="i" property="id"></id>
<!-- result:对普通名映射定义-->
<result column="us" property="username"></result>
<result column="ad" property="address"></result>
</resultMap>
<!--输出映射 pojo resultMap-->
<select id="findUserByResultMap" parameterType="int" resultMap="PojoresultMap">
SELECT id i,username us, address ad FROM user WHERE id = #{userCustom.id}
</select>
UserDaoMapper.java
//输出映射 pojo resultMap
public User findUserByResultMap(int id) throws Exception;
UserDaoMapperTest.java
@Test
public void findUserByResultMap() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDaoMapper userDaoMapper = sqlSession.getMapper(UserDaoMapper.class);
User user = userDaoMapper.findUserByResultMap(10);
System.out.println(user);
}
总结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。