if标签中的test属性是必须的,if标签中test属性的值是true或者false
如果值是true,那么if标签中的sql语句就会拼接,反之则不会拼接
test的值的取值:
要给where加上一个恒等的条件,然后在拼接的每个sql语句当中加上and
sql语句当中是对应的字段名=#{}
List selectByMultiCondition(@Param("id") Long id, @Param("brand") String brand, @Param("guidePrice") Double guidePrice);
}
where标签的作用:
trim标签的属性:
所有语句都为空就不加where
// prefix或suffix是在所有语句前面添加前缀或后缀
// 把trim标签语句内的and去掉
id=#{id} and
brand=#{brand} and
guide_price=#{guidePrice}
当所有条件都为空的时候,不会添加set,会自动去除多余的“,”
update t_car
car_num=#{carNum},
brand=#{brand},
guide_price=#{guidePrice},
produce_time = #{produceTime},
car_type = #{carType},
where
id = #{id}
这三个标签是在一起使用的,相当于if else if else if else
只有一个分支会被选择
forEach底层是map存储的数组,collection的值可以是注解的值或者array,arg0
int deleteByIds(@Param("ids") Long[] ids);
delete from t_car
where id in (
#{id}
)
// #{}中的内容是pojo类的属性名
insert into t_car
values
(null,#{car.carNum},#{car.brand},#{car.guidePrice},#{car.produceTime},#{car.carType})
sql标签用来声明sql片段
include标签将声明的sql片段包含到某个sql语句当中
作用:提高代码的复用性,易于维护
id,
car_num as carNum,
brand,
guide_price as guidePrice,
produce_time as produceTime,
car_type as carType
多对一:多个主对象对应一个副对象
在设计的时候主对象应包含副对象的类
主对象对应的表是主表,副对象对应的是副表
多对一映射到JVM当中映射的是主对象
public class Student {//主对象
private Integer sId;
private String sName;
private Clazz clazz;//副对象
使用association标签进行映射
优点:可复用,可以进行延迟加载
// Student映射文件对应的配置 主对象
// Clazz映射文件对应的配置 副对象
延迟加载的核心原理:用的时候再执行查询语句,不用的时候不查询
作用:提高性能
在mybatis当中开启延迟加载,默认情况下是关闭的
这种在association设置fetchType只是局部的设置,只对当前关联的sql语句生效
如果要配置全局设置,要在核心配置文件当中设置
一对多:一个主对象对应多个副对象
主对象的类中有副对象类的集合
// collection中的property是clazz封装的List的属性名
// select是select的id
// column是要传入的值
// fetchType是否开启延迟加载
// Clazz的映射文件的配置 主对象
// Student的映射文件的配置 副对象
内存:临时存储数据的空间,断电后消失
硬盘:持久化数据存储在硬盘当中,文件也是存储在硬盘上的,实际上各大关系型数据库的数据都是存储在文件当中
Mybatis的缓存机制
执行select语句的时候,将查询结果放到缓存当中,如果下一次还是执行完全相同的sql语句,直接从缓存中拿数据,不再查数据,不再去硬盘上拿数据
目的:提高执行效率
缓存机制:减少IO的方式来提高效率
IO:读写文件
缓存通常是我们程序开发中优化程序的重要手段
Myabtis的缓存包括
一级缓存默认是开启的,不需要配置,将查询到的数据存储到SqlSession中
当SqlSession不是同一个的时候,不走缓存
一级缓存失效
当第一个DQL语句和第二个DQL语句之间做了两件事中的任意一件都会导致一级缓存失效
使用二级缓存需要配置条件,默认情况下二级缓存是开启的
二级缓存的失效
只要二级缓存之间存在INSERT或DELETE或UPDATE语句,不管操作哪个表,二级缓存都会失效
根据数据库逆向生成Java的pojo类,SqlMapper文件以及Mapper接口
QBC风格:Query By Criteria 一种查询方式,比较面向对象,看不到sql语句
mybatis的逆向工程的增强版中可以封装查询条件
通过XxxExample对象来封装对象
CarExample carExample = new CarExample();
//调用createCriteria方法来创建查询条件
carExample.createCriteria().andXxxXXX();
//两个查询条件是or的关系
carExample.or().and
页码:pageNum
每页显示的记录条数:pageSize
select *
from t_stu
limit startIndex,pageSize
mysql当中起始行的下标从0开始
在DQL语句之前使用pageHelper完成分页