(一)Spring本身
Spring的理解?
【Spring是一个轻量级的IoC和AOP容器框架,Java企业级应用的开源开发框架,主要用于开发Java应用。目的是解决企业应用开发的复杂性,2004年发布】
是一个三层的架构,为J2EE提供集成框架:【web层:SpringMVC;业务层:spring的IOC;持久层:spring的JDBC、ORM等框架】
Spring优点?
1、轻量级容器框架
2、(Spring的IOC容器)降低组件间的耦合性。
3、Spring提供了众多辅助类(如JDBC Template等)
4、Spring对主流框架提供了支持(如SpringMVC、Mybatis、Hibernate)
5、独立于各种应用服务器
6、Spring的高度开放性,并不强制应用完全依赖于Spring,可自由选用Spring框架的部分或全部。
7、提供了对多种技术的支持(如单元测试、JMS...)
Spring适用的范围:
1、构建企业应用:SSH/SSM
2、单独使用bean容器(在spring中的对象都称作bean,spring可单独做对象Bean的管理)
3、单独使用aop作为切面处理
4、自由选用spring的其他功能,如对消息的支持等
Spring框架的2个核心功能:
1、负责创建、管理所有Java对象,这些java对象称为Bean
2、用依赖注入(DI)的方式处理容器中Bean之间的依赖关系。
(二)Spring IOC 和 DI
对Spring IOC和DI的理解,有什么区别?
DI和IOC是同件事情的不同描述
【依赖注入(DI):从应用程序角度,应用程序依赖容器创建并注入它所需的外部资源。即指Spring创建对象的过程中,将对象依赖属性通过配置进行注入;
控制反转(IOC):从容器角度,容器控制应用程序,由容器反向地向应用程序注入应用程序所需的外部资源。即IoC 控制反转,指将对象的创建权,反转到Spring容器 】
DI(依赖注入):Spring的核心机制
优点:减少耦合,独立开发组件,DI提供使用接口编程
DI依赖注入不能使组件之间相互依赖,相互制约,目的是减少组件之间的耦合度,使开发变得简单。
DI强调的是“实现”。
DI有两种:(1)设值注入:IOC容器使用成员变量的setter方法来注入被依赖对象,通过<property.../>元素驱动spring执行setter方法;
例如:一个接口Axe,有方法chop();一个接口Person,有方法useAxe();实现类Person实现Person,则类中可以有Axe axe对象,并用setAxe(Axe axe)方法注入;在spring的xml配置文件中,指明依赖关系:
<bean id="chinese" class="xxx">
<property name="axe" ref="stoneAxe" /> <!--驱动调用chinese的setAxe()方法,将stoneAxe作为传入参数-->
</bean>
<bean id="stoneAxe" class="xxxx" /> <!--配置stoneAxe实例-->
(2)构造注入:IOC容器使用构造器来注入被依赖对象,通过构造方法在配置文件中使用元素指定构造器的参数,通过<constructor-arg.../>元素驱动spring执行带参数的构造器。
例如:还是以上的例子,但在Chinese类中,有Axe axe; 构造方法:public Chinese(Axe axe);再在xml配置文件中:
<bean id="chinese" class="xxx">
<constructor-arg ref="steelAxe"/> <!--驱动调用chinese带一个参数的构造器来创建对象->
</bean>
<bean id="steelAxe" class="xxxx" /> <!--配置steelAxe实例-->
SpringIOC
Spring的IOC容器,负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
Spring的IOC有三种注入方式 :第一是根据属性注入,也叫set方法注入; 第二种是根据构造方法进行注入;第三种是根据注解进行注入
IOC的优点:易测试
(三)Spring容器:BeanFactory和ApplicationContext
Spring容器?BeanFactory、ApplicationContext
BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
是Spring的两个容器,常用接口(ApplicationContext和BeanFactory接口)
BeanFactory:产生新的实例,负责配置、创建、管理Bean
ApplicationContext:也叫做Spring上下文,提供框架的实现;一般用在spring的实现类中,作为用于访问容器中的bean常用接口
【(1)ApplicationContext接口继承BeanFactory接口,spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
(2)ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现。开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");
helloService.sayHello();】
(四)Spring常用注解:
@Autowired:修饰在何处以及如何完成自动装配。修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
@Required:表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。
(五)Spring有几种配置方式?
将Spring配置到应用开发中有以下三种方式:
基于XML的配置、基于注解的配置、基于Java的配置
(1)基于XML的配置:
所有的Spring组件都可以用xml文件的形式来进行配置。不会出现其他的Spring配置类型。
Spring的XML配置方式是使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。
![](https://img.haomeiwen.com/i11977249/2af9c5858314d94f.png)
(2)基于Java的配置:
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。
由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/> 元素类似。
被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。
![](https://img.haomeiwen.com/i11977249/a229a8b51d6b1157.png)
(3)基于注解的配置:
注解装配在Spring中是默认关闭的,需要在Spring文件中配置一下才能使用基于注解的装配模式。
![](https://img.haomeiwen.com/i11977249/b004a2ab90c6bb62.png)
用于自动装配变量的注解:
@Required:该注解应用于设值方法。
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
JSR-250 Annotations:Spring支持基于JSR-250 注解的以下注解,@Resource、@PostConstruct 和 @PreDestroy。
(六)Bean
1、Bean的作用域:
singleton:当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
prototype:Prototype作用域的bean会导致在每次对该bean请求时都会创建一个新的bean实例。
request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global session:在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。
2、Bean注入属性的方式
![](https://img.haomeiwen.com/i11977249/6b06800b1a1c42c2.png)
(七)AOP:面向切面编程(AOP):
对AOP的理解: AOP可对业务逻辑各个部分进行隔离,降低业务逻辑各部分间的耦合度,提高程序可重用性,提高开发效率。
Spring 框架中都用到了哪些设计模式?
单例模式—在spring配置文件中定义的bean默认为单例模式。
工厂模式—BeanFactory用来创建对象的实例。
代理模式—在AOP和remoting中被用的比较多。
模板方法—用来解决代码重复的问题。比如.RestTemplate,JmsTemplate,JpaTemplate。
前端控制器—Spring提供了DispatcherServlet来对请求进行分发。
视图帮助(View Helper)—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
依赖注入—贯穿于BeanFactory/ApplicationContext接口的核心理念。
Spring框架的本质就是通过XML配置类驱动java代码,从而把耦合关系提取到配置文件中管理,实现了系统中各组件的解耦。
Spring通过配置文件描述Bean及Bean之间的依赖关系,并通过Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。
SpringMVC:
对SpringMVC的理解?
SpringMVC是一个表现层的框架,是Spring的一个模块,基于MVC架构来简化web应用程序开发的应用开发框架,将model、view和controller三者分离,简化开发。
【model层:比如一个实体类
![](https://img.haomeiwen.com/i11977249/de3b53af0cb3a066.png)
view层:定义一个jsp
![](https://img.haomeiwen.com/i11977249/afd4ff2aab179872.png)
Controller层:springMVCDemo-servlet.xml文件:SpringMVC的配置文件,如配置视图解析器
![](https://img.haomeiwen.com/i11977249/28e75a42ed7c5de1.png)
】
SpringMVC和ajax的调用?
方法前加上@RequestBody注解,直接返回java对象。
项目中用了fastjson,将java对象转化为json对象(js可识别),ajax.post()、get()传值得值
SpringMVC的异常处理?
可以抛给Spring框架,由Spring处理,只需配置简单的异常处理器,在异常处理器上添视图页面。
SpringMVC的核心入口类? DispatchServlet,用来处理所有的HTTP请求和响应。
SpringMVC的控制器:用@Controller注解,是单例模式
SpringMVC的返回模式:可以是String等
SpringMVC中将视图和数据合并的类?:ModelAndView
SpringMVC常用注释:
@Controller:修饰类,表明该类作为控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。
@RequestMapping 注解:该注解是用来映射一个URL到一个类或一个特定的方处理法上。
SpringMVC的优点:
(1)基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件,并且和Spring提供的其他基础结构紧密集成。
(2)不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
(3)可以任意使用各种视图技术(jsp、js、html等)
(4) 支持各种请求资源的映射策略
(5)易于扩展
SpringMVC怎么样设定重定向和转发的?
(1)在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4"
(2)在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.baidu.com"
SpringMVC的流程:
![](https://img.haomeiwen.com/i11977249/0026c981349326a7.png)
1、用户 发送请求 到 前端控制器
2、前端控制器 委托请求 到 页面控制器
3、处理器 调用业务对象 到 模型
4、模型 返回模型数据 到 页面控制器/处理器
5、页面控制器/处理器 返回 ModelAndView 到 前端控制器
6、前端控制器 渲染 视图
7、视图 返回控制 到 前端控制器
8、前端控制器 产生响应 返回用户
![](https://img.haomeiwen.com/i11977249/f9c7f4f0d4c8e6d4.png)
组件:
1、前端控制器DispatcherServlet(不需开发):框架支持,用于接收请求,响应结果,相当于转发器,中央处理器。是当于mvc模式中的c。是整个流程控制的中心,由它调用其它组件处理用户的请求,降低了组件之间的耦合性。
2、处理器映射器HandlerMapping(不需开发):根据请求的url查找Handler(即处理器)。springmvc提供了不同的映射器实现不同的映射方式,如配置文件方式、实现接口方式、注解方式等。
3、处理器适配器HandlerAdapter: 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler:
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处
5、视图解析器View resolver(不需要攻城狮开发),由框架提供。作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View:需要开发。view是一个接口,实现类支持不同的view类型。
Mybatis:
是一个持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录
【其他持久层框架:hibernate】
mybatis的使用?
需要一个配置文件,实体类bean,一个接口类,一个xml文件或者是在接口类上用注解写sql语句(@select、@update、@delete),链接数据库。
mybatis面试题目:
1、#{}和${}的区别是什么?
#{}:变量占位符
${}:sql的参数占位符,直接替换,容易出现sql注入的问题
2、xml映射文件中,除了常见的seletct | insert | update | delete外还有什么标签?
<resultMap>(<resultMap>:用于解决实体类中属性和表字段名不相同的问题,其中还有<id>和<result>标签)<parameterMap>、<sql>、<include>、<selectKey>
<mapper>:每个映射文件的根标签,重点关注<mapper>标签中namespace属性
![](https://img.haomeiwen.com/i11977249/8d9ffd7087de6a00.png)
AccountMapper.xml:
![](https://img.haomeiwen.com/i11977249/eddffb52d961509a.png)
![](https://img.haomeiwen.com/i11977249/562d38833ea9be8a.png)
3、Mybatis进行批量插入,能返回数据库主键列表吗?
能。
4、mybatis如何将sql执行结果封装为目标对象并返回的?有哪些映射形式?
【(1)<resultMap>标签,定义列名和对象属性名之间映射关系;(2)使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。】
5、Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别。
【只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。】
6、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
【不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。】
7、使用Mybatis的mapper接口调用时有哪些要求
【1、Mapper接口方法名与xml中sql的id名相同;
2、mapper接口方法输入输出参数类型和xml中parameterType、retsultType类型相同;
3、mapper接口类路径对应xml中namespace】
8、Mybatis的一级缓存和二级缓存?
【Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。】
Hibernate:
一个开源的、轻量级的ORM工具,对JDBC进行非常轻量级的对象封装,将POJO与数据库表建立映射关系。可自动生成SQL语句,自动执行。
![](https://img.haomeiwen.com/i11977249/235c0e0b8029b699.png)
可应用在任何使用JDBC的场合,可在java客户端或在servlet/jsp的应用中使用。
Hibernate框架有很多优点。它们分别如下:
1、开源和轻量级
2、快速性能:Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。
3、数据库独立查询:HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。
4、自动创建表:Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。
5、简化复杂连接:在hibernate框架中可轻松获取多个表中的数据。
6、提供查询统计和数据库状态:Hibernate支持查询缓存,并提供有关查询和数据库状态的统计信息。
hibernate主要结构:
持久化类pojo(如student)、持久类映射文件(student.hbm.xml,直接对着持久类生成)、hibernate配置文件(hibernate.cfg.xml)
![](https://img.haomeiwen.com/i11977249/5c623c753e3eb9a2.png)
使用JUnit测试
@Before:初始化方法
@Test:测试方法
@After:释放资源
![](https://img.haomeiwen.com/i11977249/31e684172d7dc4db.png)
总结:
![](https://img.haomeiwen.com/i11977249/399f5b0d873cda7d.png)
插入数据(包括图片流!):
![](https://img.haomeiwen.com/i11977249/e1743fd3793bfe87.png)
更新数据:
![](https://img.haomeiwen.com/i11977249/81e74cf2293b3b18.png)
查找操作:
![](https://img.haomeiwen.com/i11977249/809ba057f6eac522.png)
查找并输出图片:
![](https://img.haomeiwen.com/i11977249/fecda4506d17235b.png)
删除:
![](https://img.haomeiwen.com/i11977249/dc14d37c32f50b77.png)
ORM映射:ORM将对象映射到数据库中存储的数据的编程技术。
将关系数据库包装成面向对象的模型的工具。
ORM的基本映射方式:数据库表映射类、数据库表的行映射对象(实例)、数据库表的列(字段)映射对象的属性。完成对象模型和关系模型的相互映射。
hibernate面试题:
1、hibernate并发机制:
【(1)hibernate的session对象非线程安全,对单个请求,对各工作单元,单个事务只使用一次便丢弃。
(2)多事务并发访问同一块资源,可能引发脏读、不可重复读、幻读的问题。
解决方案:设置事务隔离级别:串行化(最高)、可重复读、不可重复读/已提交读、未提交读】
2、update和saveOrUpdate?
【update:必须是已持久化了的对象。
saveOrUpdate:都可以。已持久的,则更新;未持久的,则save到数据库中。】
3、hibernate三种状态:瞬时、游离、持久
【1)、从瞬时态save(),变成持久化状态;
2)、往session中存对象,是往它的缓存和数据库中各存了一份,缓存中的叫持久对象,当session关闭,则对象变成游离状态;
3)、游离状态update()时,变成持久状态
4)、持久态delete()时,变瞬时状态】
4、怎么在控制台看到hibernate生成并执行的sql?
在配置文件hibernate.cfg.xml中把hibernate.show_sql改为true(但会加重系统负担,不利于性能调优)
5、hibernate工作原理及为什么要用?
【工作原理:1、读取并解析配置文件
2、读取并解析映射信息,创建sessionFactory
3、打开session
4、创建事务Transaction
5、持久化操作
6、提交事务
7、关闭session和sessionFactory
为什么要用?1、对JDBC访问数据库进行封装,简化。2、支持各种关系数据库,从一对一到多对多的各种复杂关系。】
6、SessionFactory:单个数据库映射关系经过编译后的内存镜像,线程安全,是生成session的工厂;是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。
session:会话,提供应用程序和存储在数据库中数据间的接口
Transaction:事务,代表一次原子操作,具有数据库事务的概念。一个session内可能包含多个transaction对象。
TransactionFactory:事务工厂,是生成Transaction对象实例的工厂,无需应用程序直接访问。负责对底层具体事务实现封装成hibernate事务。
7、
![](https://img.haomeiwen.com/i11977249/1cc08c2f92bbd5b9.png)
8、hibernate中怎么实现类之间的关系(一对一,多对多)?
类与类之间的关系主要体现在表与表之间的关系进行操作,都是对对象进行操作。
程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many。
9、JDBC、hibernate和Mybatis区别
【JDBC:较底层,对性能要求较高,流程是注册数据库驱动-->建立数据库连接-->建立statement,sql语句传给statement执行-->返回结果,则放到ResultSet对象中,遍历获取;
Hibernate:在JDBC基础上进行封装,对数据库进行完整性控制,是全自动ORM映射工具,数据库移植性好;将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化较困难;
Mybatis:在JDBC基础上进行封装,灵活使用sql语句,半自动ORM映射工具,需要收到编写sql完成查询关联对象或关联集合。将sql语句中的输入参数和输出参数映射为java对象,sql修改优化较方便。但MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。】
10、优化Hibernate所鼓励的7大措施:
1.尽量使用many-to-one,避免使用单项one-to-many
2.灵活使用单向one-to-many
3.不用一对一,使用多对一代替一对一
4.配置对象缓存,不使用集合缓存
5.一对多使用Bag 多对一使用Set
6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象
7.消除大表,使用二级缓存
Struts2:一种基于MVC的轻量级的web应用框架。
基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。
需要action类(model),包含execute()方法
![](https://img.haomeiwen.com/i11977249/932db4a171151c50.png)
xml文件为view:
![](https://img.haomeiwen.com/i11977249/1c1e6d856c2221ee.png)
struts.xml:(配置对应以上的action(model)和index.jsp(view))
![](https://img.haomeiwen.com/i11977249/141199b9312ad90d.png)
以及web.xml的配置。
struts2的工作流程:
1、浏览器发送请求到StrutsPrepareAndExecuteFilter
2、调用了execute()方法
3、xxxAction调用业务方法
4、Model组件返回业务结果
5、xxxAction返回逻辑视图名
6、转发到视图页面
7、生成响应内容
8、输出响应。、
struts2的工作原理:
客户端发送请求
经过一系列的过滤器
FilterDispatcher通过ActionMapper来决定这个REquest需要调用的Action
FilterDispather交给ActionProxy
通过ConfigurationManager询问struts.xml找到对应的Action
ActionProxy创建一个ActionInvocation实例
调用Action Action执行完毕ActionInvocation负责根据struts.xml中的配置找到对应的返回结果
SSM框架:
SpringMVC 作为表现层,Spring作为业务层,Spring data作为持久层。
springMVC和struts2的对比:
1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
2、springmvc基于方法开发(一个url对应一个方法),也就是一个方法对应于一个请求,属于方法拦截,请求的数据方法不共享,可以设计单例或多例(主要单例)。struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
4. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
dao层和model层区别:
dao是数据持久化层,负责数据库操作,model负责数据模型。
AJAX是什么? 描述ajax的原理
答:Ajax又叫异步刷新,(JavaScript和xml)原理:使用HttpRequest向服务器发送异步请求,服务器返回处理结果。
hibernate多对一:
保存数据最好通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!
![](https://img.haomeiwen.com/i11977249/86bbef56a090da8d.png)
多的一方:
![](https://img.haomeiwen.com/i11977249/33dd0e69d0c297ec.png)
一的一方:
![](https://img.haomeiwen.com/i11977249/917c8a7acd20eabc.png)
Dept.hbm.xml配置:
![](https://img.haomeiwen.com/i11977249/8fc115922abd9ba2.png)
测试时建议多的一方操作:
![](https://img.haomeiwen.com/i11977249/ca73a62986e2f2c8.png)
SSM和SSH不同主要在MVC实现方式,以及ORM持久化方面不同(Hiibernate与Mybatis)。SSM越来越轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便;而SSH较注重配置开发,其中的Hiibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛稍高。
网友评论