zoukankan      html  css  js  c++  java
  • Java框架

    1、简述MyBatis的体系结构

    加载配置:配置有两种形式,一种是XML配置文件,另一种是Java代码的注解.MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句,结果映射配置),并将其存储在内存中.

    SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以使Map,JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数.

    SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果.

    结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap,JavaBean或者基本数据类型,并将最终结果返回

     

    2、列举MyBatis的常用API及方法

    SqlSessionFactoryBuilder该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例.

    SqlSessionFactory该对象负责创建SqlSession对象实例

    SqlSession该对象包含了所有执行SQL操作的方法,用于执行SQL操作的方法,用于执行已映射的SQL语句.

     

    3、JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

    数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

    ​解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

    Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

    ​解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

    向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

    ​解决: Mybatis自动将java对象映射至sql语句。

    对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

    ​解决:Mybatis自动将sql执行结果映射至java对象。

     

    4、MyBatis编程步骤是什么样的?

    1. 创建SqlSessionFactory

    2. 通过SqlSessionFactory创建SqlSession

    3. 通过sqlsession执行数据库操作

    4. 调用session.commit()提交事务

    5. 调用session.close()关闭会话

     

    5、简单的说一下MyBatis的一级缓存和二级缓存?

    Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

    Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

     

    6、对于Hibernate和MyBatis的区别与利弊,谈谈你的看法

    1. MyBatis非常简单易学,与Hibernate相对较复杂,门槛较高;

    2. 二者都是比较优秀的开源产品;

    3. 那MyBatis的灵活性将比Hibernate更适合;

    4. 系统数据处理量大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标.在这种情况下MyBatis会有更好的可控性和表现;

     

    7、MyBatis中使用#和$书写占位符有什么区别?

    #是预编译处理,$是字符串替换。

    Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把​${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。

     

    8、解释一下MyBatis中命名空间(namespace)的作用。

    项目中可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。

     

    9、MyBatis中的动态SQL是什么意思?

    对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,例如在58同城上面找房子,我们可能会指定面积、楼层和所在位置来查找房源,也可能会指定面积、价格、户型和所在位置来查找房源,此时就需要根据用户指定的条件动态生成SQL语句。如果不使用持久层框架我们可能需要自己拼装SQL语句,还好MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有:- if- choose / when / otherwise- trim- where- set- foreach。下面是映射文件的片段。

    <select id="foo" parameterType="Blog" resultType="Blog">
          select * from t_blog where 1 = 1
           <if test="title != null">
              and title = #{title}
           </if>
           <if test="content != null">
              and content = #{content}
           </if>
           <if test="owner != null">
              and owner = #{owner}
           </if>
      </select>

    10、Spring有哪些优点?

    轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。

    控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。

    面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。

    容器:Spring包含并管理应用程序对象的配置及生命周期。

    MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。

    事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。

    异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常

     

    11、Spring中AOP的应用场景、Aop原理、好处?

    aop指的是面向切面编程,就是在不修改源代码的基础上,通过预编译或者运行期动态代理的方式,给程序动态统一的添加功能的方式。aop可以对业务逻辑的各个部分进行隔离,降低了程序的耦合度,一般有大量相同功能,重复代码比较多的时候用。比如说管理事务、权限校验等

    原理:AOP是面向切面编程,是通过动态代理的方式为程序添加统一功能,集中解决一些公共问题。

    优点:

    1.各个步骤之间的良好隔离性耦合性大大降低

    ​2.面向切面编程,扩展功能不是修改源代码实现

     

    12、Spring中IOC的作用与原理?对象创建的过程。

    IOC控制反转也可以叫依赖注入ID,以前我们都是自己new对象,现在创建和管理对象都交给spring容器来做,现在只要做好配置,ioc容器通过注入解决依赖关系。

    比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象。IOC把对象的创建交给spring配置创建类对象。

    IOC底层原理使用技术:

    xml配置文件

    dom4j解决xml

    工厂设计模式

    反射

     

    13、有哪些不同类型的IOC(依赖注入)

    构造器依赖注入:构造器依赖注入在容器触发构造器的时候完成,该构造器有一系列的参数,每个参数代表注入的对象。

    Setter方法依赖注入:首先容器会触发一个无参构造函数或无参静态工厂方法实例化对象,之后容器调用bean中的setter方法完成Setter方法依赖注入

     

    14、Spring常见创建对象的注解?

    @Component@Controller@ Service@ Repository

     

    15、Spring中用到的设计模式

    简单工厂、工厂方法、单例模式、适配器、包装器、代理、观察者、策略、模板方法

     

    16、Spring的优点?

    1. 降低了组件之间的耦合性 ,实现了软件各层之间的解耦

    2. 可以使用容易提供的众多服务,如事务管理,消息服务等

    3. 容器提供单例模式支持

    4. 容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

    5. 容器提供了众多的辅助类,能加快应用的开发

    6. spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

    7. spring属于低侵入式设计,代码的污染极低

    8. 独立于各种应用服务器

    9. spring的DI机制降低了业务对象替换的复杂性

    10. Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部

     

    17、Spring Bean的作用域之间有什么区别?

    singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

    prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

    request:每一次http请求会产生一个新的Bean实例。

    Session:确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

    global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

     

    18、Spring管理事务有几种方式?

    有两种方式:

    编程式事务,在代码中硬编码。(不推荐使用)

    声明式事务,在配置文件中配置(推荐使用)声明式事务又分为两种:

    • 基于XML的声明式事务

    • 基于注解的声明式事务

     

    19、spring中的核心类有那些,各有什么作用?

    BeanFactory:产生一个新的实例,可以实现单例模式

    BeanWrapper:提供统一的get及set方法

    ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

     

    20、说SpringIOC,SpringAOP?

    SpringIOC ,其实就是依赖注入、控制反转。相当于把每个bean与bean之间的关系交给第三方容器管理。而这个容器就是spring

    SpringAOP 面向切面的编程,或AOP是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。SpringAop 就是用 Java的动态代理

     

    21、Spring的底层实现机制是什么

    使用Demo4j(解析XML)+Java反射机制

    Demo4j 其实就是解析XML。使用反射机制实例化bean。

     

    22、SpringAOP用到了什么代理

    JDK动态代理:对实现了接口的类生成代理

    CGLib代理机制:对类生成代理

     

    23、动态代理与静态代理区别?

    静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

    动态代理:在程序运行时,运用反射机制动态创建而成。

     

    24、Spring注入有那些方式?

    Set注入

    构造器注入

    静态工厂的方法注入

    实例工厂的方法注入

    25、Spring有那些注解?

    @Autowired(按类型注入)

    @Service(标示为注入为服务层)

    @Resource(按名称注入)

    @Controller(标识控制器bean id)

    @RequestMapping(表示映射URL路径)

     

    26、简述Spring的优缺点?

    1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦

    2.可以使用容易提供的众多服务,如事务管理,消息服务等

    3.容器提供单例模式支持

    4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

    5.容器提供了众多的辅助类,能加快应用的开发

    6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

    7.spring属于低侵入式设计,代码的污染极低

    8.独立于各种应用服务器

    9.spring的DI机制降低了业务对象替换的复杂性

    10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部

    缺点:

    使用到了大量反射机制。反射机制非常占内存

     

    27、Bean的调用方式有哪些?

    有三种方式可以得到Bean并进行调用:

    //使用BeanWrapper 
    HelloWorld hw=new HelloWorld(); 
    BeanWrapper bw=new BeanWrapperImpl(hw); 
    bw.setPropertyvalue(”msg”,”HelloWorld”); 
    system.out.println(bw.getPropertyCalue(”msg”)); 
    //使用BeanFactory 
    InputStream is=new FileInputStream(”config.xml”); 
    XmlBeanFactory factory=new XmlBeanFactory(is); 
    HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”); 
    system.out.println(hw.getMsg()); 
    //使用ApplicationConttext 
    ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”); 
    HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”); 
    System.out.println(hw.getMsg());

    28、Spring里面如何配置数据库驱动

    //使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
       <property name="driverClassName"> 
           <value>org.hsqldb.jdbcDriver</value>
       </property> 
       <property name="url"> 
           <value>jdbc:hsqldb:db/appfuse</value> 
       </property> 
       <property name="username"><value>abc</value></property> 
       <property name="password"><value>abc</value></property> 
    </bean>

    29、如何在Web项目中配置Spring的IoC容器

    如果需要在Web项目中使用Spring的IoC容器,可以在Web项目配置文件web.xml中做出如下配置

    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:applicationContext.xml</param-value>
    </context-param><listener>
       <listener-class>
          org.springframework.web.context.ContextLoaderListener
       </listener-class>
    </listener>

    30、如何在Web项目中配置Spring MVC

    要使用Spring MVC需要在Web项目配置文件中配置其前端控制器DispatcherServlet,如下所示:

     <servlet>
           <servlet-name>example</servlet-name>
           <servlet-class>
              org.springframework.web.servlet.DispatcherServlet
           </servlet-class>
           <load-on-startup>1</load-on-startup>
       </servlet><servlet-mapping>
           <servlet-name>example</servlet-name>
           <url-pattern>*.html</url-pattern>
       </servlet-mapping>

    31、springMVC的流程?

    1. 用户发送请求至前端控制器DispatcherServlet

    2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。

    3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

    4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

    5. 执行处理器(Controller,也叫后端控制器)。

    6. Controller执行完成返回ModelAndView

    7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

    8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器

    9. ViewReslover解析后返回具体View

    10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

    11. DispatcherServlet响应用户

     

    32、Springmvc的优点

    1. 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.

    2. 可以任意使用各种视图技术,而不仅仅局限于JSP

    3. 支持各种请求资源的映射策略

    4. 它应是易于扩展的

     

    33、SpringMVC与Struts2的主要区别?

    springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

    springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

    Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。 Jsp视图解析器默认使用jstl。

     

    34、SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决

    是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的

    解决方案是在控制器里不要定义static的全局变量

     

    35、SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代

    一般用@Conntroller注解,表示是表现层,不能用别的注解代替.

     

    36、@RequestMapping注解用在类上面有什么作用

    用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

     

    37、怎么样把某个请求映射到特定的方法上面

    直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径

     

    38、如果在拦截请求中,我想拦截get方式提交的方法,怎么配置

    可以在@RequestMapping注解里面加上method=RequestMethod.GET

     

    39、如果在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置

    可以在@RequestMapping注解里面加上params="type=test"

     

    40、我想在拦截的方法里面得到从前台传入的参数,怎么得到

    直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样

     

    41、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象

    直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面

     

    42、怎么样在方法里面得到Request,或者Session

    直接在方法的形参中声明request,SpringMVC就自动把request对象传入

     

    43、SpringMvc中函数的返回值是什么.

    返回值可以有很多类型,有String, ModelAndView,当一般用String比较好

     

    44、SpringMvc怎么处理返回值的

    SpringMvc根据配置文件中InternalResourceViewResolver的前缀和后缀,用前缀+返回值+后缀组成完整的返回值

     

    45、SpringMVC怎么样设定重定向和转发的

    在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4"

    在返回值前面加"redirect:"就可以让返回值重定向,如"redirect:http://www.baidu.com"

     

    46、SpringMvc用什么对象从后台向前台传递数据的

    通过ModelMap对象,可以在这个对象里面用put方法,把对象加到里面,前台就可以通过el表达式拿到

     

    47、SpringMvc中有个类把视图和数据都合并的一起的,叫什么

    叫ModelAndView

     

    48、怎么样把ModelMap里面的数据放入Session里面

    可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key

     

    49、SpringMvc怎么和AJAX相互调用的

    通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象

    具体步骤如下:

    1. 加入Jackson.jar

    2. 在配置文件中配置json的映射

    3. 在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解

     

    50、当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理

    要加上@ResponseBody注解

     

    51、SpringMvc里面拦截器是怎么写的

    有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器即可:

    <!-- 配置SpringMvc的拦截器 -->
    <mvc:interceptors>
       <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->
       <bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
       <!-- 只针对部分请求拦截 -->
       <mvc:interceptor>
          <mvc:mapping path="/modelMap.do" />
          <bean class="com.et.action.MyHandlerInterceptorAdapter" />
       </mvc:interceptor>
    </mvc:interceptors>

     

    52、如何解决POST请求中文乱码问题,GET的又如何

    在web.xml中加入如下过滤器:

    <filter>
       <filter-name>CharacterEncodingFilter</filter-name>
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
       <init-param>
           <param-name>encoding</param-name>
           <param-value>utf-8</param-value>
       </init-param>
    </filter>
    <filter-mapping>
       <filter-name>CharacterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>

    以上可以解决post请求乱码问题。对于get请求中文参数出现乱码解决方法有两个:

    修改tomcat配置文件添加编码与工程编码一致,如下:

    <ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

    另外一种方法对参数进行重新编码:

    String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

    ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/zhangjinru123/p/8601331.html
Copyright © 2011-2022 走看看