思路整理一下
之前一直做的都是多对一的查询
多:学生
一:班级
通过查到学生后在去查询班级
现在倒过来,做1对多的查询,一个班级多个学生
那怎么处理这个多呢,实际上就是吧所有的学生封装进一个集合里表现出来 ,最直观的就是在class的实体类中添加一个学生类型的集合
思路:
在pojo里的Class类 的属性中加入Student的集合,将查到的Student信息封装进Class类里面
Clazz.class
public class Clazz implements Serializable { private int id; private String name; private String room; private List<Student> studentsList; }
Student.class
public class Student implements Serializable { private int id; private String name; private int age; private String gender; private int cid; }
ClassMapper.interface
public interface ClazzMapper { List<Clazz> selAll(); }
ClassMapper.xml
重点:
这里使用了collection的标签
property:对应的是实体类中的属性
select:要执行的查询引用
column:对应的列
这里还是那句话,细品一下,是不是collection标签的用法和association的用法异曲同工呢
<mapper namespace="com.lin.mapper.ClazzMapper"> <resultMap id="cmap" type="Clazz"> <id property="id" column="id"/> <!-- 集合不在使用association 而是使用collection --> <collection property="studentsList" select="com.lin.mapper.StudentMapper.selByCid" column="id"/> </resultMap> <select id="selAll" resultMap="cmap" > select * from t_class </select> </mapper>
Student.interface
public interface StudentMapper { List<Student> selByCid(int cid); }
Student.xml
<mapper namespace="com.lin.mapper.StudentMapper"> <select id="selByCid" resultType="Student" parameterType="int"> select * from t_student where cid =#{0} </select> </mapper>
ClassService
public interface ClassService { List<Clazz> selAll(); }
ClassServiceImpl
public class ClassServiceImpl implements ClassService { @Override public List<Clazz> selAll() { SqlSession session = MyBatisUtil.getSession(); ClazzMapper mapper = session.getMapper(ClazzMapper.class); List<Clazz> list = mapper.selAll(); session.close(); return list; } }
test
public class TestQuery { public static void main(String[] args) { ClassService service = new ClassServiceImpl(); List<Clazz> list = service.selAll(); for (Clazz clazz : list) { System.out.println(clazz); } } }
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级业务装配模式,实际上就是mapper层做单表查询操作,在service层做手动装配,实现关联查询的结果思路:①首先实体之间的关系,学生之于班级是多对一所以在学生的实体类从传入一个Class对象用于封装班级信息②然后分别定义学生的查询操作和班级的查询操作③在service层中创建两个mapper对象,进行业务装配,首先先查询
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级所谓的N+1次查询呢,实际上就是mybatis帮我们做了业务装配来看下下面的图执行一次学生的查询,有几个学生执行几次班级的查询实际上就是在上一篇文章的StudentMapper.xml里面使用了resultMap来实现n+1查询
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级之前用的业务装配或者是n+1查询都是存在一个缺点的,就是都是分别执行单次查询,然后再组装,无形之中就给数据库增加了巨大的压力,毕竟是要执行多次查询所以接下来要介绍使用resultMap标签来实现两张表一起查并且拼接在一起这样就只有查询一次sql缺点就是写的时候要细心一点就是了首先先是要使用的sql语句selects.ids
mybatis的Auto-Mapping机制及数据库查询时的别名结合,可以方便的实现多表查询.SQL语句中,别名出现特殊符号时,必须进行处理.MySQL可以使用(``)符号,Oracle可以使用("")符号.什么意思呢?就是在我们之前的操作过程中,我们是没法获取属性是对象的属性的也就是Student类中的Clazz属性我们没法直接获取需要借助resultMap或者是collection标签来操作具
表结构学生表(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
这是一组标签,功能类似于switch...case..用这个标签就要注意了,因为where永远后面只有一个子句,也就是只有一个查询条件mybatis.org//DTDMapper3.0//EN""http://mybatis.o
官方解决方案https://github.com/baomidou/mybatis-plus/issues/3132github.com/baomidou/mybatis-plus/issues/3132@Slf4j@MappedTypes({Object.class})@MappedJdbcTypes(JdbcType.VARCHAR)publicclassDbJsonTypeHandlere
一般我们在传递参数的时候,接口方法定义如UserselByUP(Stringusername,Stringpassword);则在xml文件中可以使用如下代码获取参数select*fromtb_userwhereusername=#{param1}andpassword=#{param2}或者select*fromtb_userwhereusername=#{0}andpassword=#{1}但
在我们实际开发过程中动态SQL的使用远多于静态是SQL(前面用的所有sql都是静态的,也就是一成不变的),而动态SQL是根据条件的不同,SQL语句也会随之动态的改变,ifif用于进行条件判断,test属性用于指定判断条件.为了拼接条件,在SQL语句后强行添加1=1的恒成立条件.但是会造成浪费资源等情况所以需要使用where标签来配合wherewhere用于管理where子句.有如下功能:a)如果没
基本概念流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。如果没有流式查询,我们想要从数据库取1000万条记录而又没有足够的内存时,就不得不分页查询,而分页查询效率取决于表设计,如果设计的不好,就无法执行高效的分页查询。因此流式查询是一个数据库访问框架必须具备的功能。流式查询的过程当中,数据库连接是保持打开状态的,因此要注
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!