SELECT
id,
dept_name,
dept_loc
FROM
t_dept
WHERe
id = #{id}
update t_dept
set dept_name = #{deptName},
dept_loc = #{deptLoc}
where id = #{id}
delete from t_dept where id = #{id}
insert into t_dept (dept_name,dept_loc)
values (#{deptName},#{deptLoc})
public Dept selectDeptBynamed(@param(“deptId”) int deptId,@param(“dName”),String deptName)
源码 ParamNameResoler 130行代码
final Map param = new ParamMap<>(); int i = 0; for (Map.Entry entry : names.entrySet()) { param.put(entry.getValue(), args[entry.getKey()]); // add generic param names (param1, param2, …) final String genericParamName = GENERIC_NAME_PREFIX + (i + 1); // ensure not to overwrite parameter named with @Param if (!names.containsValue(genericParamName)) { param.put(genericParamName, args[entry.getKey()]); } i++; } return param;
select *tableA a inner join tableB b on a.id = b.id
外连接
左外连接 以左边的数据为主 (全部) 右边的数据为辅 (有的数据显示)
select tableA a left join tableB b on a.id = b.id
自动映射与自定义映射概述
自动映射 resultType
概述:指的是可以将表中的字段和类中的属性 建立映射关系
注意:
要求字段名与属性名称一致
字段名与属性不一致时 需要定义别名或开启驼峰命名映射
不足:无法解决多表连接查询的结果集映射问题
自定义映射 resultMap
概述:指的是自定义表中字段与类中的属性 建立映射关系
自定义详解
级联映射
级联映射
自定义映射association
-
-
-
-
-
分布查询
概述:将多表一步连接查询 拆分单表分布查询
优势:提升性能
public Employee selectEmpAndDeptByEmpIdAssociationStep(int empId);
ResultMap标签详解
属性
id属性:定义resultMap唯一标识
result属性:定义resultMap的类型 与方法返回值类型一致
子标签
id 子标签:定义表中字段与类中的属性映射关系 主键
property 设置属性名称
column 设置字段名称
result子标签 :定义表中字段与类中属性映射关系 非主键
proeprty 设置属性名称
column 设置字段名称
association 子标签
property 设置属性名称
javaType:设置对应的pojo类型
select :设置分分步查寻 【接口全类名.方法名】
column:设置分步查询参数【字段名称】
association 分步查询使用延迟加载
延迟加载配置
开启延迟加载
设置加载的数据是否按需加载
在association标签中也可以设置延迟加载,将覆盖全局配置
collection 一对多
1)POJO中的属性可能会是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象,使用collection标签定义对象的封装规则
public class Department {
private Integer id;
private String name;
private List emps;
collection多表查询方式同association类似
collection分步查询
① 先通过部门的id查询部门信息
② 再通过部门id作为员工的外键查询对应的员工信息.。
③ 将所有员工设置到部门中
首先在员工EmployeeMapper中先写好getEmployeesByDeptId()
select id,last_name,email,salary,dept_id
from employees
where dept_id = #{deptId}
配置DeptMapper
select id,name
from departments
where id = #{id}
第四章 Mybatis的动态SQL
1.简介
MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作
if
choose (when, otherwise)
trim (where, set)
foreach
OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的
表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等