Mybatis关系查询和动态Sql查询

本文主要介绍了MyBatis的关系查询和动态SQL。关系查询包括一对一和一对多映射,分别说明了xml文件配置及注意事项。动态SQL方面,讲解了if条件判断,指出其不足并介绍用where标签修改;还介绍了trim条件语句,说明了其prefix和prefixOverrides属性的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis关系查询

一对一查询:两个表之间的关系是一对一的关系,一个表中的属性只对应另一个表中的一个属性。(如:人与身份证)

xml文件:

    <resultMap id="cardUser" type="User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
<!--        一对多映射关系   javaType指的是Java所在的类-->
<!--    property="card" : 指的是用户表中的引用类型  javaType="Card"  :指的是引用类型所在的类(写路径)-->
        <association property="card" javaType="Card">
            <result property="cardId" column="card_id"></result>
            <result property="cardName" column="card_name"></result>
            <result property="cardPassword" column="card_password"></result>
        </association>
    </resultMap>
    
    <!--    一对一关系查询  -->
    <select id="selectCardUser" resultMap="cardUser">
        select * from user,card where user.card_id=card.card_id and user.id=#{id}
    </select>

        注意:

                1、association 标签用于映射一对一关系,一对多,多对多关系并补适用

                2、property="card" : 指的是用户表中的引用类型 javaType="Card" :指的是引用类型所在的类(写路径)

                3、这种对应关系需要使用到resultMap指定返回的类型,否则会无法进行映射

一对多映射关系 :一张表中的数据可以对应另外一张表的多个数据(一对多实际上是多对多的一种特殊的表现形式)

xml文件:

    <resultMap id="bankUser" type="User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
<!--        一对多映射关系   -->
<!--       collection:标签定义一对多关系进行映射   property="bank" :指在实体类中引用名称   ofType="Bank" :引用类型所在的类(路径)  -->
        <collection property="bank" ofType="Bank">
            <result property="bankId" column="bank_id"></result>
            <result property="bankName" column="bank_name"></result>
            <result property="bankPassword" column="bank_password"></result>
            <result property="userId" column="user_id"></result>
        </collection>
    </resultMap>
    
    <!--    一对多的关系查询  -->
    <select id="selectBankUser" resultMap="bankUser">
        select * from user,bank where bank.user_id = user.id and user.id=#{id}
    </select>

注意:

1、在使用一对多关系查询时,在实体类中需要用集合进行返回(如:List),因为可能返回多个结果,使用集合接收

2、collection:标签定义一对多关系进行映射 property="bank" :指在实体类中引用名称 ofType="Bank" :引用类型所在的类(路径)

mybatis动态sql

if条件判断:标签中使用test属性进行条件的判断,满足就执行,不满住进行忽略

        xml文件:

<!--    条件查询-->
    <select id="selectTest01" resultType="User">
        select * from user
        <if test="username !=null and username != ''">
            where username=#{username}
        </if>
        <if test="password != null and password != ''">
            and password = #{password}
        </if>
    </select>

测试代码

    @Test
    public void test10() throws IOException {
        SqlSession session = DBUtils.getSession();
        UserMapper mapper =session.getMapper(UserMapper.class);
        User u = new User();
        u.setUsername("admin");
        u.setPassword("123");
        List<User> user = mapper.selectTest01(u);
        System.out.println(user);
        session.close();
    }

可以发现执行程序成功,但是程序不严谨

当一个条件不成立呢?

发现问题:当一次个条件无法满足时,sql语句就会出现错误 

 这时可以使用where标签进行修改xml文件

 修改xml文件,其他代码你不变 :

<select id="selectTest01" resultType="User">
    select * from user
    <where>
        <if test="username !=null and username != ''">
            and username=#{username}
        </if>
        <if test="password != null and password != ''">
            and password = #{password}
        </if>
    </where>
</select>

 执行程序:

执行成功:因为where标签可以默认的提供where,不用自己书写,并且自己写的and不受影响,mybatis会自动帮我们进行覆盖。(注意:第一个SQL语句可以写and也可以不写and,但是后面的sql语句必须写and) 

trim条件语句

<!--    trim条件查询-->
<!--    <trim prefix="where" prefixOverrides="and">    prefix="where" : 添加前缀 ,prefixOverrides="and":前缀覆盖-->
    <select id="selectTest01" resultType="User">
        select * from user
       <trim prefix="where" prefixOverrides="and | or">
           <if test="username !=null and username != ''">
               username=#{username}
           </if>
           <if test="password != null and password != ''">
               and password = #{password}
           </if>
       </trim>
    </select>

trim prefix="where" prefixOverrides="and"> prefix="where" : 添加前缀 (相当于添加了一个where),prefixOverrides="and":前缀覆盖(sql前缀有and或者or的时候进行覆盖,但是不能添加,需要手写)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值