这里演示的是多对一
多:学生
一:班级
多个学生一个班级,通过查询学生后再查询班级
所谓的N+1次查询呢,实际上就是mybatis帮我们做了业务装配来看下下面的图
执行一次学生的查询,有几个学生执行几次班级的查询
实际上就是在上一篇文章的StudentMapper.xml里面使用了resultMap来实现n+1查询
<mapper namespace="com.lin.mapper.StudentMapper"> <resultMap id="smap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="gender" column="gender"/> <result property="cid" column="cid"/> <!-- association 用于关联一个对象 --> <association property="clazz" select="com.lin.mapper.ClazzMapper.selById" column="cid"/> </resultMap> <select id="selAll" resultMap="smap"> select * from t_student; </select> </mapper>
在resultMap标签里,我们使用了一个association的标签,这个标签就帮助了我们完成业务装配,
property表示关联的实体属性名
select 表示继续引用查询的命名空间+id
column表示查询时需要传递的列(值)。
注意:
当属性名与字段名相同时可以省略 √。但是要注意只能使用一次,如果要在结果集中显示该数值需要显示的绑定。所以可以简写为
<mapper namespace="com.lin.mapper.StudentMapper"> <resultMap id="smap" type="Student"> <result property="cid" column="cid"/> <!-- association 用于关联一个对象 --> <association property="clazz" select="com.lin.mapper.ClazzMapper.selById" column="cid"/> </resultMap> <select id="selAll" resultMap="smap"> select * from t_student; </select> </mapper>
其他基本与上篇文章保持不变,只是在serviceimp里面不再需要查询班级的mapper
public class StudentServiceImpl implements StudentService { @Override public List<Student> selAll() { SqlSession session = MyBatisUtil.getSession(); //获取到学生mapper StudentMapper stuMapper = session.getMapper(StudentMapper.class); List<Student> list = stuMapper.selAll(); session.close(); return list; } }
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
表结构学生表(t_student),字段有id,name,age,gender,cid.班级表(t_class)字段有id,name,room语句:--班级表createtablet_class(idint(3)primarykeyauto_increment,namevarchar(20)notnull,roomvarchar(30));--学生表createtablet_student(idi
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级业务装配模式,实际上就是mapper层做单表查询操作,在service层做手动装配,实现关联查询的结果思路:①首先实体之间的关系,学生之于班级是多对一所以在学生的实体类从传入一个Class对象用于封装班级信息②然后分别定义学生的查询操作和班级的查询操作③在service层中创建两个mapper对象,进行业务装配,首先先查询
mybatis的Auto-Mapping机制及数据库查询时的别名结合,可以方便的实现多表查询.SQL语句中,别名出现特殊符号时,必须进行处理.MySQL可以使用(``)符号,Oracle可以使用("")符号.什么意思呢?就是在我们之前的操作过程中,我们是没法获取属性是对象的属性的也就是Student类中的Clazz属性我们没法直接获取需要借助resultMap或者是collection标签来操作具
思路整理一下之前一直做的都是多对一的查询多:学生一:班级通过查到学生后在去查询班级现在倒过来,做1对多的查询,一个班级多个学生那怎么处理这个多呢,实际上就是吧所有的学生封装进一个集合里表现出来,最直观的就是在class的实体类中添加一个学生类型的集合思路:在pojo里的Class类的属性中加入Student的集合,将查到的Student信息封装进Class类里面pojo层Clazz.classpu
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级之前用的业务装配或者是n+1查询都是存在一个缺点的,就是都是分别执行单次查询,然后再组装,无形之中就给数据库增加了巨大的压力,毕竟是要执行多次查询所以接下来要介绍使用resultMap标签来实现两张表一起查并且拼接在一起这样就只有查询一次sql缺点就是写的时候要细心一点就是了首先先是要使用的sql语句selects.ids
一般我们使用@RequestMapping("***")的时候,后面的括号里的***是不能重复的在实际开发过程中,因为不是一个人开发,所以难免会有凑巧的时候,那怎么弄呢?因为上篇用了ajax1的路径,并且两个类都在一个包下,所以就拿来做例子请求转发重定向从上面的例子我们可以看出转发和重定向在SSM中还是非常简单的,主要原因是走了视图解析器--下面内容了解就好第一种第二种ModelAndView:既
0、简介mybatis-mate为mp企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成SQL维护等,旨在更敏捷优雅处理数据。1、主要功能字典绑定字段加密数据脱敏表结构动态维护数据审计记录数据范围(数据权限)数据库分库分表、动态据源、读写分离、数据库健康检查自动切换。2、使用2.1依赖导入SpringBoot引入自动依赖注解包<
去Oracle行动最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的Oracle变为Mysql。公司的数据库交互层面使用的是mybatis,而Oracle与Mysql也有一些语法上的不同。所以在项目中的Sql要改动,但是多个项目中涉及到的Sql非常多,如果仅凭人工一条一条辨别的话,工作量有点大。所以就萌发出了直接将数据源变为Mysql,利用反射批量执行Mapper中的方
序言:使用mybatis3提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求。一.基础注解mybatis主要提供了以下CRUD注解:@Select@Insert@Update@Delete增删改查占据了绝大部分的业务操作,掌握这些基础注解的使用还是很有必要的,例如下面这段代码无需X
1.说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。四大还好说,问题是七大传播特性是哪儿来的?是Spring在当前线程内,处理多个数据库操作方法事务时所做的一种事务应用策略。事务本身并不存在什么传播特性,不要混淆事务本身和Spring的事务应用策略。(当然,找工作面试时,还是可以巧妙的描述传播特性的)2.一说到事务,人们可能又会想起create、begi
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!