mybatis学习笔记(二)
传递pojo对象
- 新建包装pojo对象QueryVo
public class QueryVo {
//用户对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
- 映射文件与sql
<!-- 1、resultType:如果要返回数据集合,只需设定为每一个元素的数据类型
2、 包装的pojo取值通过 "."来获取
-->
<select id="getUserByQueryVo" parameterType="queryvo" resultType="com.mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name} -->
SELECT * FROM USER WHERE username LIKE '%${user.username}%'
</select>
- 新增接口方法
- 增加测试方法,完成测试
resultType(输出类型)
- 输出resultMap
当数据库中的字段名和实体类中的属性名不同时,使用resultMap进行配置
<!-- resultMap入门
type:映射成的pojo类型
id: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>
if标签的使用
当进行用户的多条件查询时,使用 if标签对sql语句进行拼接
注意在where之后加上1=1,或者其他恒等的条件
<!-- 演示动态sql-if标签的使用情景 -->
<select id="getUserByPojo" parameterType="user" resultType="com.mybatis.pojo.User">
select `id`,
`username`,
`birthday`,
`sex`,
`address`
from `user`
where 1=1
<if test="username != null and username != ''">
and username like '%${username}%'
</if>
<if test="sex != null and sex != ''">
and sex=#{sex}
</if>
</select>
where标签的使用
使用where标签将if标签包裹。where标签自动补全了where语句,不用再写恒等条件,并且可以处理多余的and连接
<select id="getUserByPojo" parameterType="user" resultType="com.mybatis.pojo.User">
select `id`,
`username`,
`birthday`,
`sex`,
`address`
from `user`
<where>
<if test="username != null and username != ''">
and username like '%${username}%'
</if>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
</where>
</select>
sql片段的抽取
<!-- 定义 sql片段抽取 -->
<sql id="user_sql">
`id`,
`username`,
`birthday`,
`sex`,
`address`
</sql>
<select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User">
select
<!-- sql片段使用,refid引用定义好的sql片段id -->
<include refid="user_sql"/>
from `user`
where id=#{id}
</select>
foreach标签
- foreach循环标签
collection:要遍历的集合,来源入参
open:循环开始前的sql
separator:分隔符
close:循环结束拼接的sql
<!-- 演示动态sql-foreach标签的使用情景 -->
<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>
一对一关联查询resultType的使用
- 新建OrderUser的pojo,继承自Order。
package com.mybatis.pojo;
import java.util.Date;
public class OrderUser extends Order{
private String username;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "OrderUser [username=" + username + ", address=" + address + ", getId()=" + getId() + ", getUserId()="
+ getUserId() + ", getNumber()=" + getNumber() + ", getCreatetime()=" + getCreatetime() + ", getNote()="
+ getNote() + "]";
}
}
- 修改order的映射文件,新增查询方法getOrderUser。
<!-- 一对一关联查询resultType的使用 -->
<select id="getOrderUser" resultType="orderuser">
SELECT o.`id`,
o.`user_id`,
o.`number`,
o.`createtime`,
o.`note`,
u.`username`,
u.`address`
FROM `order` o
left join `user` u on u.id=o.user_id;
</select>
- 添加接口,完成测试
一对一关联查询resultMap的使用
- 改造order的pojo
- 修改order的映射文件
<!-- 一对一关联查询-resultMap -->
<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>
添加接口方法与测试方法,完成测试。
一对多关联查询resultMap的使用
- 改造user的pojo
- 修改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>