1、MySQL
2、SQL语言
2.1基础教程
- SQL:是用于访问和处理数据库的标准的计算机语言。
- SQL:指结构化查询语言;使我们有能力访问数据库;是一种ANSI(美国国家标准化组织)的标准计算机语言。
- SQL对大小写不敏感!!!
- RDBMS:关系型数据库管理系统,它是SQL的基础。RDBMS中的数据存储在被称为表的数据库对象中。
- SQL分两个部分:数据操作语言DML和数据定义语言DDL。
- 查询和更新指令构成了SQL的DML部分: select、update、delete、insert into
- SQL的数据定义语言DDL部分使我们有能力创建和删除表格。
- create database创建新数据库
- alter database修改数据库
- create table 创建新表
- alter table 修改数据库表
- drop table 删除表
- create index 创建索引
- drop index 删除索引
- order by:用于对结果集进行排序
2.2SQL高级教程
- TOP子句:用户规定要返回的记录的数目。并非所有的数据库系统都支持Top子句。
- 通配符
- IN:允许在where子句中规定多个值
- between
- alias:别名。可以为列名称或表名称指定别名Alias.
- join:用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
- union:用于合并两个或更多select语句的结果集。union内部的select语句必须拥有相同数量的列。列也必须拥有相似的数据类型,同时每条select语句中的列的顺序必须相同。【注:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。】
- select into:从一个表中选取数据,然后把数据插入另一个表中;该语句常用于创建表的备份复件或用于对记录进行存档。
- contraints:约束,用于限制加入表的数据的类型。可以在建表时规定约束(create table语句),或者在表创建之后(alter tableyuju )
- not null :不接受null值。约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
- unique :约束唯一标识数据库表中的每条记录。为列或列集合提供了唯一性的保证。 撤销unique约束,drop index 约束名
- primary key: 拥有自动定义的 UNIQUE 约束。主键必须包含唯一的值,不能包含null值。每个表都应该有一个主键,并且每个表只能由一个主键。
- foreign key
- check
- default
- create index
- drop:撤销索引、表以及数据库
- alter
- increment
- view
- date
- null:它是遗漏的未知数据。无法比较null和0;他们不等价。
- isnull()
- 数据类型
- 服务器
2.3SQL函数
- avg():返回均值,null值不包括在计算中。
- count():返回匹配指定条件的行数。null值不计入。
- first():
返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL FIRST() 语法
SELECT FIRST(column_name) FROM table_name
- last():
LAST() 函数返回指定的字段中最后一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL LAST() 语法
SELECT LAST(column_name) FROM table_name
- max():
返回一列中的最大值。NULL 值不包括在计算中。
SQL MAX() 语法
SELECT MAX(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
- min():
返回一列中的最小值。NULL 值不包括在计算中。
SQL MIN() 语法
SELECT MIN(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
- sum():
返回数值列的总数(总额)。
SQL SUM() 语法
SELECT SUM(column_name) FROM table_name
- group by:用于结合合计函数,根据一个或多个列对结果集进行分组。
- having:在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
- ucase():
把字段的值转换为大写。
SQL UCASE() 语法
SELECT UCASE(column_name) FROM table_name
- lcase():
把字段的值转换为小写。
SQL LCASE() 语法
SELECT LCASE(column_name) FROM table_name
- mid():
用于从文本字段中提取字符。
SQL MID() 语法
SELECT MID(column_name,start[,length]) FROM table_name
参数 描述 column_name 必需。要提取字符的字段。 start 必需。规定开始位置(起始值是 1)。 length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 - len():
返回文本字段中值的长度。
SQL LEN() 语法
SELECT LEN(column_name) FROM table_name
- round():
用于把数值字段舍入为指定的小数位数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name
参数 描述 column_name 必需。要舍入的字段。 decimals 必需。规定要返回的小数位数。 - now():
返回当前的日期和时间。
提示:如果您在使用 Sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间。
SQL NOW() 语法
SELECT NOW() FROM table_name
- format():
用于对字段的显示进行格式化。
SQL FORMAT() 语法
SELECT FORMAT(column_name,format) FROM table_name
参数 描述 column_name 必需。要格式化的字段。 format 必需。规定格式。
3、数据结构
4、jsp,servlet,jdbc
5、spring 框架
1、什么是Spring的IoC?Spring IoC对于JavaBean的创建有哪几种方式?
- IoC:inversion of control控制反转。
- 控制指的是对实现类的控制;
- 反转指的是这种控制权从调用类中移除,交给第三方决定。即某一接口具体实现类的选择控制权哦空调用类中移除,转交给第三方决定。
- DI:Dependency Injection依赖注入,让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。
- 有三种依赖注入:
- 接口注入
- setter方法注入
- 构造方法注入
2、链接:https://www.nowcoder.com/questionTerminal/82256496e1c94bf3b08a448509b52f17
Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,Spring中包含的关键特性:
- 1.强大的基于JavaBeans的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
- 2.一个可用于从applet到Java EE等不同运行环境的核心Bean工厂。
- 数据库事务的一般化抽象层,允许声明式(Declarative)事务管理器,简化事务的划分使之与底层无关。
- 3.内建的针对JTA和单个JDBC数据源的一般化策略,使Spring的事务支持不要求Java EE环境,这与一般的JTA或者EJB CMT相反。
- 4.JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量。再次利用JDBC时,你无需再写出另一个'终止'(finally)模块。并且面向JDBC的异常与Spring通用数据访问对象(Data Access Object)异常等级相一致。
- 5.以资源容器,DAO实现和事务策略等形式与Hibernate,JDO和iBATIS SQL Maps集成。利用众多的翻转控制方便特性来全面支持,解决了许多典型的Hibernate集成问题。所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范。
- 6.灵活的基于核心Spring功能的MVC网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如JSP、FreeMarker、Velocity、Tiles、iText以及POI。值得注意的是,Spring中间层可以轻易地结合于任何基于MVC框架的网页层,例如Struts、WebWork或Tapestry。
- 7.提供诸如事务管理等服务的面向方面编程框架。
- 另外,Spring并没有提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。
- spring没有提供AOP方式的日志系统
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
Spring通过对AOP的支持,借助log4j等Apache开源组件实现了日志系统。
3、链接:https://www.nowcoder.com/questionTerminal/0e77762752484ed2ab16281cdace53f7
来源:牛客网
@Transactional:Spring提供了基于注解的事务配置,即通过@Transactional对需要事务增强的Bean 接口,实现类或方法进行标注;在容器中配置基于注解的事务增强驱动,即可启用基于注解的声明式事务。一般开 启注解装配之后多才采用这种方式。
@Serivce: 用于Service实现类进行标识
@Autowired:默认是按类型 (byType)匹配的方式在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标 注的变量中。
4、Spring中有两种事务,一种是声明式事务,一种是编程式事务。
所谓的声明式事务即为在配置文件中配置,无需程序员手动编程控制事务,也就是说数据库的事务的开启,提交都是框架帮助我们做好的,
然而,编程式事务,是需要在方法中加入Spring的事务API 例如hibernate中的 beginTransaction() commit() rollback。。。
链接:https://www.nowcoder.com/questionTerminal/84b466dd256148d29dd0d88aac10e661
来源:牛客网
1. 声明式事务@Transactional
@Transactional注解是一个用来定义一个接口、类或者方法必须具备事务化语义的元数据; 例如, " 在调用 该方法时挂起所有已经存在的事务,开始一个新的只读事务 ". 下面是@Transactional注解的默认设置:
-
传播设置是PROPAGATION_REQUIRED.
-
隔离等级是ISOLATION_DEFAULT.
-
事务是可读可写的.
-
事务超时是使用底层事务系统的默认值, 或者在不支持时没有.
-
任何的RuntimeException触发回滚, 并且所有的检查的Exception不触发.
这些默认设置都是可以修改的。
2. 编程式事务
Spring Framework提供了两种方式的编程式事务管理:
-
使用TransactionTemplate.
-
直接使用PlatformTransactionManager的一个实现.
Spring一般都推荐使用TransactionTemplate来进行编程式事务管理. 第二种方式有点类似于使用JTA的 UserTransaction接口, 尽管异常处理没有那么复杂化了.
5、链接:https://www.nowcoder.com/questionTerminal/eecc80438fab4c3ca41b48bdf3e5af76
来源:牛客网
A、延迟加载有2种方法:一是hibernate提供的延迟载入机制;二是Spring框架提供的DAO模式结合Hibernate延迟加载的Web方案。故A错;
B、spring可以 在配置文件中 配置Bean初始化函数和消亡函数,故B对;
C、spring可以注入复杂的数据类型比如对象、数组、List集合、map集合、Properties等,故C错;
D、对象之间的耦合越高,维护成本越高。对象的设计应使类和构件之间的耦合最小,故D对.
6、Spring特性中IoC的描述:
链接:https://www.nowcoder.com/questionTerminal/a3e391f4487a43b2b5aa56fe7dea4d86
来源:牛客网
spring本身不包含连接池的实现,只有连接池相关配置,配置时选择当前的连接池技术,如:C3P0、DBCP、Proxool等等。spring技术内幕和源码解析里面讲到的也只有jdbc和事务的实现代码,没说到有连接池的实现代码。连接池是一个独立的技术,提供通用的接口,跟spring没有直接关系,spring只是去使用它。
7、链接:https://www.nowcoder.com/questionTerminal/d02f8b4995de4314b29756898d62377b
来源:牛客网
控制反转即IoC (Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
链接:https://www.nowcoder.com/questionTerminal/d02f8b4995de4314b29756898d62377b
来源:牛客网
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它。所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。这种现象就称作控制反转,即应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。虽然平时只需要按要求将bean配置到配置文件中,但是了解其实现过程对理解spring的实现原理是有好处的
8、链接:https://www.nowcoder.com/questionTerminal/15a92560e4634f73a33933f2128c0743
来源:牛客网
SpringMVC的原理:
SpringMVC是Spring中的模块,它实现了mvc设计模式的web框架,首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。
DispatcherServlet作为springMVC的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户。
实现业务操作时在service层
链接:https://www.nowcoder.com/questionTerminal/15a92560e4634f73a33933f2128c0743
来源:牛客网
DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3、 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
9、链接:https://www.nowcoder.com/questionTerminal/982a92bd679048a0bddc5a1f542fbe25
来源:牛客网
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。 简化 DAO 组件的开发。 Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。 IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。 面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。 方便的事务管理: Spring的声明式事务管理力度是方法级。 异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
10、链接:https://www.nowcoder.com/questionTerminal/0ae7fe7ffb2345fba9c967eb18af0d5c
来源:牛客网
<!-- 配置事务管理器 -->
<property name="transactionManager">
<!-- 配置事务属性 -->
<property name="transactionAttributes"> <props>
声明式事务 管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
11、在Spring框架中获取连接池可以有哪些方式?
链接:https://www.nowcoder.com/questionTerminal/36c33ffaf862481491e825465b05952a
来源:牛客网
四种方式,如下:
1:DBCP数据源
DBCP类包位于 <SPRING_HOME>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池,所以在类路径下还必须包括<SPRING_HOME>/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置oracle数据源的配置片断:
<bean id=”dataSource”
class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>
<property name=”driverClassName”
value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl ” />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>
2:C3P0数据源
C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的Connection 和Statement 池。C3P0类包位于<SPRING_HOME>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个Oracle数据源:
<bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource” destroy-method=”close”>
<property name=”driverClassName”
value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl ” />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>
3. Spring的数据源实现类(DriverManagerDataSource)
Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试或简单的独立应用中使用,因为它不需要额外的依赖类。
<bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource” destroy-method=”close”>
<property name=”driverClassName”
value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl ” />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>
4.获取JNDI数据源
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:
<bean id=”dataSource”
class=”org.springframework.jndi.JndiObjectFactoryBean”>
<property name=”jndiName” value=”java:comp/env/jdbc/oracle”/>
</bean>
通过jndiName指定引用的JNDI数据源名称。
12、链接:https://www.nowcoder.com/questionTerminal/a1644e2668f94ab78bfefa38808fb006
来源:牛客网
spring依赖注入有如下几种方式:
①setter方式注入(设值注入)
②构造器方式注入
Spring支持利用构造器注入参数实例化Bean方式。只要在Spring的配置文件中增加构造器参数constructor-arg
Spring就会自动的调用有参数的构造器创建bean对象实例, 整个过程无需程序编码只需要配置applicationContext.xml文件即可
③自动装配功能实现属性自动注入
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,autowire可以针对单个bean进行设置,
autowire的方便之处在于减少xml的注入配置。
在xml配置文件中,可以在<bean/>元素中使用autowire属性指定自动装配规则,一共有五种类型值:
13、链接:https://www.nowcoder.com/questionTerminal/368e4ea434824a24900320ce5ad17cdc
来源:牛客网
Bean的创建时会提到Spring的单例模式,就是说默认情况下Spring中定义的Bean是以单例模式创建的。如果以前了解设计模式中的单例模式的话很容易对这种说法产生先入为主的印象。事实上,Spring中的单例模式还有许多需要注意的地方。
在GoF中的单例模式是指一个ClassLoader中只存在类一个实例。
而在Spring中的单例实际上更确切的说应该是:
1.每个Spring Container中定义的Bean只存在一个实例
2.每个Bean定义只存在一个实例。
14、Spring框架中的核心思想包括什么?
依赖注入、控制反转、面向切面。
15、Spring框架描述
链接:https://www.nowcoder.com/questionTerminal/47eab405848d4de2b8ac4e5f26823028
来源:牛客网
七大模块,如下:
1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
2.Spring Context: 构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。
3.Spring DAO: DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。
4.Spring ORM: ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
5.Spring AOP: Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。
6.Spring Web: Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。
7.Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。
16、链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4
来源:牛客网
事务属性的种类: 传播行为、隔离级别、只读和事务超时
a) 传播行为定义了被调用方法的事务边界。
传播行为 | 意义 |
PROPERGATION_MANDATORY | 表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常 |
PROPAGATION_NESTED | 表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样 |
PROPAGATION_NEVER | 表示方法不能运行在一个事务中,否则抛出异常 |
PROPAGATION_NOT_SUPPORTED | 表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起 |
PROPAGATION_REQUIRED | 表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务 |
PROPAGATION_REQUIRES_NEW | 表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起 |
PROPAGATION_SUPPORTS | 表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中 |
b) 隔离级别
在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:
隔离级别 | 意义 |
ISOLATION_DEFAULT | 使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED | 允许读取未提交的数据(对应未提交读),可能导致脏读、不可重复读、幻读 |
ISOLATION_READ_COMMITTED | 允许在一个事务中读取另一个已经提交的事务中的数据(对应已提交读)。可以避免脏读,但是无法避免不可重复读和幻读 |
ISOLATION_REPEATABLE_READ | 一个事务不可能更新由另一个事务修改但尚未提交(回滚)的数据(对应可重复读)。可以避免脏读和不可重复读,但无法避免幻读 |
ISOLATION_SERIALIZABLE | 这种隔离级别是所有的事务都在一个执行队列中,依次顺序执行,而不是并行(对应可序列化)。可以避免脏读、不可重复读、幻读。但是这种隔离级别效率很低,因此,除非必须,否则不建议使用。 |
c) 只读
如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。
如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。
d) 事务超时
如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。
17、链接:https://www.nowcoder.com/questionTerminal/8d5313cc176545b99ccc5fcaf512abc2
来源:牛客网
Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类。事实上,Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。二者对Bean的初始化也有很大区别。BeanFactory当需要调用时读取配置信息,生成某个类的实例。如果读入的Bean配置正确,则其他的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,如果配置文件没有错误,就创建所有的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
BeanFactory和ApplicationContext的异同点:
相同点:两者都是通过xml配置文件加载bean,ApplicationContext和BeanFacotry相比,提供了更多的扩展功能。
不同点:BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext
链接:https://www.nowcoder.com/questionTerminal/8d5313cc176545b99ccc5fcaf512abc2
来源:牛客网
* 1.首先本身BeanFactory创建的实例是多例的,即用时才创建Bean实例
* 2.我们的ApplicationContext是BeanFactory的子接口,其默认情况下是单例模式,即随着配置文件的解析就创建实例
* 但是在该子接口可以通过配置来实现指定Bean实例的创建时机,即使用作用域范围Scope指定,不仅仅限制于单例模式多例模式,
* 还涉及到request/session/application/websocket
*
* 单例模式下:1.加载配置文件解析配置文件的时候会触发init函数的执行,
* 2.在工厂容器销毁的时候会触发destroy方法的执行,
* 多例模式下:1.加载配置文件解析配置文件的时候不会触发init的函数的执行,
* 2.在bean创建的时候,会触发init函数执行,并且在工厂容器销毁的时候并没有执行destroy方法
* 总结:在单例模式下:在解析文件的时候就会创建bean的实例,并且其销毁伴随着容器的销毁,容器销毁会触发实例的销毁
* 在多例模式下:在解析文件的时候不会创建bean的实例,而是在使用的时候采取创建,实例的销毁时机并不会伴随着容器的销毁而销毁,而是Java中的GC进行销毁
18、简述spring的事务传播行为和隔离级别
链接:https://www.nowcoder.com/questionTerminal/afc26f224d5843048d879dbca10d2cb0
来源:牛客网
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
Spring 的隔离级别
1、Serializable:最严格的级别,事务串行执行,资源消耗最大;
2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了”脏读取”和”不可重复读取”的情况,但是带来了更多的性能损失。
3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了”脏读取”。该级别适用于大多数系统。
4、Read Uncommitted:保证了读取过程中不会读取到非法数据。
19、链接:https://www.nowcoder.com/questionTerminal/4a0c73cf745e413a831b0859c79df67e
来源:牛客网
IOC:Inversion of Control,控制反转。在Java开发中,IOC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制创建、销毁现在转变成由Spring的容器管理。
20、简述AOP基本概念(Advice、Joinpoint、Polntcut、Aspect)以及在Spring AOP实现的特点和局限。
链接:https://www.nowcoder.com/questionTerminal/73e65d40db1849aaa348152a47781bb3
来源:牛客网
Advice:用于定义拦截行为
JoinPoint:提供访问当前被通知方法的目标对象、代理对象、方法参数等数据
Polntcut:捕获所有的连接点在指定的方法执行中,包括执行方法本身
Aspect:切入点指示符用来指示切入点表达式目的。
21、链接:https://www.nowcoder.com/questionTerminal/beccf26c0c8f439c97b050945fa6ee6b
来源:牛客网
A:javax.servlet.http.HttpServletRequest接口不存在sendRedirect方法
D:javax.servlet.ResponseDispatcher接口不存在forward方法
HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如 response.sendRedirect("http://java.sun.com")也可以使用相对的URL,是请求转发,前后页面共享一个request 。将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。
RequestDispatcher.forward()方法将当前的request和response重定向到该 RequestDispacher指定的资源。是重新定向,前后页面不是一个request。
链接:https://www.nowcoder.com/questionTerminal/beccf26c0c8f439c97b050945fa6ee6b
来源:牛客网
重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。 转发和重定向的区别 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
22、述你所了解的MVC各层次的常用开发框架, 说明其特点。
链接:https://www.nowcoder.com/questionTerminal/a79dd88c9aff467e9678b2d39be7da1f
来源:牛客网
MVC的优点 大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。 首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快速变化下,可能有多种方式访问应用的要求。例如,订单模型可能有本系统的订单,也有网上订单,或者其他系统的订单,但对于订单的处理都是一样,也就是说订单的处理是一致的。按MVC设计模式,一个订单模型以及多个视图即可解决问题。这样减少了代码的复制,即减少了代码的维护量,一旦模型发生改变,也易于维护。 其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。 再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此,控制层可以说是包含了用户请求权限的概念。 最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。 MVC的不足 MVC的不足体现在以下几个方面: (1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 (2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 (3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 (4) 目前,一般高级的界面工具或构造器不支持MVC架构。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
23、链接:https://www.nowcoder.com/questionTerminal/7e7a1b5c85de41e4b28eb0bb6b8b8e2c
来源:牛客网
ActionServlet类是Struts框架的内置核心控制器组件
springmvc的中心控制Servlet是DispatcherServlet
AbstractController是WebContentGenerator的子类,并实现了Controller接口。AbstractController是最重要的Controller接口实现之一
FacesServlet类是前端控制器部分
24、链接:https://www.nowcoder.com/questionTerminal/ef7616fe1ab7459fbcdac09de5519fd5
来源:牛客网
sendRedirect ( ):重定向,让客户完成工作,即地址栏发生改变,可以转向外部资源。 该方法参数为String。使用相对URL作为参数。带/的相对原先的URL建立完整URL。不带/的相对Web应用建立。
forward ( ):请求分派,服务器的内部转发,对客户是透明的(地址栏不发生改变)。
链接:https://www.nowcoder.com/questionTerminal/ef7616fe1ab7459fbcdac09de5519fd5
来源:牛客网
转发是服务器行为,重定向是客户端行为
转发过程:客户浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。