mybatis基础学习笔记(二)

这篇博客详细介绍了Mybatis的基础知识,包括输入映射(parameterType与resultType)、动态SQL(if、where、foreach、sql片段)以及关联查询(一对一、一对多和多表联合查询)。同时,博主还探讨了Mybatis如何整合Spring,从整合思路到具体步骤,以及不同方式的DAO开发。此外,文章总结了输入输出映射、动态SQL的用途和对象映射关系的两种方式。
摘要由CSDN通过智能技术生成

仅仅是整理的学习资料

【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值