这里演示的是多对一
多:学生
一:班级
多个学生一个班级,通过查询学生后再查询班级
业务装配模式,实际上就是mapper层做单表查询操作,在service层做手动装配,实现关联查询的结果
思路:
①首先实体之间的关系,学生之于班级是多对一
所以在学生的实体类从传入一个Class对象用于封装班级信息
②然后分别定义学生的查询操作和班级的查询操作
③在service层中创建两个mapper对象,进行业务装配,首先先查询学生的所有信息,学生的所有信息中包含了班级的id,再用查到的学生信息中的班级id去做班级的查询,最后封装进学生对象,最后在测试类中直接调用方法进行查询
这么做的好处是分开查询,结构清晰,但是代码和逻辑量就稍大一些
根据上面的思路我们一层一层的屡
定义实体类Clazz
具体操作就是常规的
继承Serializable接口,
无参有参构造方法,
重写hashCode和equals方法,toString方法,
提供公有的set和get方法
定义实体类Student
还有插入Class 用于封装查询班级信息
public class Student implements Serializable { private int id; private String name; private int age; private String gender; private int cid; private Clazz clazz;//用于封装班级信息 }
studentMapper.interface
public interface StudentMapper { List<Student> selAll(); }
studentMapper.xml
<mapper namespace="com.lin.mapper.StudentMapper"> <select id="selAll" resultType="student"> select * from t_student; </select> </mapper>
ClazzMapper.interface
public interface ClazzMapper { Clazz selById(int id); }
ClazzMapper.xml
parameterType:因为传入的是参数是int类型所以就是用int mybatis 会自动处理参数类型
<mapper namespace="com.lin.mapper.ClazzMapper"> <select id="selById" resultType="Clazz" parameterType="int" > select * from t_class where id=#{0} </select> </mapper>
studentService.interface
public interface StudentService { List<Student> selAll(); }
studentServiceImpl.class
这里是业务装配的重中之重,思路整理
先查询学生的所有信息再利用学生信息中包含的班级id查询到班级信息,之后再封装回学生的集合中
这里是手动进行了组装,所以称之为业务装配
public class StudentServiceImpl implements StudentService { @Override public List<Student> selAll() { //获取session对象 SqlSession session = MyBatisUtil.getSession(); //获取到学生mapper StudentMapper stuMapper = session.getMapper(StudentMapper.class); //获取到班级mapper ClazzMapper claMapper = session.getMapper(ClazzMapper.class); //查询学生信息并且存进list集合中 List<Student> list = stuMapper.selAll(); //为每一个student 组装班级信息 for (Student student : list) { //根据查询到的学生信息中的班级信息查询学生班级的具体信息 Clazz clazz = claMapper.selById(student.getCid()); //封装进学生属性中 student.setClazz(clazz); } session.close(); //返回集合 return list; } }
public class TestQuery { public static void main(String[] args) { //创建service对象 StudentService service = new StudentServiceImpl(); //调用其中查询方法获取集合 List<Student> list = service.selAll(); //遍历集合获取学生对象 for (Student student : list) { System.out.println(student); } } }
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
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
这里演示的是多对一多:学生一:班级多个学生一个班级,通过查询学生后再查询班级所谓的N+1次查询呢,实际上就是mybatis帮我们做了业务装配来看下下面的图执行一次学生的查询,有几个学生执行几次班级的查询实际上就是在上一篇文章的StudentMapper.xml里面使用了resultMap来实现n+1查询
表结构学生表(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
mybatis运行原理1.涉及到的接口和类:>Resources,类,用于加载核心配置文件,返回InputStream>SqlSessionFactoryBuilder,类,工厂对象的构建类,用于基于输入流创建工厂对象>SqlSessionFactory,接口,用于创建SqlSession对象的工厂>SqlSession,接口,mybatis中的核心对象>XmlConfigBuilder,类,解析
我们平时的jsp文件都是放到web目录下,现在我们如果把jsp文件放到WEB-INF下,就发现没有办法访问,这样的设计的目的就是为了提高项目访问的安全性所以我们就访问不了了..................................................................................................................
下载相对于上传来说简单许多,分为三步走1.后台定义展示能被下载的内容@RequestMapping("/loadFiles")publicStringloadFiles(HttpServletRequestreq){//找到所有能下载的文件名Filedir=newFile(req.getServletContext().getRealPath("/upload"));String[]list=di
因为之前介绍了maven项目,然后就不在采用导jar包的方式整合SSM(Spring+SpringMVC+mybatis)直接用maven步骤走吧~一用模版创建项目填写好自己的信息没问题就下一步就好二在pom文件中添加依赖并且整合一次推荐直接复制就好,不要手敲~如果有版本要求,修改版本就好
数据库表及数据createtablestudent(idint(5)primarykeyauto_increment,namevarchar(255)notnull,ageint(3)notnull,scoredouble(3,2)notnull,filenamevarchar(255),filetypevarchar(255))insertintostudentvalues(default,'小
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!