面试总结
一、 springmvc配置文件要配置哪些内容
1.web.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
5 version="3.0">
6 <!-- 加载applicationContext.xml配置文件 -->
7 <context-param>
8 <param-name>contextConfigLocation</param-name>
9 <param-value>classpath:applicationContext.xml</param-value>
10 </context-param>
11 <!-- 设置编码为UTF-8 -->
12 <filter>
13 <description>字符集过滤器</description>
14 <filter-name>encodingFilter</filter-name>
15 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
16 <init-param>
17 <description>字符集编码</description>
18 <param-name>encoding</param-name>
19 <param-value>UTF-8</param-value>
20 </init-param>
21 </filter>
22 <filter-mapping>
23 <filter-name>encodingFilter</filter-name>
24 <url-pattern>/*</url-pattern>
25 </filter-mapping>
26
27 <!-- spring监听器 -->
28 <listener>
29 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
30 </listener>
31
32 <listener>
33 <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
34 </listener>
35
36 <!-- 配置Servlet -->
37 <servlet>
38 <servlet-name>DispatcherServlet</servlet-name>
39 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
40 <init-param>
41 <param-name>contextConfigLocation</param-name>
42 <param-value>classpath:springmvc.xml</param-value>
43 </init-param>
44 <load-on-startup>1</load-on-startup>
45 </servlet>
46
47 <servlet-mapping>
48 <servlet-name>DispatcherServlet</servlet-name>
49 <url-pattern>/</url-pattern>
50 </servlet-mapping>
51
52
53 <!-- 程序加载时的页面 -->
54 <welcome-file-list>
55 <welcome-file>/index.jsp</welcome-file>
56 </welcome-file-list>
57
58 </web-app>
2.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:annotation-config/>
<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<!-- 自动扫描controller包下所有的类,使其认为是spring mvc的控制器 -->
<context:component-scan base-package="com.keman.eomfront.services"></context:component-scan>
<!--读取jdbc配置文件-->
<bean id="propertyConfigure"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean>
<!-- 声明一个数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${jdbc.initialSize}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${jdbc.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="SELECT 1+1 from dual"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!--如果用Oracle,则把poolPreparedStatements配置为true-->
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
</bean>
<!--声明 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/keman/eomfront/xml/*.xml"/>
</bean>
<!-- 配置mybatis映射接口扫描器 -->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.keman.eomfront.mapper"/>
<property name="markerInterface" value="com.keman.eomfront.mapper.BaseMapper"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="properties">
<value>
mappers=tk.mybatis.mapper.common.Mapper
ORDER=BEFORE
</value>
</property>
</bean>
<!--================事务相关控制===================-->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="modify*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="remove*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="load*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!--把事务控制在Service层-->
<aop:pointcut id="txPointcut" expression="execution(* com.keman.eomfront.services..*.*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
</beans>
3.springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.keman.eomfront.controller"/>
<context:annotation-config />
<mvc:default-servlet-handler />
<!-- 支持spring3.0以上新的mvc注解 -->
<mvc:annotation-driven/>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptors>
<!--登陆拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login/loginon"/>
<mvc:exclude-mapping path="/login/testConn"/>
<mvc:exclude-mapping path="/login/loginout"/>
<mvc:exclude-mapping path="/login/loginindex"/>
<mvc:exclude-mapping path="/pages/login.jsp"/>
<!-- 基础功能不用拦截 -->
<mvc:exclude-mapping path="/base/*"/>
<bean class="com.keman.eomfront.controller.UserLoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!--全局异常-->
<!-- <bean class="com.keman.eomfront.lib.ExceptionResolver"/> -->
<bean class="com.keman.eomfront.exception.DefaultExceptionHandler" />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<!-- 文件上件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxInMemorySize" value="240"/>
<!--<property name="maxInMemorySize" value="10240"/>-->
<property name="uploadTempDir" value="/upload/"/>
<property name="maxUploadSize" value="-1"/> <!-- 最大文件大小,-1为无限止(-1) ;-->
</bean>
<!-- 全局异常处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception, jsp可以访问这个变量${ex.message} -->
<property name="exceptionAttribute" value="ex"/>
<!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
<property name="defaultErrorView" value="error"/>
<!-- 默认HTTP状态码 -->
<property name="defaultStatusCode" value="500"/>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页面名作为值 -->
<property name="exceptionMappings">
<props>
<prop key="java.sql.SQLException">error_sql</prop>
<prop key="java.lang.Exception">error_ex</prop>
</props>
</property>
<property name="statusCodes">
<props>
<prop key="error">500</prop>
<prop key="404">404</prop>
</props>
</property>
</bean>
</beans>
4.mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
<!--<setting name="logImpl" value="LOG4J"/>-->
<!--控制台打印sql语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 为所有的POJO起别名,规则为POJO类的的简单类名首字母变为小写 -->
<typeAliases>
<package name="com.keman.eomfront.entity"/>
</typeAliases>
</configuration>
二、mysql和Oracle怎么实现分页
1.mysql
一般情况下,客户端通过传递 pageNo(页码)、pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 limit 来解决这个问题:
//LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
//收到客户端{pageNo:1,pagesize:10}
select * from table limit (pageNo-1)*pageSize, pageSize;
//收到客户端{pageNo:5,pageSize:30}
select * from table limit (pageNo-1)*pageSize,pageSize;
在数据量较小的时候简单的使用 limit 进行数据分页在性能上面不会有明显的缓慢,但是数据量达到了 万级到百万级 sql语句的性能将会影响数据的返回。这时需要利用主键或者唯一索引进行数据分页;
假设主键或者唯一索引为 good_id
收到客户端{pageNo:5,pagesize:10}
select * from table where good_id > (pageNo-1)*pageSize limit pageSize;
--返回good_id为40到50之间的数据
2.Oracle
1.无ORDER BY排序的写法。(效率最高)
SELECT *
FROM (SELECT ROWNUM AS rowno, t.* FROM emp t where ROWNUM <= M+N) table_alias
WHERE table_alias.rowno >= M;
2.有ORDER BY排序的写法。(效率较高)
SELECT *
FROM (SELECT tt.*, ROWNUM AS rowno
FROM ( SELECT t.* FROM emp t WHERE hire_date BETWEEN TO_DATE('20060501','yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') ORDER BY create_time DESC, emp_no) tt
WHERE ROWNUM <= 20) table_alias
WHERE table_alias.rowno >= 10;
三、事务是什么?
事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完 。
事物的四个特性(ACID
● 原子性(Atomicity):
操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
eg:拿转账来说,假设用户A和用户B两者的钱加起来一共是20000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是20000,这就是事务的一致性。
● 一致性(Consistency):
事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
● 隔离性(Isolation):
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
● 持久性(Durability):
当事务正确完成后,它对于数据的改变是永久性的。
eg: 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。