mybatis(2)输入和输出映射,动态sql,使用resultMap, 一对多关联

2 输入映射和输出映射
2.1 parameterType(输入类型)
2.1.1 传递简单类型
参考第一天内容
2.1.2 传递pojo对象
参考第一天内容
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
2.1.3 传递pojo包装对象

  1. 新建包装pojo对象QueryVo
    /**
  • 包装pojo

  • @author Steven
    */
    public class QueryVo {

    //用户对象
    private User user;

    public User getUser() {
    return user;
    }

    public void setUser(User user) {
    this.user = user;
    }

}

  1. 映射文件与sql
<select id="getUserByQueryVo" parameterType="queryvo" resultType="com.itheima.mybatis.pojo.User">
	<!-- SELECT * FROM USER WHERE username LIKE #{name} -->
	SELECT * FROM USER WHERE username LIKE '%${user.username}%'
</select>
  1. 新增接口方法
  2. 增加测试方法,完成测试

2.2 resultType(输出类型)
2.2.1 输出简单类型

<select id="getUserCount" resultType="int">
	SELECT COUNT(1) FROM USER
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。

2.2.2 输出pojo对象

2.2.3 输出pojo列表

2.3 输出resultMap
演示基于完成订单列表的查询,由user_id字段与pojo属性不一致时引出的resultMap。

<resultMap type="order" id="orderMap">
	<!-- id标签用于绑定主键 -->
	<!-- <id property="id" column="id"/> -->
	
	<!-- 使用result绑定普通字段 -->
	<result property="userId" column="user_id"/>
	<result property="number" column="number"/>
	<result property="createtime" column="createtime"/>
	<result property="note" column="note"/>
</resultMap>
<!-- 使用resultMap -->
<select id="getOrderListResultMap" resultMap="orderMap">
	SELECT * FROM `order`
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。

3 动态sql
3.1 If
演示基于完成用户列表查询功能,由多查询条件拼装引出if标签。

<select id="getUserByWhere" parameterType="user" resultType="com.itheima.mybatis.pojo.User">
	<!-- SELECT * FROM USER WHERE username LIKE '%${username}%' and id = #{id} -->
	SELECT * FROM USER where 1 = 1
	<!-- if标签的使用 -->
	<if test="id != null">
		and id = #{id}
	</if>
	<if test="username != null and username != ''">
		and username LIKE '%${username}%'
	</if>
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。

3.2 Where
复制getUserByWhere修改一下,改名为getUserByWhere2。

<select id="getUserByWhere2" parameterType="user"
	resultType="com.itheima.mybatis.pojo.User">
	<!-- include:引入sql片段,refid引入片段id -->
	SELECT
	*
	FROM USER
	<!-- where会自动加上where同处理多余的and -->
	<where>
		<!-- if标签的使用 -->
		<if test="id != null">
			and id = #{id}
		</if>
		<if test="username != null and username != ''">
			and username LIKE '%${username}%'
		</if>
	</where>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。

3.3 Foreach
复制getUserByWhere2修改一下,改名为getUserByIds。

<select id="getUserByIds" parameterType="queryvo"
	resultType="com.itheima.mybatis.pojo.User">
	
	SELECT
	*
	FROM USER
	<!-- where会自动加上where同处理多余的and -->
	<where>
		<!-- id IN(1,10,25,30,34) -->
		<!-- foreach循环标签 
			 collection:要遍历的集合,来源入参 
			 open:循环开始前的sql 
			 separator:分隔符 
			 close:循环结束拼接的sql
		-->
		<foreach item="uid" collection="ids" open="id IN(" separator=","
			close=")">
			#{uid}
		</foreach>		</where>
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
3.4 Sql片段
演示通过select * 不好引出查询字段名,抽取共用sql片段。

  1. 定义
<sql id="user_column">
	`id`,
	`username`,
	`birthday`,
	`sex`,
	`address`,
	`uuid2`
</sql>
  1. 使用
    SELECT


    FROM USER

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。

4 关联查询
4.1 一对一关联
4.1.1 方法一,使用resultType

  1. 新建OrderUser的pojo,继承自Order。
    public class OrderUser extends Order {

    private String username;
    private String address;
    …….get,set
    }

  2. 修改order的映射文件,新增查询方法getOrderUser。

<select id="getOrderUser" resultType="orderuser">
	SELECT
	  o.`id`,
	  o.`user_id` userId,
	  o.`number`,
	  o.`createtime`,
	  o.`note`,
	  u.`username`,
	  u.`address`
	FROM `order` o
	LEFT JOIN `user` u
	ON u.id = o.`user_id`
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
4.1.2 方法二,使用resultMap

  1. 改造order的pojo

  2. 修改order的映射文件

<resultMap type="order" id="order_user_map">
	<!-- id标签用于绑定主键 -->
	<id property="id" column="id"/>
	<!-- 使用result绑定普通字段 -->
	<result property="userId" column="user_id"/>
	<result property="number" column="number"/>
	<result property="createtime" column="createtime"/>
	<result property="note" column="note"/>
	
	<!-- association:配置一对一关联
		 property:绑定的用户属性
		 javaType:属性数据类型,支持别名
	-->
	<association property="user" javaType="com.itheima.mybatis.pojo.User">
		<id property="id" column="user_id"/>
		
		<result property="username" column="username"/>
		<result property="address" column="address"/>
		<result property="sex" column="sex"/>
	</association>
</resultMap>
<!-- 一对一关联查询-使用resultMap -->
<select id="getOrderUser2" resultMap="order_user_map">
	SELECT
	  o.`id`,
	  o.`user_id`,
	  o.`number`,
	  o.`createtime`,
	  o.`note`,
	  u.`username`,
	  u.`address`,
	  u.`sex`
	FROM `order` o
	LEFT JOIN `user` u
	ON u.id = o.`user_id`
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试。

4.2 一对多关联

  1. 改造user的pojo

  2. 修改user的映射文件

<resultMap type="user" id="user_order_map">
	<id property="id" column="id" />
	<result property="username" column="username" />
	<result property="birthday" column="birthday" />
	<result property="address" column="address" />
	<result property="sex" column="sex" />
	<result property="uuid2" column="uuid2" />
	
	<!-- collection:配置一对多关系
		 property:用户下的order属性
		 ofType:property的数据类型,支持别名
	-->
	<collection property="orders" ofType="order">
		<!-- id标签用于绑定主键 -->
		<id property="id" column="oid"/>
		<!-- 使用result绑定普通字段 -->
		<result property="userId" column="id"/>
		<result property="number" column="number"/>
		<result property="createtime" column="createtime"/>
	</collection>

</resultMap>
<!-- 一对多关联查询 -->
<select id="getUserOrder" resultMap="user_order_map">
	SELECT
	u.`id`,
	u.`username`,
	u.`birthday`,
	u.`sex`,
	u.`address`,
	u.`uuid2`,
	o.`id` oid,
	o.`number`,
	o.`createtime`
	FROM `user` u
	LEFT JOIN `order` o
	ON o.`user_id` = u.`id`
</select>

其它步骤跟前面类似,添加接口方法与测试方法,完成测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值