public class Student {
private Integer sId;
private String sName;
// 通过对象表示一对一(对象不能自动映射)
private Teacher tId;
}
例题
查询每个学生的老师
关联查询
SELECT * FROM student s left join teacher t on s.t_id = t.t_id
分步查询
一对多
一个对象关联多个对象
数据层面:通过外键
public class Teacher {
private Integer tId;
private String tName;
// 通过集合表示一对多(集合不能自动映射)
List stus;
}
例题
查询老师的所有学生
关联查询
SELECT * FROM teacher t LEFT JOIN student s ON t.t_id = s.t_id
分步查询
多对多SELECT * FROM teacher; SELECT * FROM student WHERe t_id = #{t_id}
数据库层面:必须引入中间表(用于记录表之间的关系)
实体类层面:本质是一对多
@Data
public class Student {
private int sid;
private String sname;
//多对多--最终处理时转为1对多
List allCou;
}
关联查询
SELECT * FROM student s LEFT JOIN stu_cou sc ON s.s_id = sc.s_id LEFT JOIN course c ON sc.c_id = c.c_id
分布查询
延时加载(按需加载) 作用SELECT * FROM student; SELECT * FROM stu_cou sc JOIN course c ON sc.c_id = c.c_id AND sc.s_id = #{s_id}
-
提升数据查询效率
-
减少计算机压力
-
使用关联查询,不使用分步查询
-
开启延迟加载(按需加载)
全局开启
局部开启
局部配置会覆盖全局配置
缓存
加快运行速度
查询时,第一次将查询出的数据在缓存中放一份。以后遇到同样的操作,直接从缓存读取
开启缓存一级缓存
sqlSession级别缓存:在同一个sqlSession中做同样的数据查询,第二次查询会走缓存
开启方式:默认打开的
SqlSession sqlSession = SqlSessionUtil.getSqlSession(); StudentMapper mapper1 = sqlSession.getMapper(StudentMapper.class); Liststudents1 = mapper1.getStudentAndCouese(); // 走缓存 StudentMapper mapper2 = sqlSession.getMapper(StudentMapper.class); List students2 = mapper2.getStudentAndCouese(); sqlSession.close();
二级缓存
mapper级别缓存 :同个mapper同个接口,第二次调用相同接口时走缓存
开启方式
全局配置文件中打开缓存开关
开启缓存接口对应mapper中声明一个cache标签
二级缓存底层实现基于对象序列化与反序列化实现
public class Student implements Serializable参数传递 @Param
-
接口(删除指定用户)
// @Param:对参数取别名 Integer deleteUser(@Param("id")Integer id); -
接口对应的xml配置
DELETE FROM user WHERe uid = #{id}
-
XML中声明参数类型 —— map
SELECT * FROM student where s_name = #{name}; -
Dao层内传递Map类型值
Products getProByMap(Map map);
-
test层使用Map值传递参数
SqlSession sqlSession = SqlSessionUtil.getSqlSession(); TestDao Test = sqlSession.getMapper(TestDao.class); // 创建HashMap Map map = new HashMap(); // 写入键值对 map.put("name","a"); // 传递map作为参数 Listcouese = Test.getStuToName(map); for (Student student : couese) { System.out.println(student); } sqlSession.close();
-
sql片段,记录一段公共sql片段,用include标签引入
-
声明sql片段:
标签
eid,emp_name,age,sex,email
-
引用sql片段:
标签
模糊查询select from user
模糊查询的模糊条件通过参数形式传递
SELECT * FROM products WHERe name LIKE "%"#{name}"%";
使用时在service层根据不同的业务场景生成不同的模糊条件
List分页查询 方式一proByLike = mapper.getProByLike("name");
limit关键字分页
SELECT * FROM 表名 LIMIT 从哪查,查几条
前段传参数:pagenum:页数、pagesize:条数
转换:SELECt * FROM 表名 LIMIT (pagenum-1)*pagesize,pagesize
注意:service层完成转换工作
dao层接口:
//分页查询 ListgetProPage(@Param("startIndex")int startIndex,@Param("pageSize")int pageSize);
xml文件:
SELECT * FROM student LIMIT #{startIndex},#{pageSize};
service层做转换
int pageNum = 2; int pageSize = 2; SqlSession sqlSession = SqlSessionUtil.getSqlSession(); TestDao Test = sqlSession.getMapper(TestDao.class); List方式二page = Test.getPage((pageNum - 1) * pageSize, pageSize); for (Student student : page) { System.out.println(student); } sqlSession.close();
PageHelper
-
导入依赖:pageHelper核心包、jsql转换包
-
在全局配置中配置插件
-
使用PageHelper
// (0++) int pageNum = 0; int pageSize = 2; // 配置分页插件 PageHelper.startPage(pageNum, pageSize); // 调用DAO层查询数据(所有信息) SqlSession sqlSession = SqlSessionUtil.getSqlSession(); TestDao mapper = sqlSession.getMapper(TestDao.class); // 将Dao数据放入PageHelper进行分页 PageInfo动态SQLpageInfo = new PageInfo<>(mapper.getPage()); // 获取分页后数据 List list = pageInfo.getList(); for (Student student : list) { System.out.println(student); } // 获取总页数 System.out.println(pageInfo.getPages()); sqlSession.close();
if根据不同的条件拼接不同的SQL语句
test(条件语句)值为真,拼接SQL,否则不进行拼接
whereSELECT * FROM student where 1=1 and s_name = #{stu.sName}
常与
setSELECT * FROM student and s_name = #{stu.sName} or s_age = #{stu.sAge}
常与
trimupdate student where s_id = 1 s_name = #{stu.sName}, s_age = #{stu.sAge},
choose、when、otherwiseSELECT * FROM products OR name = #{name} OR location = #{location}
-
相当于if..else
-
when至少有一个,otherwise至多有一个
-
when只执行一个
foreachselect * from student s_name = #{stu.sName} s_age = #{stu.sAge} s_id = 1
-
属性:
-
collection:循环的数组或集合
-
item:遍历元素(i)
-
separator:分隔符
-
open:foreach标签开始符
-
close:foreach标签结束符
-
-
批量删除
delete from student where s_id in #{i} SqlSession sqlSession = SqlSessionUtil.getSqlSession(); TestDao mapper = sqlSession.getMapper(TestDao.class); int result = mapper.selStu(new Integer[]{10, 11, 12, 9}); System.out.println(result); sqlSession.commit(); sqlSession.close(); -
批量添加
insert into student values (default ,#{i.sName},#{i.sAge},#{i.sGrade})
SqlSession sqlSession = SqlSessionUtil.getSqlSession(); TestDao mapper = sqlSession.getMapper(TestDao.class); Student stu1 = new Student(null,"a",18,12.2); Student stu2 = new Student(null,"b",28,35.0); Student stu3 = new Student(null,"c",38,22.5); Integer integer = mapper.selStu(Arrays.asList(stu1, stu2, stu3)); System.out.println(integer); sqlSession.commit(); sqlSession.close();



