1、实验06基于Spring+MyBatis+JavaFX框架的教学管理程序的设计与实现实验06、基于Spring+MyBatis+JavaFX框架的教学管理程序的设计与实现一、实验说明上一个实验使用MyBatis框架改写了教学管理程序的底层Mapper层。这次的实验将在上一个实验的基础上,使用Spring框架整合MyBatis和JavaFX。Spring是一个管理和维护javaBean的容器,因此,本实验涉及到的绝大多数对象都要被Spring容器抢走或接管。1) JavaFx的Controller层被Spring容器接管2) Service(Biz)层的各个类被Spring容器接管3) MyBa
2、tis的Mapper(Dao)层接口,被Spring容器抢走4) MyBatis的Mapper.xml,也被Spring容器抢走5) MyBatis核心操作对象SqlSession的bean工厂SqlSessionFactory被Spring容器抢走二、实验准备1、下载、安装、配置好mysql-8.0.12-winx64和Navicat。不赘述2、下载、解压好mysql的jdbc驱动mysql-connector-java-8.0.12,并导入项目中。不赘述。3、下载、解压好连接池commons-dbcp2-2.5.0和其依赖包commons-logging-1.2和commons-pool2
3、-2.6.0,并导入项目中。不赘述。4、下载、解压好mybatis-3.4.6,并导入项目中。不赘述。5、下载、解压好spring-framework-5.1.1.RELEASE。进入lib文件夹,里面的每一个jar包都是spring框架的组件jar包,这里的组件jar包很多,为了管理方便,项目将该组jar包以user library的形式导入,如下所示:然后一路Ok、Apply或finish就导入了spring5.1.1。6、下载、解压好spring整合mybatis的jar包mybatis-spring-1.3.2,并导入项目中。至此,本项目使用的第三方jar包导入完毕。如下所示:三、整合
4、过程整个整合过程基本上就是spring抢bean的过程。下面只列出和实验05相比,发生变化的部分。1、 resource目录(1)修改mysql.properties增加连接池dbcp2的配置,如下所示(2)修改mybatis-config.xml本来mybatis-config中配置了typeAliases、datasource、mapper等内容,但datasource、mapper会被spring抢走,因此只剩下typeAliases。如下所示:(3)增加spring核心配置文件:spring-context.xmlSpring-context.xml文件里面要写两套配置:1 sprin
5、g自身配置;2 抢过来的bean配置。参考代码如下:A)抢走数据库配置B)抢走生产sqlSession的bean工厂sqlSessionFactory,顺带抢走了mapper.xml和mapper接口类对象C)spring自身的配置(4)resource/mapper文件夹里面的内容不变2、exception包不变3、util包(1)删除获得mybatis核心操作对象sqlSession的类DBUtil因为sqlSession被Spring抢走了,由Spring接管对它的管理和维护。(2)增加SpringFxmlLoader类由于javaFx的controller将由spring接管,那么前期
6、使用FXMLLoader类加载FXML界面文件的方式要修改。SpringFxmlLoader类的参考代码如下:其中,该类中的JavaFXAppMain.APPLICATION_CONTEXT在入口类中定义并赋值,见本文档最后。之后将利用SpringFxmlLoader来加载fxml文件。4、domain、domain.wrapper不变5、mapper层使用注解创建组件对象。组件对象的注解有四种:Component、Repository、Service、Controller,用在类或接口上,分别表示创建组件、创建数据操作层组件、创建服务层组件、创建控制器层组件。目前,spring对这四者没有区
7、别,都通用。但是,作为一个优雅的Javaer,还是需要严格区分的,建议不同的层次使用不同的注解。如在StudentMapper接口类上,添加注解Repository,在程序运行过程中,spring就会创建一个StudentMapper类型的对象,该接口由studentMapper.xml实现,因此创建的对象事实上是实现类(这里是studentMapper.xml)的对象。如果不指定对象名字,spring则会按类型查找。单例模式下,不需指定对象名字;非单例模式下,可以指定名字,如Repository(“studentMapper”)。如果要在service层注入该对象,没指定名字的条件下,直接使
8、用注解Autowired,按类型查找;如果指定了名字,则使用AutowiredQualifier(studentMapper)两个注解修饰。下面是StudentMapper接口添加接口后的参考代码。只是添加了注解,其他都没变。mapper层的其他接口UserMapper、CourseMapper、GradeMapper同样处理即可。6、service层这一层,之前项目一直使用”biz”的名称,但在Spring框架中,这一层称为service,因此,本项目将该层重命名为service,该层的类重命名为以”Service”结尾,如StudentService。首先,Service层依赖于mappe
9、r层,因此,要向service注入需要的mapper;第二,之前使用的sqlSession由于被spring接管,因此,不再需要sqlSession,删除即可;第三,之前该类的构造方法,是利用sqlSession的getMapper方法获得各个mapper,并初始化ObservableList,现在的mapper对象被spring接管,不需要getMapper了,还有ObservableList的初始化需要mapper,而这时service还不存在,也就不会存在mapper,因此,删除该构造方法,ObservableList的初始化工作不再使用构造方法,而使用一个显式方法,如setStudOb
10、servList来完成。因此,以下是StudentService的参考代码(部分):CourseService差不多GradeService也差不多,参考代码如下:7、controller层这一层是JavaFX的控制器层。(1)增加Controller注解该层除了抽象基类EditController不需要加Controller注解外,每个类将增加注解Controller,交由Spring接管。都是单例模式,根据类型注入。因此,不需要指定name。(2)使用SpringFxmlLoader类加载fxml界面切换到另一个界面使用类似于这两句就可以了,如启动主界面的方法如下:(3)在MainViewController的initialize方法中加载各个表数据显示MainView时,需要从数据库中加载全部数据,可以在MainViewController的initialize方法中实现。如下所示(4)各个控制器需要的service采用注入方式如,MainViewController需要注入studentService、courseService、gradeService,如下:其他controller注入如下:8、view层不变。9、程序入口程序入口类JavaFXAppMain的参考代码:这个类中加载了spring上下文。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1