这里演示的是多对一
多:学生
一:班级
多个学生一个班级,通过查询学生后再查询班级
之前用的业务装配或者是n+1查询都是存在一个缺点的,就是都是分别执行单次查询,然后再组装,无形之中就给数据库增加了巨大的压力,毕竟是要执行多次查询
所以接下来要介绍使用resultMap标签来实现两张表一起查并且拼接在一起
这样就只有查询一次sql 缺点就是写的时候要细心一点就是了
首先先是要使用的sql语句
select s.id sid ,s.`name` sname ,s.age age ,s.gender gender ,s.cid cid, c.id ,c.`name`,c.room from t_student s LEFT JOIN t_class c on s.cid = c.id
改写studentMapeer.xml
思路整理:实际上就是把association 标签当作resultMap标签用了,朋友们可以看下下面的代码仔细品一下,看是不是这么个用法
<mapper namespace="com.lin.mapper.StudentMapper"> <resultMap id="smap" type="Student"> <id property="id" column="sid"/> <result property="name" column="sname"/> <result property="age" column="age"/> <result property="gender" column="gender"/> <association property="clazz" javaType="Clazz"> <id property="id" column="id"/> <result property="name" column="cname"/> <result property="room" column="croom"/> </association> </resultMap> <select id="selAll" resultMap="smap"> select s.id sid ,s.`name` sname ,s.age age ,s.gender gender ,s.cid cid, c.id cid ,c.`name` cname ,c.room croom from t_student s LEFT JOIN t_class c on s.cid = c.id </select> </mapper>
association 标签中
javaType 属性表示当前对象, 可以写全限定路径或别名。
association 指定对象属性的映射关系。
项目结构中删除了ClassMapper.interface 和ClassMapper.xml
其他代码保持不变
StudentMapper.interface
public interface StudentMapper { List<Student> selAll(); }
StudentMapper.xml
StudentService.interface
public interface StudentService { List<Student> selAll(); }
StudentServiceImpl.class
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; } }
public class TestQuery { public static void main(String[] args) { StudentService service = new StudentServiceImpl(); List<Student> list = service.selAll(); for (Student student : list) { System.out.println(student); } } }
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
表结构学生表(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
思路整理一下之前一直做的都是多对一的查询多:学生一:班级通过查到学生后在去查询班级现在倒过来,做1对多的查询,一个班级多个学生那怎么处理这个多呢,实际上就是吧所有的学生封装进一个集合里表现出来,最直观的就是在class的实体类中添加一个学生类型的集合思路:在pojo里的Class类的属性中加入Student的集合,将查到的Student信息封装进Class类里面pojo层Clazz.classpu
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级所谓的N+1次查询呢,实际上就是mybatis帮我们做了业务装配来看下下面的图执行一次学生的查询,有几个学生执行几次班级的查询实际上就是在上一篇文章的StudentMapper.xml里面使用了resultMap来实现n+1查询
mybatis的Auto-Mapping机制及数据库查询时的别名结合,可以方便的实现多表查询.SQL语句中,别名出现特殊符号时,必须进行处理.MySQL可以使用(``)符号,Oracle可以使用("")符号.什么意思呢?就是在我们之前的操作过程中,我们是没法获取属性是对象的属性的也就是Student类中的Clazz属性我们没法直接获取需要借助resultMap或者是collection标签来操作具
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级业务装配模式,实际上就是mapper层做单表查询操作,在service层做手动装配,实现关联查询的结果思路:①首先实体之间的关系,学生之于班级是多对一所以在学生的实体类从传入一个Class对象用于封装班级信息②然后分别定义学生的查询操作和班级的查询操作③在service层中创建两个mapper对象,进行业务装配,首先先查询
include这个标签一般是用来实现sql语句复用的比如select*fromtb_user这个*包含了id,username,password*虽然方便了我们,但实际上麻烦都交给了程序,所以面对多次复用的语句可以配合sql标签提取处理来,具体处理为运行sql语句查看
之前我们用的实体类的属性名和我们表中的列名实际上是一致的,但是实际开发过程中这样的情况比较少,之前是为了做演示所以才使用一致,方便查看,但实际开发过程中,这样的情况相对的比较少,所以就要使用下面这个标签标签实际上就是解决列名和属性名不一致的问题在mybatis中存在一个机制叫做自动映射机制(auto_mapping)自动映射实际上就算mybatis中会将数据库中同名的列名和实
mybatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。mybatis3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的。要开启二级缓存,你需要在你的SQL映射文件中添加一行:cache;mybatis的一级缓存是session缓存作用到SqlSession对象,二级缓
forearch另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的.正常的sql语句中使用in的例子select*fromtb_userwhereidin(1,2,3,4)在mysql中,就将后面的查询的条件(1,2,3,4)封装成一个集合传入,并且用forearch处理接口代码packagecom.lin.mapper;importcom.lin.pojo.User;imp
Trimprefix:前缀,表示向前面添加内容prefixOverrides:从前面删除内容suffix:后缀,表示向后面添加内容suffixOverrides:从后面删除内容先对灵活,实际开发中用于解决where和set做不到的操作的时候使用Bind常用在模糊查询上两个标签name:要用于模糊查询的关键字value:写法"'%'+用于模糊查询的关键字+'%'"使用后后面的查询条件不再使用等号,而
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!