mybatis-spring-springMVC-springBoot总结
介绍
第一节 mybatis
1、mybatis简介
MyBatis原本是Apache软件基金会的一个开源项目叫iBatis,2010年这个项目由Apache迁移到了google code上来管理并改名为MyBatis,2013年又迁移到了Github。
MyBatis是一个非常优秀的持久层框架(DAO层框架),它是对JDBC的封装,使得开发者只需要关注SQL语句(业务)本身即可,无需开发者处理加载驱动、获取连接、创建Statement等繁琐的操作。
MyBatis最大的特点就是把SQL语句写在XML配置文件中,而且MyBatis执行完SQL语句之后可以以对象形式返回(POJO/POJO集合等)
MyBatis是一个实现类ORM思想的持久层框架ORM(Object/Relation Mapping)对象/关系映射,对象就是指的java中的类的实例,关系指的是关系型数据库
ORM思想:将数据库中的关系数据表映射为java中的对象,把对数据表的操作转换为对对象的操作,实现面向对象编程。因此ORM的目的是使得开发人员以面向对象的思想来操作数据库。
比如:原来添加使用的是INSERT INTO…,如果使用了实现ORM思想的持久层框架,就可以在Java程序中直接调用api,比如insert(User),达到操作对象即可操作数据库的效果。
Hibernate是一个全自动的ORM持久层框架,只需要编写POJO,在XML中定义好POJO属性和数据库表字段的映射/对应关系,就可以在Java中实现以面向对象的方式进行操作。SQL语句都不用编写,但是因为性能等问题,市场占有率越来越低。
MyBatis框架是一个半自动的ORM持久层框架,也可以在Java中实现以面向对象的方式操作数据库,但是需要我们自己编写SQL语句,MyBatis是目前比较流行的DAO中持久层的框架技术。
2、mybatis使用基本步骤
第二节 spring
0、Spring中的事务控制
0.1 事务简介
- Spring的事务控制都是基于AOP的,它既可以使用编程的方式实现,也可以使用配置的方式实现
- Spring框架为我们提供了一组事务控制的接口,spring-tx.jar
- JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层事务处理的解决方
案
0.2 Spring中事务控制API介绍
-
PlatformTransactionManager
此接口是Spring的事务管理器,它里面提供了我们常用的操作事务的方法,如下:- 获取事务状态信息:
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws
TransactionException; - 提交事务:
void commit(TransactionStatus var1) throws TransactionException; - 回滚事务:
void rollback(TransactionStatus var1) throws TransactionException;
- 获取事务状态信息:
-
TransactionDefinition它是事务的定义信息对象,里面包含如下方法:
- 取事务对象名称:
String getName(); - 获取事务的隔离级别:
int getIsolationLevel(); - 获取事务的传播行为:
int getPropagationBehavior(); - 获取事务超时时间:
int getTimeout(); - 获取事务是否只读:
boolean isReadOnly();
等等
- 取事务对象名称:
0.3 Spring事务配置相关标签及属性
1、spring简介(IOC+AOP)
Spring是分层的JavaSE/EE应用的轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层(Web层)SpringMVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界中众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
老的框架组合:
Struts2+Spring+Hibernate(SSH)
SpringMVC+Spring+MyBaits(SSM)
新的框架组合:
Spring+SpringBoot+MyBatis(新SSM)
2、spring优势
- 1.方便解耦,简化开发
通过Spring提供的IOC容器,可以将对象的依赖关系交由Spring进行控制,避免硬编码所造成的程序过度耦合。用户也不必再为单例模式、属性文件的解析等这些底层的需求编写代码,可以更加专注于上层的业务。
- 2.AOP编程的支持
通过Spring的AOP功能,方便进行面向切面编程,许多不容易用OOP实现的功能可以通过AOP轻松实现。
- 3.方便程序的测试
可以使用非容器依赖的编程方式进行几乎所有的测试工作
- 4.方便集成各种优秀的框架
Spring可以降低各种框架的使用难度,提供了对各种框架的支持
-5. 降低Java API的使用难度
Spring 对JavaEE API进行了封装,例如:JDBC、JavaMail
- 6.Spring源码是经典的学习范例
Spring源码设计精妙、结构清晰、匠心独用等处处体现大师对Java设计模式的灵活运用及Java技术的高深造诣。它的源代码是Java技术最佳实践的范例。
3、控制反转 IOC—Inverse Of Control
3.1.内聚和耦合
-
耦合性(Couping),也叫耦合度,它是对模块之间关联程度的度量在软件工程中,耦合指的就是对象之间的依赖关系。对象之间的耦合越高,则表明模块的独立性和可重用性越差,且维护成本越高。因此,对象的设计应使类和构件之间的耦合最小。软件设计中通用用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个标准就是高内聚低耦合。
-
内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应恰好做一件事,它描述的是模块内的功能联系。
耦合是软件结构中各个模块之间相互连接的一种度量,耦合强弱取决于模块之间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据的复杂度。程序讲究的低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依赖度却不要那么紧密。
程序的耦合:就是程序之间的依赖关系
包括:
类之间的依赖
方法之间的依赖
解耦:
降低程序之间的依赖关系
实际开发中:
应该做到:编译期不依赖,运行时才依赖
解耦思路:
第一步:使用反射来创建对象,而避免使用new关键字
第二步:通过读取配置文件来获取要创建的对象全限定类名
3.2. IOC概述
IOC(Inverse Of Control)中文的解释是”控制反转“,对象的使用者不是创建者,作用是将对象的创建反转给Spring框架来创建和管理。
控制反转怎么去理解呢?其实它反转的是什么呢?反转的是对象的创建工作。举个例子:平常我们在Servlet或者service里面创建对象,都是使用new的方式来直接创建对象,现在有了spring之后,我们就再也不new对象了,而是把对象创建的工作交给spring容器去维护,我们只需要向spring容器要对象即可。
IOC的作用:消减计算机程序的耦合(降低代码中的依赖关系)
4、依赖注入(DI)
依赖注入(DI):Dependency Injection。就是让Spring框架给Bean对象的属性进行赋值,它是Spring框架核心IOC的具体体现。
- 我们在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况,IOC解耦只是降低它们的依赖关系,但是不会消除。
- 简单的来说,依赖注入(DI)就是坐等框架把所有需要的对象传过来,而不要我们自己去获取。
4.1. 构造方法注入
使用构造方法的方式,给POJO中的属性传值
要求:POJO需要提供一个有参数的构造方法
<!--DI:依赖注入 通过构造方法实现-->
<bean id="account" class="com.wojia.domain.Account">
<!--
constructor-arg标签:通过构造方法注入值
属性:
index:指定参数在构造方法参数列表中的索引位置
ref:引用其它bean对象,作为当前属性的值,指定所引用bean的id属性即可
type:指定参数在构造方法中的数据类型
name:指定参数在构造方法中的名称,用这个name属性值和构造方法中的参数名进行匹配
value:给参数赋值,它能赋值基本数据类型的值也可以是引用类型或者String
-->
<!--通过参数索引赋值-->
<!-- <constructor-arg index="0" type="java.lang.Integer" value="1001"/>-->
<!-- <constructor-arg index="1" type="java.lang.String" value="zhangsan"/>-->
<!-- <constructor-arg index="2" type="double" value="7777.0"/>-->
<!-- <constructor-arg index="3" type="java.util.Date" ref="date"/>-->
<!--通过参数名赋值-->
<!--