动态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:多对一。协议,配置连接属性,需要连接的数据。
一对多 多对一
一对多
实现一对多的步骤:
- 在主表中添加从表的List集合
- 在主表的Mapper中配置ResultMap多表查询的返回值
- 使用查询语句查询返回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>
多对一,一对一:两者了解一个就可以,建议一对多
- 在主表中添加从表的对象
- 在主表的Mapper中配置ResultMap多表查询的返回值
- 使用查询语句查询返回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>