MyBatis中使用#和$书写占位符有什么区别?
答:#是占位符,$是拼接 $容易发生注入攻击,能用#的不要用$
MyBatis中命名空间(namespace)的作用
答:类似于C#或者C++中的命名空间的作用,大型项目中为每一个sql语句起一个唯一的标识(ID)很容易冲突,为了解决这个问题,MyBatis中,为每一个映射文件确定一个命名空间,这样定义在这个映射文件中的sql语句只要保证在这个命名空间中唯一就行了.
MyBatis中的动态SQL是什么意思?
答:对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在. 例如在58同城上面找房子,我们可能会指定面积、楼层和所在位置来查找房源,也可能会指定面积、价格、户型和所在位置来查找房源,此时就需要根据用户指定的条件动态生成SQL语句。如果不使用持久层框架我们可能需要自己拼装SQL语句,还好MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有:
if choose / when / otherwise trim where set foreach
映射片段如下
什么是IoC和DI?DI是如何实现的?
ICO是反转控制,是一种思想.将生成对象这一过程交给容器(Spring),我们需要对象的时候直接找容器要.DI 依赖注入,是ICO的一种实现方式,依赖注入可以通过setter方法注入(设值注入)、构造器注入和接口注入三种方式来实现
Spring中Bean的作用域有哪些?
答:在早期版本中有singleton(单例)和prototype(原型),singleton单例是指,每次向容器要对象时,都是同一个对象,prototype(原型)是指每次问容器要对象时都是新的对象
Spring 2.x WebApplicationContext中新增了三个作用域,分别是:request(每次HTTP请求都会创建一个新的Bean)、session(同一个HttpSession共享同一个Bean,不同的HttpSession使用不同的Bean)和globalSession(同一个全局Session共享一个Bean)。
解释一下什么叫AOP(面向切面编程)?
切面编程,也是一种程序思想,用于统一处理,如处理页面乱码,事务添加等
Spring中自动装配的方式有哪些?
(1)no:不进行自动装配,手动设置Bean的依赖关系。
(2)byName:根据Bean的名字进行自动装配。
(3) byType:根据Bean的类型进行自动装配。
(4)constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
(5)autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。
Spring中如何使用注解来配置Bean?有哪些相关的注解?
答:首先配置扫描那些地方,通常配置扫描包
然后可以用@Component(普通类)、@Controller(控制类)、@Service(业务逻辑类)、@Repository(仓储类)注解来标注需要由Spring IoC容器进行对象托管的类。
Spring支持的事务管理类型有哪些?你在项目中使用哪种方式?
声明式事务管理和编程式事务管理 通常使用声明式事务管理 耦合较少, 但编程式事务灵活; 事务又分为全局事务和局部事务,全局事务由应用服务器管理,需要底层服务器JTA支持,局部事务和底层采用的持久化方案有关
Spring MVC的工作原理是怎样的?
(1)客户端所有请求交给前端控制器处理,它负责调用系统其他模块来出来系统真正的请求.
(2) 前端控制器根据请求信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)调用处理器映射器对请求进行封装
(3)之后调用处理器适配器,由处理器适配器调用真正的处理器(需要程序员自己开发)
(4)结果返回之后调用视图解析器,再进行视图渲染,返回给客户
Spring MVC的主要组件?(6)
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
(6)视图解析器 ViewResolver(不需要程序员开发)
三大组件 处理器映射器 处理器适配器 视图解析器
Spring IoC容器配置Bean的方式?
XML配置 注解配置
Spring框架中Bean的生命周期?
① Spring IoC容器找到关于Bean的定义并实例化该Bean。
② Spring IoC容器对Bean进行依赖注入。
③ 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
④ 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
⑤ 如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。
⑥ 如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。
⑦ 如果有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。
⑧ 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
在Web项目中如何获得Spring的IoC容器?
WebApplicationContext ctx =WebApplicationContextUtils.getWebApplicationContext(servletContext);
springMVC和struts2的区别有哪些?
(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成
如何解决POST请求中文乱码问题,GET的又如何处理呢?
(1)post请求乱码问题:在 web.xml中添加一个CharacterEncodingFilter过滤器,设置成utf-8;
(2)get请求中文参数出现乱码解决方法有两个:修改tomcat配置文件添加编码与工程编码一致;另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
Spring MVC的异常处理 ?
将异常抛给Spring框架,由spring框架处理,我们只需配置异常处理器即可,在异常处理器中添加视图页面
SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
SpringMVC常用的注解有哪些?
@RequestMapping:用于处理请求url映射的注解,用于方法或者用于类上
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
@PathVariable: 将请求URL中的模板变量映射到功能处理方法的参数上
@ModelAttribute @SessionAttributes : 取url中的参数值的
@RequestParam,将请求的参数绑定到方法中的参数上
SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
答:一般用@Conntroller注解,表示是表现层,不能用别的注解代替。
如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
答:可以在@RequestMapping注解里面加上method=RequestMethod.GET。 POST方法类时
怎样在方法里面得到Request,或者Session?
答:直接在方法的形参中声明request,SpringMvc就自动把request对象传入。
SpringMvc中函数的返回值是什么?
答:返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
MyBatis与Hibernate有哪些不同?
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
(2)Mybatis直接编写原生态sql,可以严格控制sql,使用灵活。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
(1):通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
(2): 通过来映射字段名和实体类属性名的一一对应的关系。
通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
(1)Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。
(2)Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中,每一个、、、标签,都会被解析为一个MapperStatement对象。
(3)Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。
(4)Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。
Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。!
Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
在mapper中如何传递多个参数?
(1) dao层函数中多个参数:对应的 xml中#{0}代表第一个参数 #{1}代表第二个参数
(2)参数封装成map
Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
< resultMap>、< parameterMap>、< sql>、< include>、< selectKey>,加上动态sql的9个标签,其中< sql>为sql片段标签,通过< include>标签引入sql片段,< selectKey>为不支持自增的主键生成策略标签。
MyBatis实现一对一有几种方式?具体怎么操作的?
有联合查询和嵌套查询,
联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。
MyBatis实现一对多有几种方式,怎么操作的?
有联合查询和嵌套查询。
联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。
Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
Spring 的常用注解
控制反转
@Component,标注为一个普通的bean
@Service,@Repository
依赖注入
@Autowired
@Qulifier
@Resource 不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。
@Value
全局
@Configuration,代替配置文件,相当于beans
@ComponentScan,配置扫描包
@Scope,配置bean的生命周期
Spring 中的设计模式
代理模式—在AOP和remoting中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
前端控制器—Spring提供了DispatcherServlet来对请求进行分发。
视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。
工厂模式—BeanFactory用来创建对象的实例。
Mybatis 的使用步骤是什么样的?
BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
(1)BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
(2)①BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean())。
(3)ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。
Spring Bean的生命周期?
Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
解释一下Spring AOP里面的几个名词:
(1)切面(Aspect):被抽取的公共模块,可能会横切多个对象。
(2)连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。
(3)通知(Advice):在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知
(4)切入点(Pointcut):切入点是指 我们要对哪些Join point进行拦截的定义。
(5)引入(Introduction):声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。
(6)目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。
(7)织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。
Mybatis是否可以映射Enum枚举类?
答:可以 映射方式为自定义一个TypeHandler,实现TypeHandler的setParameter()和getResult()接口方法。
如何获取自动生成的(主)键值?
insert 方法总是返回一个int值 ,这个值代表的是插入的行数。
如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。
insert into names (name) values (#{name})
简单的说一下MyBatis的一级缓存和二级缓存?
一级缓存的作用域是SqlSession范围的,默认开启,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存.
二级缓存是mapper级别的缓存。在配置文件中开启;使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的。
SpringMVC怎么样设定重定向和转发的
在返回值前面加”forward:”就可以让结果转发,譬如”forward:user.do?name=method4” 在返回值前面加”redirect:”就可以让返回值重定向,譬如”redirect:http://www.baidu.com”
SpringMvc怎么和AJAX相互调用的
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象
具体步骤如下
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
SpringMvc里面拦截器是怎么写的
有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器
Spring框架分为哪七大模块?
(1)Spring Core(核心容器):最基础部分,提供IOC和依赖注入特性。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。
(2)Spring Context(上下文):是一个配置文件,向 Spring 框架提供上下文信息
(3)Spring DAO:提供了JDBC的抽象层
(4)Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
(5)Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。
(6)Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。
(7)Spring Web MVC:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。
spring三大核心组件
Bean组件:Bean组件在Spring中的Beans包下,IOC功能的核心.
Context组件:为Spring提供运行环境,用以保存各个对象状态。
Core组件:他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习
Spring中 @Autowired注解与@Resource注解的区别
相同点:
@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
不同点:
1)提供方:@Autowired是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
2)注入方式:@Autowired只按照byType 注入;@Resource默认按byName自动注入,也提供按照byType 注入;
3)属性:@Autowried按类型装配依赖对象,默认情况下以来对象必须存在,如果允许null存在,可以设置required属性值为false, @Resource有两个属性:name和type @Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
参考:
https://blog.csdn.net/qq_33082731/article/details/75066956
https://blog.csdn.net/a745233700/article/details/80959716
https://blog.csdn.net/qq_41541619/article/details/82459873 https://blog.csdn.net/a745233700/article/details/80977133
https://blog.csdn.net/jackfrued/article/details/44931161
https://blog.csdn.net/a745233700/article/details/80963758
https://blog.51cto.com/qiangmzsx/1359952