动态SQL
什么是动态SQL
mybatis提供的解决方案
逻辑标签:if foreach choose when otherwise
格式化标签:where set
if元素的使用:where和set的使用(重点)
if用于判断。有一个属性test,注意:test的取值是一个OGNL表达式(对象导航图语言,像使用EL表示一样来使用,它比EL表达式强大很多倍)。如果test的取值为true,则if标签主体内容执行。如果为false,标签主体内容不执行。
if标签用于查询条件
step0、拷贝User这个类
step1、建立dao接口
step2、编写映射文件
step3、测试即可和观察效果
配合where格式化sql语句
if标签用于更新
step1、dao接口
step2、映射文件
step3、测试及效果
配合set格式化sql语句
foreach元素的使用(重点)
foreach作用:循环遍历输出主体内容
遍历的对象:数组、List或Set、Map
mybatis对于不同类型的参数有着默认的固定引用名称:
数组用array
List用list或collection
Set用collection
Map用_parameter
另外可以在接口中使用@Param指定引用名称
step1、dao接口
step2、映射文件
step3、测试
choose when otherwise的使用(了解)
step1、dao接口
step2、映射文件
step3、测试
多表查询:连接查询
多表的设计(很重要)
一对多的设计
多对多的设计
连接查询的语句(复习)
use ee121;
truncate table t_user;
insert into t_user values(1,'user1','male');
insert into t_user values(2,'user2','female');
insert into t_user values(3,'user3','male');
create table t_account(
aid int primary key auto_increment,
number varchar(100),
balance float(10,2),
uid int,
constraint uid_fk1 foreign key(uid) references t_user(uid)
);
insert into t_account values(1,'6666',10000,1);
insert into t_account values(2,'7777',20000,1);
insert into t_account values(3,'8888',10000,2);
create table t_role(
rid int primary key auto_increment,
name varchar(100),
description varchar(255)
);
insert into t_role values(1,'出库员','out');
insert into t_role values(2,'入库员','in');
create table t_user_role(
uid int,
rid int,
primary key(uid,rid),
constraint uid_fk2 foreign key(uid) references t_user(uid),
constraint rid_fk1 foreign key(rid) references t_role(rid)
);
insert into t_user_role values(1,1);
insert into t_user_role values(1,2);
insert into t_user_role values(2,1);
insert into t_user_role values(3,2);
交叉连接(Cross Join):返回笛卡尔积
内连接(Inner Join):返回满足条件的记录
显式内连接:使用INNER JOIN关键字,用ON指定连接条件
隐式内连接:不使用INNER JOIN关键字,使用where指定条件即可
外连接(Outer Join):返回满足连接条件的记录,还返回左或右中剩余的其他记录
左外连接:(Left Outer Join)返回满足连接条件的记录,还返回左表剩余的其他记录
右外连接:(right Outer Join)返回满足连接条件的记录,还返回右表剩余的其他记录
根据多查少(重点)
查询账户时同时查询对应的用户
step0、建立实体类及关联关系
step1、编写dao接口
step2、映射文件(重点、难点)
方式一:采用别名进行自动映射
方式二:采用手动映射
方式三:采用专用标签映射关联的对象
step3、测试
根据少查多(重点)
查询用户时同时查询账户的信息
step1、建立User和Account的关联关系
step2、dao接口
step3、映射文件
step4、测试
多对多查询(重点)
查询所有用户,同时查询对应的角色信息。(映射:和一对多差不多,但是SQL语句是不同的)
step1、建立用户和角色的关联关系
step2、userdao接口
step3、映射文件
step4、测试
多表查询:嵌套查询
什么叫嵌套查询
嵌套查询又称为子查询,分步查询。
根据多查少(重点)
查询所有账户同时查询对应的用户信息
step1、确定账户和用户存在关联关系
step2、账户的Dao
step3、账户的映射文件
step4、用户的dao
step5、用户的映射文件
step6、测试
根据少查多(重点)
查询所有用户同时查询对应的账户信息
step1、确认用户和账户存在关联关系
step2、UserDao
step3、UserDao.xml
step4、AccountDao
step5、AccountDao.xml
step6、测试
多对多查询(重点)
查询所有的角色同时查询对应的用户信息(映射相同,SQL语句不同)
step1、确定角色和用户的关联关系
step2、RoleDao
step3、RoleDao.xml
step4、UserDao
step5、UserDao.xml
step6、测试
嵌套查询加载策略
什么叫加载策略
查询用户的时候,关联的账户信息要不要查询出来呢?
一并查询出来了,就是立即加载;用账户信息的时候才查,延迟加载。看需求。
立即加载:(饿汉子式)
延迟加载:(懒汉子式)
加载策略的配置与演示
step1、全局参数配置
step2、测试一下
注意:
step3、映射文件中配置加载策略
mybatis的缓存:(理解)
缓存的作用
CPU----------内存-----瓶颈-----磁盘(数据库)
对于不怎么经常发生变化的数据,最好使用缓存。目的提高查询效率。
演示一级缓存
SqlSession是一级缓存。一般一个线程对应一个SqlSession。此缓存中的内容我们无法更改的。
如果执行了手动刷新、增删改操作,会自动清空一级缓存。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ozf02uYG-1591237217628)(随堂笔记.assets/1575796229863.png)]
演示二级缓存:应用级别
映射文件级别的缓存,二级缓存的生命周期和Sql’Sessionfactory一致的。
step1、全局开关
step2、需要在映射文件中开启
注意:mybatis采用序列化(实体类要实现Serializable接口)实例的方式,将对象的数据保存到二级缓存中。
step3、验证二级缓存
基于注解的mybaits的配置
@Select
@Insert
@Update
@Delete
@Results
@Result
@Many
演示二级缓存:应用级别
映射文件级别的缓存,二级缓存的生命周期和Sql’Sessionfactory一致的。
step1、全局开关
[外链图片转存中…(img-PPQ4JnWN-1591237217630)]
step2、需要在映射文件中开启
[外链图片转存中…(img-A4QgLaAi-1591237217631)]
注意:mybatis采用序列化(实体类要实现Serializable接口)实例的方式,将对象的数据保存到二级缓存中。
step3、验证二级缓存
[外链图片转存中…(img-D5ffUYKT-1591237217632)]
[外链图片转存中…(img-YlVYIY3O-1591237217632)]
基于注解的mybaits的配置
@Select
@Insert
@Update
@Delete
@Results
@Result
@Many
@One