点击上方“蓝色字体”,选择“设为星标”,
可以防止走失!
1什么是框架?
框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。
IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。
1)框架本身一般不完整到可以解决特定问题,但是可以帮助您快速解决特定问题;
没有框架所有的工作都从零开始做,有了框架,为我们提供了一定的功能,我们就可 以在框 架的基础上开发,极大的解放了生产力。
不同的框架,是为了解决不同领域的问题。一定要为了解决问题才去学习框架。
2)框架天生就是为扩展而设计的;
3)框架里面可以为后续扩展的组件提供很多辅助性、支撑性的方便易用的实用工具(utilities),也就是说框架时常配套了一些帮助解决某类问题的库(libraries)或工具(tools)。
java中就是一系列的jar包,其本质就是对jdk功能的扩展.
2 说一下Spring中的两大核心?
Spring是什么?
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。spring两大核心如下:
1)IOC(Inversion of Control )或DI(Dependency Injection)
IOC控制权反转
原来:我的Service需要调用DAO,Service就需要创建DAO
Spring:Spring发现你Service依赖于dao,就给你注入.
核心原理:就是配置文件+反射(工厂也可以)+容器(map)
2)AOP:面向切面编程
核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
我们主要使用AOP来做:
1、事务处理
2、权限判断
3、日志
4、....
3 说一下Spring中都用到了哪些常见的设计模式?
单例:spring中默认注册bean都是单例。通过Map缓存实现
工厂模式:spring容器本身就是一个bean工厂
动态代理模式:AOP的底层就是基于动态代理实现的
其他设计模式
4 在Spring中怎么把bean注册为多例?
1)Xml版本:
2)注解版本:
@Scope("prototype")
5 同一个接口或父类有两个子类都在spring中,怎么注入特定的bean?
1)伪代码如下:
@Autowired
private 父类/接口 名称
以上代码会报错,因为按照类型注入,出现了两个bean,故而报错!expected single matching bean but found 2: beanB1,beanB2
2)解决方案
解决方案1:
@Autowired
@Qualifier("beanname")
private 父类/接口 名称
解决方案2:
@Resource("beanname")
private 父类/接口 名称
6 javaconfig概述
java config是指基于java配置的spring。传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多java config的注解,特别是spring boot,基本都是清一色的java config。
1)@Configuration
在类上打上这一标签,表示这个类是配置类
2)@ComponentScan
相当于xml的
3@Bean
bean的定义,相当于xml的
ObjectMapper" />
3)@EnableWebMvc
相当于xml的
4)@ImportResource
相当于xml的
5)@PropertySource
spring 3.1开始引入,它是基于java config的注解,用于读取properties文件
6)@Profile
spring3.1开始引入,一般用于多环境配置,激活时可用@ActiveProfiles注解,@ActiveProfiles("dev")
等同于xml配置
激活该profile spring.profiles.active,也可设置默认值 spring.profiles.default
spring.profiles.default
dev
7 Spring中怎么配置事务
1)声明式(xml):
TransationManager
Advisor
PointCUt:通过切面应用通知.
2)注解式:
TransationManager
打注解@Transational
扫描注解
8讲一下Spring的事务传播特性
1)多个事务存在是怎么处理的策略
1.PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启 2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行 3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。 4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。 6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常 7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如 果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
2)spring中配置Propagation
Required 需要 如果存在一个事务,则支持当前事务。如果没有事务则开启
Supports 支持 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
Mandatory 必要的 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
required_new 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
Not_support 总是非事务地执行,并挂起任何存在的事务。
Never 绝不 总是非事务地执行,如果存在一个活动事务,则抛出异常
Nested 嵌套的 如果有就嵌套、没有就开启事务
9 Spring事务的隔离级别 1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。 3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
其中的一些概念的说明:
脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一 个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。 那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及 到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
10 MVC模式
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
最简单的、最经典就是Jsp(view) +Servlet(controller) + JavaBean(model)
1、当控制器收到来自用户的请求
2、控制器调用JavaBean完成业务
3、完成业务后通过控制器跳转JSP页面的方式给用户反馈信息
4、Jsp个 用户做出响应。
控制器都是核心
11 MVC框架
什么是MVC框架?
是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的一些问题而出现的框架。
传统MVC模式问题
1、所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理。
2、Servlet的主要功能就是接受参数、调用逻辑、跳转页面,比如像其他字符编码、文件上传等功能也要写在Servlet中,不能让Servlet主要功能而需要做处理一下特例。
3、接受参数比较麻烦(String name = request.getParameter(“name”),User user=new User user.setName(name)),不能通过model接收,只能单个接收,接收完成后转换封装model.
4、跳转页面方式比较单一(forword,redirect),并且当我的页面名称发生改变时需要修改Servlet源代码.
现在比较常用的MVC框架有:
struts
webwork
Struts2
Spring MVC
12 简单讲一下SpringMVC的执行流程?
①用户发送请求到达核心控制器DIspatcherServlet
②通过HandlerMapping找到对应Handler的链.(里面包含Controller&相关拦截器)
③通过HandlerAdapter执行对应控制器返回ModelAndView
④通过ViewResover配置ModelAndView找到对应页面
⑤把页面和Model渲染为整体页面返回给用户
快速记忆技巧:
核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回
13 多线程用过么?
没有用过.我们都是做java web开发,都被Tomcat封装,一个请求就是一个线程.
但是基本的线程技能还是ok的。所一下创建线程的方式。
14 Servlet,Struts2 Action,Spring MVC Controller哪些是线程安全的?不安全,怎么解决?
1)Struts2 Action是安全的,它是多例,而且配置Spring要配置多列scope=”prototype”
2)Servlet,Spring MVC Controller 是线程不安全,因为是单例.如果要保证线程安全就不要作为成员变量.如果硬是要做就使用ThreadLocal
15什么是ORM?
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。
这种方案存在以下不足:
1.持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化曾的相关程序代码,增加了软件的维护难度。
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM框架有:Hibernate,ibatis(mybatis),speedframework。
ORM的方法论基于三个核心原则:
简单:以最基本的形式建模数据。
传达性:数据库结构被任何人都能理解的语言文档化。
精确性:基于数据模型创建正确标准化了的结构。
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。可以简单的方案是采用硬编码方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。这种方法存在很多缺陷,使用
使用ORM框架(为了解决解决面向对象与关系数据库存在的互不匹配的现象的框架)来解决.
Hibernate,ibatis(mybatis),
16 iBatis(mybatis)与Hibernate有什么不同?
1相同点:
都是java中orm框架、屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。jdbc api编程流程固定,还将sql语句与java代码混杂在了一起,经常需要拼凑sql语句,细节很繁琐。
ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能.queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。
Hibername的好处:Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,并执行并返回java结果。
2 不同点:
1、hibernate要比ibatis功能强大很多。因为hibernate自动生成sql语句。
2、ibatis需要我们自己在xml配置文件中写sql语句,hibernate我们无法直接控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。
ibatis可以出来复杂语句,而hibernate不能。
3、ibatis要比hibernate简单的多。ibatis是面向sql的,不同考虑对象间一些复杂的映射关系。
17 MyBatis中#和$区别?
1)#是占位符,最终会替换为?,有点像Preparedstatement,最终要要设置参数.
2)$直接拼接字符串,sql注入安全问题.分组排序
Preparedstatement&statement区别和联系
18 MyBatis怎么返回自增id
1) xml版本:
”id”>
2)注解版本:在@Insert注解上下加上
@Options(useGeneratedKeys=true, keyProperty=“id”, keyColumn=“id”)
19 mybatis中怎么中关联查询
在mybatis中做关联查询,首先需要在Domain中放入关联对象,然后可以使用标签做结果映射,并且处理方式有两种:
1)嵌套结果:
一条跨表查询语句查询出所有信息,通过ResultMap分别封装关联属性
2)嵌套查询:
1+N条,先发一条sql去查询本身,再发多条sql分别查询关联对象
接下来一多对一为例做展示:
1)嵌套结果
SELECT e.*, d.id did, d. NAME dname FROM t_employee e LEFT JOIN t_dept d ON e.dept_id = d.id |
2)嵌套查询
column="dept_id" select="cn.itsource.mybatis._05_many2one_select.EmployeeMapper.queryDeptById" > SELECT * from t_employee resultType="cn.itsource.mybatis._05_many2one_select.Dept"> SELECT * from t_dept where id = #{id} |
20 mybatis怎么做批量操作
在Mapper接口传输数组或者List数据,在Mapper.xml中使用进行遍历操作。
接下来以批量添加为例进行说明:
public void batchAdd(List products) { insert into product(productName,brand) VALUES (#{product.productName},#{product.brand}) |
21 Mybatis怎么做高级查询
高级查询其实就是多条件查询,很多条件可以进行组合就要对条件进行动态判断。在mybatis中有以下注解来支持高级查询的实现:
1)条件
2)判断是否满足条件
3)多个地方用到同样sql进行抽取
4)抽取完的sql进行导入
.....
具体参考代码如下:
and ( name like concat('%',#{keywords},'%') or password like '%${keywords}%' ) and age > #{minAge} and age < #{maxAge} ]]> parameterType="cn.itsource.mybatis._03_advanceQuery.query.EmployeeQuery" resultType="cn.itsource.mybatis._03_advanceQuery.domain.Employee"> SELECT * from t_employee |
22 mybatis怎么做分页-mysql
1)原生实现:
limit #{start},#{pageSize}
2)分页插件-PageHelper
PageHelper.startPage(pageNo, pagesize);
List list = userDao.finduserByInfo (user);
- end -
用心分享知识,做一个勤劳的攻城狮
每天记得对自己说:你是最棒的了吗?