Mybatis框架学习(四)Mybatis 的参数深入和输出结果封装

Mybatis 的参数深入

parameterType 配置参数

  1. 使用说明:
    SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以
    是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。
  2. 注意事项:
    • 基本类型和 String 我们可以直接写类型名称,也可以使用包名 . 类名的方式
    • 实体类类型,目前我们只能使用全限定类名。

传递 pojo 包装对象

  1. 开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
  2. 需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。
  3. 编写 QueryVo
public class QueryVo implements Serializable {
	private User user;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}
  1. 编写持久层 接口
public interface IUserDao {
	//根据 QueryVo 中的条件查询用户
	List<User> findByVo(QueryVo vo);
}
  1. 持久层接口的映射
<!-- 根据用户名称模糊查询,参数变成一个 QueryVo 对象了 -->
<select id="findByVo" resultType="com.itheima.domain.User"parameterType="com.itheima.domain.QueryVo">
	select * from user where username like #{user.username};
</select>

Mybatis 的输出结果封装

resultType 配置结果类型

  1. resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
    • 需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名
    • 同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。

resultMap 结果类型

  1. 当实体类的属性名称跟数据库的列名不匹配时
public class User implements Serializable {
	private Integer userId;
	private String userName;
	private Date userBirthday;
	private String userSex;
	private String userAddress;
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Date getUserBirthday() {
		return userBirthday;
	}
	public void setUserBirthday(Date userBirthday) {
		this.userBirthday = userBirthday;
	}
	public String getUserSex() {
		return userSex;
	}
	public void setUserSex(String userSex) {
		this.userSex = userSex;
	}
	public String getUserAddress() {
		return userAddress;
	}
	public void setUserAddress(String userAddress) {
		this.userAddress = userAddress;
	}
	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName + ", userBirthday="+ userBirthday + ", userSex="+ userSex + ", userAddress=" + userAddress + "]";
	}
}
  1. 第一种方式就是修改映射的配置信息
    • 弊端:如果查询很多,都使用别名的话写起来很麻烦
使用别名查询
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
	select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user
</select>
  1. 所以我们使用下面的方法,resultMap结果类型
    • resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
    • 在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
<!-- 建立 User 实体和数据库表的对应关系
	type 属性:指定实体类的全限定类名
	id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
-->
<resultMap type="com.itheima.domain.User" id="userMap">
	<id column="id" property="userId"/>
	<result column="username" property="userName"/>
	<result column="sex" property="userSex"/>
	<result column="address" property="userAddress"/>
	<result column="birthday" property="userBirthday"/>
</resultMap>
id 标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称
  1. 则映射文件的配置就可以跟之前一样
<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
	select * from user
</select>

猜你喜欢

转载自blog.csdn.net/qq_41816516/article/details/106668707