1.内连接 外连接区别
内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。由于内连接是从结果表中删除与其他连接表中没有匹配的所有行,所以内连接可能会造成信息的丢失。
内连接语法如下:
select fieldlist from table1 [inner] join table2 on table1.column = table2.column
等价于
select table1.fieldlist from table1,table2 where table1.column = table2.column
1、内连接(自然连接):
INNER JOIN[JOIN]
只有两个表相匹配的行才能在结果集中出现
2、外连接:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
2.描述一下springMVC的工作流程
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
SpringMVC的工作流程:
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
组件:
1、前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet减少了其它组件之间的耦合度。
2、处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View(需要程序员开发jsp)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
3.一级缓存和二级缓存的区别
Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。
Mybatis二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。
开启二级缓存步骤:
1.在核心配置文件SqlMapConfig.xml中加入
<setting name="cacheEnabled" value="true"/>
| 描述 | 允许值 | 默认值 |
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置。 | true false | true |
2.在对应的Mapper.xml中开启二级缓存,即:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<!-- 开启本mapper的namespace下的二缓存
type:指定cache接口的实现类的类型,mybatis默认使用PerpetualCache
要和ehcache整合,需要配置type为ehcache实现cache接口的类型
-->
<cache />
<!-- 下面的一些SQL语句暂时略 -->
</mapper>
3.二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口,即:
二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作,注意如果存在父类、成员pojo都需要实现序列化接口。
public class Orders implements Serializable
public class User implements Serializable
....
4.Java JDK1.5 之后 switch语句 支持的类型
Java支持的数据类型有五种
他们分别是:
byte、char、short、int、enum;
以上是JDK1.6以前的版本。
JDK1.7时,又增加了String
public class Test {
public static void main(String[] args) {
switch ("111") {
case "111":
System.out.println("111111111111111");
break;
default:
break;
}
}
}
5.Java中断线程的三种方式
1、interrupt()
2、isInterrupted()
3、interrupted()
参考文章:https://www.jb51.net/article/128207.htm
6.set是否可放入重复数据?不能的话是如何实现不放入重复数据的?
1.Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
放入Set集合中的对象必须重写equals()(实际内容)和hashCode()(内存地址)方法。
2.应该说set不允许键(key)重复,但是允许(值)value重复
Set 的add方法:
比较的是对象的hashCode方法返回的值重写hashCode方法就必须重写equals方法(java中自定义对象的比较原理)
对象的比较:
add方法的参数是个对象。集合会调用这个对象的equals、hashCode方法和已经存在的对象比较
hashCode先比较,如果一样再调用equals
//set.add新添加对象的内部原理
MyClass c2=new MyClass(2);
for(Object myclass:set){
if(myclass.hashCode()==c2.hashCode()){
if(myclass.equals(c2)){
return;
}
else{
//equals不一样也添加成功
}
}
else{
//hashCode不一样直接添加成功
}
}
//HashSet 使用add方法过滤重复,使用hashCode、equals方法