第五章
【思考题】
1、请简述Spring中事务管理的两种方式。
2、请简述如何使用Annotation方式进行声明式事务管理。
【答案】
1、Spring中的事务管理分为两种方式:一种是传统的编程式事务管理,另一种是声明式事务管理。其中,编程式事务管理是通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。声明式事务管理是通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码植入到业务目标类中。
声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务规则应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少了工作量,提高了开发效率。
2、Spring的声明式事务管理通过Annotation(注解)方式来实现时,开发者只需做两件事情:
1)在Spring容器中注册事务注解驱动,其代码如下:
2)在需要使用事务的Spring Bean类或者Bean类的方法上添加注解@Transactional。如果将注解添加在Bean类上,则表示事务的设置对整个Bean类的所有方法都起作用;如果将注解添加在Bean类中的某个方法上,则表示事务的设置只对该方法有效。 第六章 【思考题】 1、请简述MyBatis框架与Hibernate框架的区别。 2、请简述MyBatis的工作执行流程。 【答案】 1、Hibernate和MyBatis。这两个框架的主要区别如下: (1)Hibernate:是一个全表映射的框架。通常开发者只需定义好持久化对象到数据库表的映射关系,就可以通过Hibernate提供的方法完成持久层操作。开发者并不需要熟练的掌握SQL语句的编写,Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口来执行,所以其开发效率会高于MyBatis。然而Hibernate自身也存在着一些缺点,例如它在多表关联时,对SQL查询的支持较差;更新数据时,需要发送所有字段;不支持存储过程;不能通过优化SQL来优化性能等。这些问题导致其只适合在场景不太复杂且对性能要求不高的项目中使用。 (2)MyBatis:是一个半自动映射的框架。这里所谓的“半自动”是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系,而Hibernate只需提供POJO和映射关系即可。与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,它还支持存储过程等。对于一些复杂的和需要优化性能的项目来说,显然使用MyBatis更加合适。 2、MyBatis框架的工作执行流程如下: (1)读取MyBatis配置文件mybatis-config.xml。 (2)加载映射文件Mapper.xml。 (3)构建会话工厂。 (4)创建SqlSession对象。 (5)使用Executor接口来操作数据库。 (6)使用MappedStatement类型的参数对映射信息进行封装。 (7)输入参数映射。 (8)输出结果映射。 第七章 【思考题】 1、请简述MyBatis核心对象SqlSessionFactory的获取方式。 2、请简述MyBatis映射文件中的主要元素及其作用。 【答案】 1、SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例,通过XML配置文件构建出的SqlSessionFactory实例,其实现代码如下: // 读取配置文件 InputStream inputStream = Resources.getResourceAsStream(\配置文件位置\// 根据配置文件构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 2、在映射文件中, 第八章 【思考题】 1、请简述MyBatis框架动态SQL中的主要元素及其作用。 2、请简述MyBatis框架动态SQL中 【答案】 1、MyBatis动态SQL中的主要元素及其作用如下: (1) (2) (3) (4) (5) 2、在使用 (1)如果传入的是单参数且参数类型是一个数组或者List的时候,collection属性值分别为array和list(或collection); (2)如果传入的参数是多个的时候,就需要把它们封装成一个Map了,当然单参数也可以封装成Map集合,这时候collection属性值就为Map的键。 (3)如果传入的参数是POJO包装类的时候,collection属性值就为该包装类中需要进行遍历的数组或集合的属性名。 所以在设置collection属性值的时候,必须按照实际情况配置,否则程序就会出现异常。。 第九章 【思考题】 1、请简述不同对象之间的三种关联关系。 2、请简述MyBatis关联查询映射的两种处理方式。 【答案】 1、在java中,对象之间存在着三种关联关系,分别是一对一,一对多和多对多。在这三种关联关系中,一对一的关系就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a;一对多的关系就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a;多对多的关系就是在A类中定义B类类型的集合,在B类中定义A类类型的集合。 2、MyBatis在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型;嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。开发人员可以使用上述任意一种方式实现对关联关系的加载。