仅仅是整理的学习资料
【0】知识点罗列
1、输入映射和输出映射
a) 输入参数映射
b) 返回值映射
2、动态sql
a) If
b) Where
c) Foreach
d) Sql片段
3、关联查询
a) 一对一关联
b) 一对多关联
4、Mybatis整合spring
【1】 输入映射和输出映射
Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。
1.1 parameterType
1.输入映射(就是映射文件中可以传入哪些参数类型)
1) 基本类型
2) pojo类型
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
3) Vo类型(pojo包装类)
开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
Pojo类中包含pojo。需求:根据用户名查询用户信息,查询条件放到QueryVo的user属性中。
1.2 resultType
2.输出映射(返回的结果集可以有哪些类型)
1) 基本类型
2) pojo类型
3) List类型
【2】动态sql
动态sql:动态的拼接sql语句,因为sql中where条件有可能多也有可能少,通过mybatis提供的各种标签方法实现动态拼接sql。
1) where: 可以自动添加where关键字,还可以去掉第一个条件的and关键字
2) if: 判断传入的参数是否为空
3) foreach: 循环遍历传入的集合参数
4) sql: 封装查询条件,以达到重用的目的
2.1 if
注意要做不等于空字符串校验。
<!-- 传递pojo综合查询用户信息 -->
<select id="findUserList" parameterType="user" resultType="user">
select * from user
where 1=1
<if test="id!=null">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</select>
2.2 where
上边的sql也可以改为:
<select id="findUserList" parameterType="user" resultType="user">
select * from user
<!-- where标签作用:
会自动向sql语句中添加where关键字
会去掉第一个条件的and关键字 -->
<where>
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
<where />
可以自动去掉第一个and。
2.3 foreach
向sql传递数组或List,mybatis使用foreach解析
需求
传入多个id查询用户信息,用下边sql实现:
SELECT * FROM USERS WHERE id IN (10,89,16)
操作
在pojo中定义list属性ids存储多个用户id,并添加getter/setter方法
public class QueryVo {
private User user;
//自定义用户扩展类
private UserCustom userCustom;
//传递多个用户ids
private List<Integer> ids;
}
mapper.xml
<select id="findUserByIds" parameterType="cn.itheima.pojo.QueryVo" resultType="cn.itheima.pojo.User">
select * from user
select * from user
<where>
<if test="ids != null">
<!--
foreach:循环传入的集合参数
collection:传入的集合的变量名称
item:每次循环将循环出的数据放入这个变量中
open:循环开始拼接的字符串
close:循环结束拼接的字符串
separator:循环中拼接的分隔符
-->
<foreach collection="ids" item="id" open="id in (" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
2.4 sql
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下:
<!-- 传递pojo综合查询用户信息 -->
<select id="findUserList" parameterType="user" resultType="user">
select * from user
<where>
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
将where条件抽取出来:
<!-- 封装sql条件,封装后可以重用.
id:是这个sql条件的唯一标识 -->
<sql id="query_user_where">
<where>
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</sql>
使用include引用:
<select id="findUserList" parameterType="user" resultType="user">
select * from user
<include refid="query_user_where"/>
</select>
注意:如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:
【3】关联查询
3.1 商品订单数据模型
3.2 数据库关联关系与java映射关系
在数据库中关联关系叫做一对多,多对一,多对多
java实体中的映射关系是单个对象映射关系,集合对象映射关系
3.3 一对一查询
案例:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询(订单记录)。整体来讲订单与用户是多对一的关系。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
3.3.1 方式一:自动关联
自动关联(偷懒的办法):可以自定义一个大而全的pojo类,然后自动映射其实是根据数据库总的字段名称和
pojo