作用:该标签自定义某个JavaBean的封装规则; 该标签有2个属性参数:
(1)、type:自定义规则的Java类型
(2)、id:唯一id方便引用
示例:
说明: id:定义主键,底层有优化; column:指定哪一列,指定判定的列名,数据库的字段值; property:指定对应的JavaBean属性;
使用示例:
查询接口如下:public Employee getEmpById(Integer id);对应的SQL的返回结果。
select * from tbl_employee where id=#{id}
使用场景:
// Employee中有部门属性
public class Employee {
String id;
String lastName;
String gender;
Department departmen;
...
}
场景一:查询Employee的同时查询出员工对应的部门信息?
public Employee getEmpAndDept(Integer id)
方式一:联合查询:级联属性封装结果集
方式二:使用association定义关联的单个对象的封装规则,association可以指定联合的JavaBean对象,该标签有2个属性,property,指定哪个属性是联合的对象; javaType:指定这个属性对象的类型[不能省略]
SQL语句:
SELECT
e.id as id,e.last_name as last_name, e.gender as gender,
e.d_id as d_id, d.id as did,d.dept_name as dept_name
FROM tbl_employee e,tbl_dept d
WHERE e.d_id=d.id AND e.id=#{id}
方式三:使用association进行分步查询:(☆☆☆☆)
第一步、先按照员工id查询员工信息;
第二步、根据查询员工信息中的d_id值去部门表查出部门信息;
第三步、部门设置到员工中;
// select:表明当前属性是调用select指定的方法查出的结果
// column:指定将哪一列的值传给这个方法
流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
select * from tbl_employee where id=#{id}
and 1=1
补充:鉴别器 discriminator
鉴别器的作用:mybatis
可以使用discriminator
来判断某列的值,然后根据某列的值改变来封装行为;
示例要求: 封装Employee:如果查出的是女生,就把部门信息查询出来,否则不查询; 如果是男生,把last_name这一列的值赋值给email
2、动态SQL
(1)、
标签和
标签的使用
标签作用:可以过滤掉条件语句中的第一个
and
或or
关键字。
查询员工,要求,携带了哪个字段查询条件就带上这个字段的值
public List getEmpsByConditionIf(Employee employee);
当 id 为 null 时,标签会去掉第一个多余的
and
select * from tbl_employee
id=#{id}
and last_name like #{lastName}
and email=#{email}
and gender=#{gender}
但是如果在写SQL时,把and写在后面时,标签就无能为力了,就像下面这样。
select * from tbl_employee
id=#{id} and
last_name like #{lastName} and
email=#{email} and
gender=#{gender}
(2)、
标签的使用
作用:去掉拼完之后的字符串前面或后面多出的and或者or,where标签不能解决
参数:只能作用于trim标签体中是整个字符串拼串后的结果。
prefix="":前缀:给拼串后的整个字符串加一个前缀 ; prefixOverrides="": 前缀覆盖: 去掉整个字符串前面多余的字符; suffix="":后缀:给拼串后的整个字符串加一个后缀 ; suffixOverrides="": 后缀覆盖:去掉整个字符串后面多余的字符;
select * from tbl_employee
// 在拼接好的字符串前面加个 where,去掉最后一个and
id=#{id} and
last_name like #{lastName} and
email=#{email} and
gender=#{gender}
(3)、
标签的使用
如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个。
select * from tbl_employee
id=#{id}
last_name like #{lastName}
email = #{email}
gender = 0
(4)、
标签的使用
update tbl_employee
last_name=#{lastName},
email=#{email},
gender=#{gender}
where id=#{id}
(5)、
标签的使用
该标签有如下属性: collection:指定要遍历的集合,list类型的参数会特殊处理,封装在map中,map的key就叫list; item:将当前遍历出的元素赋值给指定的变量; separator:每个元素之间的分隔符; open:遍历出所有结果拼接一个开始的字符; close:遍历出所有结果拼接一个结束的字符; index:索引。遍历list的时候是:index就是索引,item就是当前值;遍历map的时候index表示的就是map的key,item就是map的值
public List getEmpsByConditionForeach(List ids);
select * from tbl_employee where id in
#{item_id}
使用标签批量保存:
public void addEmps(@Param(“emps”)List emps);
由于MySQL下批量保存:可以foreach遍历;mysql支持values(),(),()语法 方式一:
insert into tbl_employee(
)
values
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
方式二:这种方式需要数据库连接属性allowMultiQueries=true; 这种分号分隔多个sql可以用于其他的批量操作(删除,修改)
insert into tbl_employee(last_name,email,gender,d_id)
values(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
(6)、
标签的使用
抽取可重用的sql片段,方便后面引用 1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用 2、include来引用已经抽取的sql: 3、include还可以自定义一些property,sql标签内部就能使用自定义的属性 include-property:取值的正确方式${prop}, #{不能使用这种方式}
employee_id,last_name,email
last_name,email,gender,d_id
3、两个内置参数
说明:在sql中获取参数时,不只是方法传递过来的参数可以被用来判断,取值。mybatis中默认还有两个内置参数: 1)、_parameter:代表整个参数
单个参数:_parameter就是这个参数(对象就代表传过来的对象)
多个参数:参数会被封装为一个map;_parameter就是代表这个map
2)、_databaseId:如果配置了databaseIdProvider标签,databaseId就是代表当前数据库的别名mysql。