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编码

  • 相关阅读:
    队列:队列在线程池等有限资源池中的应用
    栈:如何实现浏览器的前进和后退
    如何优雅的写出链表?
    数据结构与算法之美(python)(课程整理A-02)
    数据结构与算法之美(python)(课程整理A-01)
    django 数据库迁移成功 但是表没有创建
    beego框架学习-000001(go get下载速度过慢、导包及其初始化问题)
    【转载】HTML5自定义data属性
    【转载】OAuth的机制原理讲解及开发流程
    浏览器的同源策略
  • 原文地址:https://www.cnblogs.com/zhangjinru123/p/8601331.html
Copyright © 2011-2022 走看看