面试整理

来源:互联网 发布:js dom 大小改变事件 编辑:程序博客网 时间:2024/06/01 20:18
01 . Tomcat 默认的内存大小是多少?


Tomcat默认可以使用的内存为128MB,这点内存是不够的,需要调大
第一种方法:
  Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:
  JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
  需要把这个两个参数值调大。例如: JAVA_OPTS='-Xms256m -Xmx512m'  表示初始化内存为256MB,可以使用的最大内存为512MB。

第二种方法: 环境变量中设     变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m

02 . 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?


 答案: Dao层是数据访问层,用来访问数据库实现数据的持久化。Dao接口的工作原理是JDK动态代理;

Dao接口就是通常说的Mapper接口,接口的全限名是( 包名+类名 ),就是 mapper.xml 文件中的 namespace ;

接口方法名就是mapper.xml文件的MappedStatement的id值,
在MyBatis中每一个<select>,<insert>,<update>,<delete>标签都会被解析成一个MappedStatement对象。

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。
Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,
转而执行MappedStatement所代表的sql,然后将sql执行结果返回。


03 . MySQL中分页语句怎么写?


select t.* from (select * from student)t limit 0,10




04 . MySQL中 GROUP BY 条件有两个怎么写? 比如按照 ID 和 Month 分组


答案: mysql> -- 1:根据多个字段分组
mysql> SELECT * FROM employee GROUP BY sex,depId;
mysql> -- 2:分组查询配合GROUP_CONCAT()来使用,以id分组,把name字段的值打印在一行,逗号分隔(默认)

mysql> select * from aa; 
+------+------+
| id| name |
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200 |
|3 | 500 |
+------+------+
6 rows in set (0.00 sec)


mysql> select id,group_concat(name) from aa group by id; 
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
3 rows in set (0.00 sec)




05 . SSH 和 SSM 有什么优缺点?
     解题思路: 这个题直接说Mybatis和Hibernate的优缺点,Struts2和SpringMVC的优缺点。



Mybatis和Hibernate的优缺点:
①、MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
②、Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
③、MyBatis容易简单,而Hibernate配置文件太复杂,容易出错。
④、Hibernate是全自动用的是HQL语句,自动生成,但是HQL语句不好写,用起来没有Mybatis灵活。
⑤、Hibernate有更好的数据库缓存机制,也可以使用第三方缓存,而Mybatis本身提供的缓存机制不佳


Struts2和SpringMVC的优缺点:
①、Struts2是类级别的拦截,SpringMVC是方法级别的拦截
②、SpringMVC的方法之间基本上独立的,独享request response数据,Struts2所有Action变量是共享的,一个Action对象对应一个request上下文。
③、Struts2需要针对每个request进行封装并保证线程安全,所以在原则上,是比较耗费内存的。
④、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
⑤、SpringMVC的入口是servlet,而Struts2是filter
⑥、SpringMVC集成了Ajax,使用非常方便,Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
⑦、Spring MVC和Spring是无缝的。项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
⑧、Struts2更加符合OOP的编程思想,SpringMVC就比较谨慎,在servlet上扩展。




06 . 表关系怎么设计 比如 菜单 、角色 和 用户之间的关系


菜单和角色是多对多的关系
<bag name="sysRights" lazy="false" cascade="all" table="sys_role_right">
            <key>
                <column name="rf_role_id" />
            </key>
            <many-to-many class="entity.SysRight" column="rf_right_code"/>
        </bag>

用户和角色是多对一的关系
<many-to-one name="sysRole" class="entity.SysRole" lazy="false" cascade="save-update">
            <column name="user_role_id" />
        </many-to-one>




07 . UserDao.java 和 User.java 和 UserMapper.xml 之间是怎么关联的?
--对应着Dao接口
<mapper namespace="mapper.UserDao">
--对应着User.java实体类 以及实体类中的字段和数据库中字段的映射
<resultMap type="entity.User"  id="userMap">
<result property="id" column="id" javaType="java.lang.Integer"/>
<result property="name" column="name" javaType="java.lang.String"/>
<result property="password" column="password" javaType="java.lang.String"/>
</resultMap>


08 . Dao层使用的注解有哪些?Service层? Controller层?
@RequestMapping是一个用来处理请求地址映射的注解
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在
@Resource默认按照ByName自动注入
@Repository用于注解dao层,在daoImpl类上面注解。
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name")
@ModelAttribute
@SessionAttributes即将值放到session作用域中,写在class上面。
@ResponseBody 返回json格式的数据
@Component相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议
@Controller
09 . 使用MyBatis的时候应该注意什么?
注意①:Mybatis中的 #{} 和 ${} 的区别?# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”. 
#方式能够很大程度防止sql注入
$方式无法防止Sql注入。
注意②:Mybatis的用法,返回类型是Map键值对类型。
10 . 在数据库中转换时间格式怎么写?
方法一:通过函数to_char实现时间格式的转换 
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
方法二:更改会话参数
nls_date_format='yyyy-mm-dd hh24:mi:ss'
11 . 简述Mybatis的插件运行原理,以及如何编写一个插件。


答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,
为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法
,当然,只会拦截那些你指定需要拦截的方法。实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,
指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。


12 . Mysql中常用的聚合函数:



COUNT():统计记录的数目
SUM():求字段的和
AVG():求字段的平均值
MAX():求字段的最大值
MIN():求字段的最小值


13 . 写一个Ajax请求:
$.ajax({
        type: "post",
        dataType: "html",
        url: '/Resources/GetList.ashx',
        data: dataurl,
        success: function (data) {
            if (data != "") {
                $("#pager").pager({ pagenumber: pagenumber, pagecount: data.split("$$")[1], buttonClickCallback: PageClick });
                $("#anhtml").html(data.split("$$")[0]);


            }
        }

    });

14 . springMVC的工作原理:

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)

第十一步:前端控制器向用户响应结果


15 . Mybatis的工作原理:


MyBatis的初始化的过程其实就是解析配置文件和初始化Configuration的过程,首先会创建SqlSessionFactory,然后根据configuration对象来创建SqlSession,然后执行相对应的事务处理,关闭SqlSession和SqlSessionFactory;





原创粉丝点击