1. MyBatis
- 说出你所了解的持久层(ORM)框架
- mybatis,hibernate,jpa,jooq
- object relationship mapping 建立java 对象与关系型数据库之间的映射关系
- mybatis 是轻量级的 orm,hibernate 是重量级的(用注解方式建立orm关系,很多sql由框架生成)
- jpa 是一套接口,hibernate 同时也作为 jpa
2)什么是 MVC,你的项目中哪里体现了 MVC
- 模型(model) - 数据,domain,java bean
- 视图(view) - 数据的展现方式,jsp
- 控制器(controller) - 把模型和视图联系在一起,对应着 servlet
3)梳理一下 MyBatis 的使用步骤
- pom.xml 中添加 mybatis 依赖
- resources/mybatis-config.xml 配置文件(配置数据库连接和映射关系)
- 提供 xml mapper 或 接口 映射 (都是通过这些映射管理 sql 语句)
- 使用 mybatis 的api 执行增删改查
4)列举 MyBatis 中重要的接口,它们分别是干什么的?
- SqlSessionFactory (接口) - 创建 sqlsession 的
- SqlSessionFactoryBuilder (类) - 创建工厂对象
- SqlSession (接口) - 执行增删改查,管理事务
5)列举 sqlSession 中重要的方法
- 新增 - insert(“namespace + id”, sql参数对象)
- 修改 - update(“namespace + id”, sql参数对象)
- 删除 - delete(“namespace + id”, sql参数对象)
- 查询一个列表 - selectList(“namespace + id”, sql参数对象)
- 查询如果最多有一条 - selectOne(“namespace + id”, sql参数对象)
- 事务 - rollback,commit
- 获取mapper 接口 getMapper(接口.class)
6)xml mapper 中 parameterType 是干什么用的? resultType 呢?
- parameterType sql语句的参数类型, int,string,学生对象,用户对象,list,map
- resultType 是查询结果的类型
7)如果 parameterType 是个 map 如何获取值,list,javabean呢?
map.put("a", ..);
mpa.put("b", ..)
<select parameterType="map">
select ... limit #{}, #{}
</select>
- #{key} 利用key 获取map中的值
- #{属性} 利用属性名,获取java bean中的属性值
<foreach collection="list" item="x">#{x}</foreach>
8)#{} 与 ${} 的区别
- #{} 使用?占位符,相对安全,只能代替值
- ${} 有注入攻击危险,直接拼接字符串,可以做简单运算,可以代替sql中的任意部分
9)resultType 和 resultMap 有啥区别,分别用在哪儿?
- resultType 结果类型
- resultMap 当列与属性不一致时,或者结果比较复杂不能用resultType直接映射时
10)如何查看 MyBatis 生成的 SQL 语句
- 添加 logback 的依赖
- 添加 resources/logback.xml 配置文件
<logger name="namespace+mapper文件名" level="debug">
11)如果要你使用 MyBatis 实现分页查询,用 xml mapper 如何实现? 用接口 mapper 呢
<select parameterType="map" resultType="">
select * from user limit #{起始下标}, #{每页个数}
</select>
@Select("select * from user limit #{起始下标}, #{每页个数}")
public List<User> findPage(Map<String,Integer> map);
12)xml mapper 中的 namespace 是干嘛用的?
防止 xml mapper 中sql 语句的命名冲突
13)Mybatis 动态 sql 有哪几种,都用到哪些标签
<set> <where> <if test="条件"> <foreach collection="" item="" open="" close="" separator="">
14)Mybatis 中 xml mapper 中特殊字符如何处理,接口 mapper 呢?
- 转义 < <
- CDATA块 <![CDATA[ ]]>
15)接口 mapper 中如何向 sql 语句传参
sql 中还是可以使用 #{} 来获取参数值
如果有多个参数,一种方法可以传递一个map,其中可以包含多个参数
@Select(" #{名字}")
public void test(@Param("名字") int a, String b);
16)接口 mapper 中是否允许方法重名
不允许
17)接口 mapper 与 xml mapper 如何结合?
|- src
|- main
| - java
| - mapper
UserMapper.java
| - resources
| - mapper
UserMapper.xml
在xml mapper 中 namespace=“mapper.UserMapper”
在xml mapper 中 sql语句的id 对应 接口mapper中的方法名
<mapper class="mapper.UserMapper">
18)如果列与属性不一致,有哪几种解决方法
- 给列起一个列别名 , 列别名与属性一致
- 使用
<resultMap>
19)Dept Emp 其中部门中有一个集合属性List emps 用 Mybatis 完成映射
public class Dept{
private List<Emp> emps;
}
public class Emp {
}
<select ... resultMap="a">
select a.*, b.* from dept a inner join emp b on a.deptno = b.deptno
</select>
<resultMap id="a" type="Dept">
<id column="部门列名" property="部门属性名"/>
<result column="部门列名" property="部门属性名"/>
<collection property="emps" ofType="Emp">
<id column="员工列名" property="员工属性名"/>
<result column="员工列名" property="员工属性名"/>
</collection>
</resultMap>
20)Mybatis中的缓存,你了解哪些
- 一级, 每个sqlsession都有自己的一级缓存,sqlsession创建时创建,sqlsession关闭时销毁
- 二级, 手动开启,多个sqlsession公用一个二级缓存,适用于读多写少
2. Ajax
1)Ajax用来解决什么问题?
ajax 也是向服务器发送请求的一种手段,但发送请求时不会导致页面刷新或跳转
2)Ajax底层的核心对象是?
var xhr = new XMLHttpRequest();
xhr.open(“get|post”, url, true|false);
xhr.send();
xhr.responseText
3)什么是异步请求?异步请求如何接收应答
xhr.send(); // 同步,异步
异步请求就是请求发送后,不必等待响应返回,接下来的代码可以继续执行
xhr.onload = function() {
xhr.responseText;
}
4)Ajax 的响应格式有哪些?
- json
- xml
5)Java 中你采用哪个库来处理 json,servlet 如何返回 json 格式的应答
jackson
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString("java对象");
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(json);
6)Javascript 中如何在 json 字符串和 js 对象之间转换
var js对象 = JSON.parse(json字符串);
var json字符串 = JSON.stringify(js对象);
7)说说 Ajax 的应用,你的项目中哪里用到了 Ajax
- 评论弹幕
- 图形验证码的验证
- 省市县联动
- 自动完成
3. Web
1)你知道的 web 服务器
- tomcat, jetty
- apache, nginx
2)Tomcat 如何安装,启动,停止,修改端口
- 安装jdk,设置 java_home 环境变量,解压tomcat压缩包
- 启动 bin\startup.bat
- 停止 bin\shutdown.bat
- conf\server.xml 在此文件中
<Connector port="8080">
3)Tomcat 中的应用程序通常部署在哪个目录下?
- webapps
4)什么是 servlet,什么是 jsp,它们二者的关系是什么
- jsp (java server pages) 服务器端页面
- servlet 服务器端小程序
- 都是java 服务器端生成动态内容的技术
- jsp 本质仍然是 servlet, jsp 转译为一个*.java, 编译为*.class
5)说说 get 请求和 post 请求的区别
- 请求参数有区别:get请求把请求参数跟在请求地址之后,post请求是把请求参数放入了请求体
- get 请求长度有限,post 请求基本没有限制
- doGet, doPost, service
6)常见的 jsp 指令有那几个
<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib prefix="前缀" uri="标签库标识" %> 引入标签库
<%@ include file="另一个页面的地址" %> 包含另一个页面
7)web post 请求中为何有中文乱码问题,如何解决?
- 发送请求时,浏览器会把中文内容编码(utf-8)后发送给服务器, 服务器默认使用英文字符集解码(iso-8859-1)
- request.setCharacterEncoding(“utf-8”); // 设置解码的字符集
8)举出常见响应码的含义
- 200 响应成功了
- 404 请求的地址(页面)不存在
- 500 java 服务器端有未捕获异常
- 304 网页没有修改过, 就不必返回内容了
- 403 没有权限
- 400 请求参数有问题
- 405 doGet或doPost没有实现
- 302 请求重定向
9)如何进行请求转发,如何重定向,他俩的区别
request.getRequestDispatcher("路径").forward(request, response); // 请求转发
response.sendRedirect("路径"); // 请求重定向
-
请求转发地址栏不会改变,底层仍是一次请求, 可以使用 request作用域传值
-
请求重定向地址栏会改变,实际是两次请求, 只能使用 session作用域传值
-
servlet -》 jsp 关系非常紧密时(请求转发)
-
两个独立功能(例如用户新增、用户列表) 他们之间跳转使用 请求重定向
10)作用域是干嘛用的,有那几个
用来存储数据,以便servlet,jsp页面来共享这些数据
- page (仅限当前页面可以使用)
- request (仅限同一次请求可以使用)
- session (同一个浏览器的多次请求,一个会话)
- application (同一个应用)
11)如何获取请求参数,与 request.getAttribute 有何区别
String 参数值 = request.getParameter("参数名");
request.getParameter 是获取请求参数的值,localhost:8080/ssss?username= 或是表单提交过来的
request.getAttribute 是获取 用 request.setAttribute() 存入作用域的值
12)说一说 servlet 生命周期
- 当第一次向 servlet 发送请求时,会调用他的构造方法 (调用1次)
- 紧接着调用 servlet 的init 初始化方法 (调用1次)
- 接着调用 service 方法 (请求一次就调用一次)
- 当服务停止会调用 servlet destroy 销毁方法 (调用1次)
13)EL 表达式是干嘛的
- 从作用域中获取数据并展示
- 还可以执行各种算数、逻辑运算
14)JSTL 是干嘛的,常见的标签有哪些
jsp 标准标签库,条件判断,循环控制,格式化输出等
<c:forEach items="${集合}" begin="" end="" var="临时变量名">
<c:if test="${条件判断}"></c:if>
<c:choose>
<c:when test="${条件1}"> </c:when>
<c:when test="${条件2}"> </c:when>
<c:when test="${条件3}"> </c:when>
...
<c:otherwise></c:otherwise>
</c:choose>
<c:out value="${值}"> 会照原样输出其中的html标签
<fmt:formatDate>
<fmt:formatNumber>
15)DO 是什么的缩写,DAO 呢
- domain object 领域对象 (entity实体对象, javabean, pojo (plain old java object))
他们的都是同一种java类不同称呼,都具有私有属性,get set方法,用来封装数据 - data access object 数据访问对象
16)<%%>
<%=%>
<%!%>
<%-- --%>
<%@%>
的区别
<%%>
jsp脚本,里面可以写java代码
<%=%>
jsp表达式,可以用来输出内容
<%!%>
jsp声明, 可以用来定义变量,此变量是类的成员变量(属性)
<%-- --%>
jsp 注释
<%@%>
jsp指令
17)jsp 中有哪些隐式对象
- pageContext page作用域
- request
- session
- application
- response 响应对象
- out 输出流对象
- page this
- config jsp配置
- exception 异常对象
18)cookie 是干嘛用的
把一些信息以键值方式存储至浏览器中, 维系状态
Cookie c = new Cookie(key, value);
c.setMaxAge(10); // 寿命, 单位是秒
response.addCooke©;
19)session 是干嘛用的,与 cookie 的区别
把一些信息以键值方式存储至服务器端,维系状态
区别:
- session 能存储任意类型, cookie 只能存储字符串
- session 理论没有大小限制, 一个 cookie 大小约为 4k
- 当两次请求间隔超过30分钟 session失效, cookie 会根据maxAge的值存活相应时间,如果没有设置maxAge浏览器关闭就会消失
- session 相对安全
20)session 中如何存储对象,获取对象,删除对象,失效
HttpSession session = request.getSession();
session.setAttribute("名字", 值); // 存储
Object 值 = session.getAttribute("名字"); // 获取
session.removeAttribute("名字"); // 删除
session.invalidate(); // 主动失效
21)会话跟踪的原理
- request.getSession(); // 首次请求,在服务器端创建出 session 对象, session会有一个id值(唯一的)
- 第一次返回响应时,由tomcat 返回一个特殊cookie (jsessionid=session的id值) 返回给浏览器
- 后续的请求,浏览器就根据这个 jsessionid的值找到服务器端的session对象
22)过滤器是干嘛用的,举几个应用场景
- 请求到达目的地之前,首先会经过过滤器,过滤器中可以执行一些统一的操作
- 统一设置字符编码
- 统一执行权限检查
- 统一执行登录检查
- 自动登录过滤器
对应 设计模式中的 责任链模式
23)过滤器中有哪些匹配方式,如何放行请求
@WebFilter(urlPattern="")
- 前缀匹配: /user/*
- 后缀匹配: *.jsp
- 精确匹配: /servlet1 跟目标路径一模一样
chain.doFilter(request, response);
4. 前端
1) js 中有没有块作用域?
for(var i = 0; i < … ;i ++) {
}
当循环结束 i 的值仍可以使用
// js let 声明的变量有块作用域
2) js 中如何表示数组和对象
- 数组使用 [元素,元素…]
- 对象使用 { “属性名”: 值 , … }
3) js 中数组排序有没有陷阱
有。
var array = [12,3,4,5];
array.sort(); // 将数组中的数字当做字符串来排序
array.sort( function(a, b){ return a - b } );
4) js 如何获取 html 元素
document.getElementById("id值"); // 返回一个标签
document.getElementsByTagName("标签名"); // 返回一个标签数组
document.querySelectorAll("选择器"); // #id, .class名 标签名 返回一个标签数组
<input id="id值">
5) js 如何改动标签的属性、内容、样式
标签.属性名="新的属性值";
标签.innerText = 内容 (当做普通文本)
标签.innerHTML = 内容 (当做html标签)
标签.style.样式名 = "值";
标签.className = "class值";
6) js 控制标签显示隐藏
标签.style.display = "none"; // 隐藏
标签.style.display = "block"; // 显示
7) js 创建标签,建立标签父子关系
var 标签对象 = document.createElement("标签名");
父标签.appendChild(子标签)
8) js 定时器如何创建
setTimeout( function(){}, n 毫秒值 ); // 当 n 毫秒后,执行函数的内容
9) 如何给标签添加事件,触发事件时 this 代表什么
标签.onclick = function(){};
<标签 onclick="函数名(this)"> this 代表触发事件的标签
5. maven
1)添加一个 maven 依赖通常要指定那三项,scope 是干嘛的
- groupId - 公司或组织名
- artifactId - 项目名
- version - 版本
- scope - 作用范围 test(测试阶段有效), provided(已提供)
2)maven 中默认 jdk 版本是什么,如何改变
- 默认是 1.5
- pom.xml中添加一个maven的编译插件来修改jdk的版本
3)如何将 maven 项目安装至本地仓库
- 下载到项目源码
- 执行 maven 的 install 命令安装至本地仓库
4)如何将 maven 项目打包
- 执行 maven 的 package 命令 项目打包
6. 项目
1)rbac 是指什么
role based access control 基于角色的访问(权限)控制, 是软件开发中控制权限的一种设计思想
2)你们的数据库怎么设计的,有几张表,关系呢
- 用户表
- 角色表
- 模块表
- 用户和角色 多对多关系
- 角色和模块 多对多关系
- 模块表 自身一对多关系
- 你所做的模块都有哪些功能,说出其中一个的详细流程
能够用语言把自己做过的模块表述出来
4)你的项目使用什么技术来访问数据库,重要的步骤
- jdbc 执行效率高,项目规模不大
- 加载驱动
- 获取连接对象
- 创建 sql 语句对象, Statement, PreparedStatement
- 执行 sql , 通过 executeUpdate() executeQuery()
- executeUpdate() 返回 int,代表影响行数
- executeQuery() 返回 ResultSet, 结果集 while(rs.next())
- 先打开的资源后关闭
5)PreparedStatement 用来解决什么问题
- 采用预编译方法生成sql,并给sql语句的?占位符赋值,不容易发生sql注入攻击
- 预编译sql 减少sql的编译次数,提升效率
- select * from user where id = ?
- select * from user where id = ?
6)如何使用 jdbc 控制事务
Connection conn = ...
conn.setAutoCommit(false); // 手动提交
try {
// 多条sql
conn.commit();
} catch (Exception e ) {
conn.rollback();
}
7)jdbc 有哪些优化手段
- 在查询时使用 where limit 返回部分结果
- 连接池的技术,来减少连接的创建时间(每次没有真正关闭连接)
- 使用批处理技术可以提升增删改的效率(减少了通信次数)
- addBatch(); // 将sql加入批处理
- executeBatch(); // 执行批处理中所有sql
- 索引主要用来提高查询效率(已排序好的结果 B+树, 利用了空间换取了搜索时间)
8)你的项目中有没有使用单元测试,怎么做的
有,使用了JUnit单元测试
// junit 5
@Test // 执行入口
public void 方法名() {
Assert.assertEquals(期望值, 实际值);
}
9)你的项目中使用的数据库是什么
mysql, oracle
默认端口:3306
-- 查看有哪些库
show databases;
use 库名;
-- 查看库中有哪些表
show tables;
-- 查看表结构
desc 表名
10)导入 sql 数据有什么方法,如果是纯文本数据呢
source sql文件的位置(gbk)
load data infile 文件位置
11)增删改查的 sql 语法
insert into 表名(列名...) values(值...);
delete from 表名 where 条件;
update 表名 set 列名=值 ... where 条件;
select 列名 from 表名
inner|left join 表名 on 连接条件
where 条件
group by 列 having 条件
order by 列 asc|desc
limit m, n;
12)sql 语句的执行顺序
连接 > where > group by > having > select > order by > limit
13)inner 和 left 的区别
- inner 内连接, 满足连接条件的会出现在结果中
- left 左连接,满足连接条件的会出现在结果中,除此以外左表中未满足连接条件的,也会出现在结果中
14)事务是什么,有哪些特性
把多条sql视为一个整体执行,要么都成功,要么都失败
- 原子性
- 一致性
- 隔离性
- 持久性
ACID
15)你对 jdk8 的新特性了解多少
stream 流
lambda 表达式
list.stream().filter( i -> i % 2 == 0 ).collect(Collectors.toList());
jdk5 jdk8 jdk9
16)对反射知道什么
在运行期间可以获取对象的方法、构造器、属性、注解 …
Class c = …
c.newInstance();
Method m = …
// 对象.方法名(参数) 正常调用
方法对象.invoke(对象, 参数);
17)说说你了解的设计模式,以及他们的体现
- 享元模式 - Integer (-128~127), 连接池
- 原型模式 - 克隆 clone(实现 Cloneable 接口)
- 单例模式 - Runtime 类
- 迭代器 - 遍历集合 resultSet
- 策略模式 - 不同的 Comparator 体现不同的策略
- 过滤器 - 责任链模式
- 建造器 - sqlSessionFactoryBuilder
- 装饰 - new BufferedReader( FileReader ) 不是通过继承,通过组合方式扩展类的功能