目录
返回类型
resultType
resultMap
1、字段映射
2、多表查询
动态SQL
if标签
where标签
set标签
choose(when,otherwise) 语句
trim标签
for-each标签
SQL片段
Mybatis在查询时,一定要指定返回类型;而其他操作,默认返回修改数目
在正常情况下,我们查询使用resultType返回查询结果是可以的

但是,也有其他情况是resultType不能解决的

如果说,类和数据库的参数不匹配,那么查询出来的结果在填充到类对象时,就会找不到对应的字段,(数据库的结果根据数据库列名和类字段名称进行匹配赋值)
数据库的列名是class_id,而类字段是 stu_class,mybatis不能将这两个联系起来,这时就需要使用resultMap
1、数据库列名和类字段名称不匹配,可以使用resultMap来配置映射关系
2、resultMap可以用来处理多表联查
namespace 绑定xml文件实现的接口 包名+类名 <-->
这时,我们来运行单元测试:

一个学生属于一个班级,一对一


1、创建Class类,Student类增加Class类的变量
@Data
public class Class {private Integer class_id;private String class_name;
}
@Data
public class Student {private Integer id;private String name;private Integer class_id;private Class stu_class;
}
namespace 绑定xml文件实现的接口 包名+类名 <-->

一个班级可以有多个学生 一对多
@Data
public class Student {private Integer id;private String name;private Integer class_id;
}
@Data
public class Class {private Integer class_id;private String class_name;private List list;
}
namespace 绑定xml文件实现的接口 包名+类名 <-->

如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。
那么怎么去解决这个问题呢?这就要使用 mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。
根据name和class_id来查询学生信息
namespace 绑定xml文件实现的接口 包名+类名 <-->

如果class_id为空,那么就是select * from student where name=#{name} and class_id=null;
如果name为空,那么就是select * from student where name= and class_id=#{class_id};这是错误的写法,我们这时就要用到if标签
namespace 绑定xml文件实现的接口 包名+类名 <-->
如果class_id为空,那么就是select * from student where name= #{name};
如果name为空,那么就是select * from student where and class_id=#{class_id};这是错误的写法,要使用到where标签

where标签就是为sql加上where关键字,且会自动的多余的and、or关键字,当所有的条件都不成立的时候,where标签也不会生成
去掉前面的and,不会去掉后面的and
namespace 绑定xml文件实现的接口 包名+类名 <-->

set元素会动态前置SET关键字,同时也会自动抹去where查询条件前多余的逗号,避免因为使用条件语句在生成赋值语句的后面留下不需要的逗号
namespace 绑定xml文件实现的接口 包名+类名 <-->update studentid=#{id} ,name=#{name}

有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句
namespace 绑定xml文件实现的接口 包名+类名 <-->



when相当于if,otherwise相当于else
也就是说,这里我们有三个条件,id,name,class_id,只能选择一个作为查询条件
如果 id 不为空,那么查询语句为:select * from student where id=?
如果 id 为空,那么看name 是否为空,如果不为空,那么语句为 select * from student where name=?;
如果 name 为空,那么查询语句为 select * from student where class_id=?
用于去掉某些内容
用 trim 改写上面的 if+where 语句

用 trim 改写上面的 set 语句
namespace 绑定xml文件实现的接口 包名+类名 <-->
update studentid=#{id}, name=#{name},

这样写的时候,就要多次 id=#{id},可以使用foreach标签实现循环
namespace 绑定xml文件实现的接口 包名+类名 <-->
delete from studentid=#{id}

如果某一SQL的使用频率很高,我们可以把他单独定义,提供代码复用率
1、定义SQL
select * from studentid=#{id}
2、引用SQL
