mybatis 进阶 动态sql与多表连接的案例

动态sql与多表连接的案例

动态sql

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。

动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。在 MyBatis 之 前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半 的元素就能工作了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

  • if 判断标签 是否需要
  • choose (when, otherwise) 与switch相同
  • trim (where, set) trim修建,where set 相当于已创建的trim方法。
    • where 去除前面的 and
    • set去除后面的 ,
  • foreach 自动拼接 开始open="( " 分隔 separator=" , " close=")"
if的使用实现表的多重查询
接口方法:List<Emp> selectEmp(Emp emp);
<select id="selectEmp" resultType="Emp" parameterType="Emp">
    select * from emp
    where 1=1
    <if test="empno != null">
        and empno = #{empno}
    </if>
    <if test="deptno != null">
        and deptno = #{deptno}
    </if>
</select>
choose (when, otherwise)
接口方法:List<Emp> selectEmpByChoose(Emp emp); 
<select id="selectEmpByChoose" resultType="ppl.com.pojo.Emp">
        select * from emp where 1=1
        <choose>
            <when test="empno != null">
                and empno = #{empno}
            </when>
            <when test="deptno != null">
                and deptno = #{deptno}
            </when>
        </choose>
    </select>
trim (where, set)
接口方法:List<Emp> selectEmpByTrim(Emp emp); 
<select id="selectEmpByTrim" resultType="ppl.com.pojo.Emp">
        select * from emp
        <where>
            <if test="empno != null">
                and empno = #{empno}
            </if>
            <if test="deptno != null">
                and deptno = #{deptno}
            </if>
        </where>
</select>
foreach 自动拼接( , )

item表示集合中每一个元素进行迭代时的别名,

index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,

open表示该语句以什么开始, separator表示在每次进行迭代之间以什么符号作为分隔 符,

close表示以什么结束。

接口方法:  List<Emp> listEmp(Integer... deptnos);
<select id="listEmp"  parameterType="java.util.ArrayList"  resultType="emp">
    select * from emp where
    deptno in
    <foreach collection="array" index="index" item="item"
             open="(" separator="," close=")">
      #{item}
    </foreach>
</select>

mybatis 多表连接

ResultMap:返回结果映射。自定义映射。可以类属性与数据库列名不一致,但需要在映射中提现。

ResultType:返回结果集,结果类型,使用的是默认映射,需要名称相同。等于的是类或者基本属性。

collection:一对多,配置连接的从表,需要的数据。

association:多对一。协议,配置连接属性,需要连接的数据。

一对多 多对一
一对多

实现一对多的步骤:

  1. 在主表中添加从表的List集合
  2. 在主表的Mapper中配置ResultMap多表查询的返回值
  3. 使用查询语句查询返回ResultMap

第一步:

public List<Emp> getEmps() {
    return emps;
}
public void setEmps(List<Emp> emps) {
    this.emps = emps;
}

第二步:

<!--一对多-->
<resultMap id="DeptEmp" type="Dept">
    <id column="deptno" property="deptno"/>
    <result column="dname" property="dname"/>
    <result column="loc" property="loc"/>
    <!--实现次表的存储-->
    <collection property="emps" ofType="Emp" column="deptno"  select="ppl.com.mapper.MapperEmp.SelectEmpByDeptno"></collection>
</resultMap>

第三步:

<select id="findAll" resultMap="DeptEmp">
    select * from dept
</select>

在这里插入图片描述

多对一,一对一:两者了解一个就可以,建议一对多

  1. 在主表中添加从表的对象
  2. 在主表的Mapper中配置ResultMap多表查询的返回值
  3. 使用查询语句查询返回ResultMap

第一步:

private Dept dept;
public Dept getDept() {
    return dept;
}
public void setDept(Dept dept) {
    this.dept = dept;
}

第二步:

<resultMap id="EmpDept" type="emp">
    <id column="empno" property="empno"/>
    <result column="ename" property="ename"/>
    <result column="job" property="job"/>
    <result column="mgr" property="mgr"/>
    <result column="hireDate" property="hireDate"/>
    <result column="sal" property="sal"/>
    <result column="comm" property="comm"/>
    <result column="deptno" property="deptno"/>
    <association property="dept" column="deptno" javaType="dept" select="ppl.com.mapper.MapperDept.findByDeptNo" fetchType="eager"/>
</resultMap>

第三步:

<select id="allEmp" resultMap="EmpDept">
    select * from emp
</select>
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值