Mybatis 详解-----第二篇:多表联查及动态Sql(超详细)

一、字段名与实体类属性名不相同

上图中实体类中的属性名和数据库中字段名不一致, 这样定义的话会导致后面写的spl语句中#{parameter}赋给参数取不到,sql语句执行的结果就为null或者会报错.

那么解决这个问题的方案有两个:

1. 通过在 sql 语句中定义别名

这种方法是最笨的方法,试想如果数据库表中有很多个字段,那么这种方法就会很笨拙并且容易出错,下面要添加其他查询的话还要写很多冗余的代码,所以这种方法不建议使用!

2. 使用<resultMap>标签来完成属性和列的映射关系。

标签中关键字的解释和作用:

         id:唯一标识.名字自定义
         type: 类型 ; 操作的表与对应实体类的映射
           <id 主键的映射关系 column="列名"  property="属性名"/>   (这个id必须写)
           <result 普通字段/>    (如果表中字段名和实体类中的属性名相同可不写)

         autoMapping=true 表示自动映射。默认true

        注意:

                如果字段名和实体属性名相同  那么在查询语句中要添加<result Type>标签来接收查询的                 返回值,  但是如果字段名和实体属性名不相同,定义了<resultMap>就不能再加入                      <resultType>了!

二、多表联查

1.多对一查询------链表查询

        一般多为inner join...on...

这种查询我们用员工和部门之间的关系来说

可以看到一个员工对应一个部门

首先需要生成每张表对应的实体类和DAO接口以及映射文件

不要忘记再Mybatis.xml文件中引入相关的映射文件

接下来我们根据员工id查找对应部门

在EmpMapper文件下添加<resultMap> 文件

<resultMap>中生成<association>标签

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.yanci.dao.EmpDao">
<!--    链表查询-->
    <resultMap id="emp01" type="com.yanci.entity.Emp">
        <id property="id" column="emp_id"></id>
        <result property="name" column="emp_name"></result>
        <result property="age" column="emp_age"></result>
        <result property="pid" column="part_id"></result>
        <association property="part" javaType="com.yanci.entity.Part" autoMapping="true">
            <id property="id" column="part_id"></id>
            <result property="name" column="part_name"></result>
        </association>
    </resultMap>
    <select id="selByCondition" resultMap="emp01">
        select * from emp e inner join part p on e.part_id=p.part_id where emp_id=#{id}
    </select>
</mapper>

  标签中关键字的解释和作用:

            association:表示多对一
            property:表示对象属性名
            javaType:表示该对象所属的类型
            autoMapping必须写

DAO和实体类


   

建立测试类测试

 2.多对一查询------嵌套查询

 

 我们把通过查询获得的part_id传给PartMapper

通过在<association>标签中添加select关键字建立EmpMapper和PartMapper之间的联系

建立测试类测试

由结果看到两条sql语句都执行了!

三、动态sql

        sql语句根据条件而发生改变。

元素作用描述
if条件判断单条件判断
choose(when  otherwise)条件选择多条件分支判断
where、set辅助sql拼接
foreach循环循环

 

我们还对之前的student表进行操作

1.if 和where

        如果传入了姓名 则按照姓名进行查询 如果没有传入姓名 则查询所有
          where:可以帮你添加where关键 并且把第一个and | or去除

        通过姓名和性别查询

 

2.choose +where
   when:当条件满足时会执行下面的when和other  都不满足则执行otherwise

        通过姓名或者性别查询

<select id="selByNameOrSex" resultMap="student1">
        select * from student
        <where>
            <choose>
                <when test="name != null and name != ''">
                    and  s_name=#{name}
                </when>
                <when test="sex != null and sex != ''">
                    and s_sex=#{sex}
                </when>

            </choose>
        </where>
    </select>

 3.set标签:修改部分字段。

        修改部分列的值。
              set 可以帮你添加set关键字 并且去除最后的逗号。

 4. foreach 批量操作

        此处我们进行批量查询

  标签中关键字的解释和作用:       

         foreach:
         collection:要遍历的集合和数组名
         item: 每次遍历时赋值的元素变量名
         open: 以什么开始
         close:以什么结束
         separator: 分隔符 

 

建立测试类

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值