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

   日期:2020-11-06     浏览:88    评论:0    
核心提示:动态sql与多表连接的案例动态sqlMyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。动态 SQL 元素和使用 JSTL 或其他相似的基于 XM

动态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) 赋值的使用 存在就会有where set
  • foreach 自动拼接( , )

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>
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服