Java基础知识点总结(1)
1.面向对象和面向过程的理解
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低 耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
2.Spring Ioc
所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
一、IoC Container帮我们在项目运行时动态的创建实例,它主要功能如下:
动态创建、注入依赖对象
管理对象生命周期
映射依赖关系
IoC Container技术实现的原理就是“反射(Reflection)”。利用反射动态的创建对象,把依赖关系注入到指定对象中。一般常用的注入方式是构造函数注入和属性注入
二、Service Locator模式
服务定位模式也是IoC理念的一种实现。
实现原理:通过ServiceLocator类提供实现IServiceLocator接口的单例,并负责管理已注册实例的创建和访问。通常结合工厂模式来结合使用。
Service Locator与IoC Container都是IoC的具体实现方式。不同的是Service Locator没有提供管理对象生命周期的功能
3.动态sql,以及.ajax的post和get的区别
4.System.out.print 的理解
System.out.println() 可以不写参数
System.out.print(参数) 参数不能为空.必须有
5.mybatis的配置, springmvc注解;
6.面向对象(OOP )基本特征
抽象、继承、封装、多态
7.servlet
生命周期
init() : -默认情况下,第一次被访问时,Servlet被创建,然后执行init方法;
service() : 提供服务:执行service方法,执行多次
destory() : 当Servlet服务器正常关闭时,执行destroy方法,只执行一次
四大作用域request域,session域,application域,page域
8.九大内置对象
requset,response,session,application,config,exception,out,page,pageContext
9.mybatis
MyBatis 是支持定制SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
1. Mybatis分页
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
2. Mybatis 缓冲机制
mybatis的缓存分为两级:一级缓存、二级缓存
一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效
二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的
以及缓冲:mybatis的一级缓存是SqlSession级别的缓存,在操作数据库的时候需要先创建SqlSession会话对象,
在对象中有一个HashMap用于存储缓存数据,此HashMap是当前会话对象私有的,别的SqlSession会话对象无法访问。
具体流程:
1.第一次执行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来
2.第二次执行select会从缓存中查数据,如果select相同切传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率
二级缓存:
二级缓存是mapper级别的缓存,也就是同一个namespace的mappe.xml,当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域
二级缓存默认是没有开启的。需要在setting全局参数中配置开启二级缓存
conf.xml:
<settings>
<setting name="cacheEnabled" value="true"/>默认是false:关闭二级缓存
<settings>
在userMapper.xml中配置:
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
当前mapper下所有语句开启二级缓存
这里配置了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而却返回的对象是只读的
若想禁用当前select语句的二级缓存,添加useCache="false"修改如下:
<select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">
具体流程:
1.当一个sqlseesion执行了一次select后,在关闭此session的时候,会将查询结果缓存到二级缓存
2.当另一个sqlsession执行select时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能
mybatis-config.xml
<configuration>
<settings>
<!-- 下划线转驼峰式 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 显示sql语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启懒加载 -->
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载,即延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 环境 : 连接数据库的信息 -->
<environments default="aaa">
<environment id="aaa">
<!-- 事务管理器: jdbc -->
<transactionManager type="JDBC"/>
<!-- 数据源: 查询type有哪些值 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加载关系映射配置文件 -->
<mappers>
<mapper resource="mappers/EmpMapper.xml"/>
<mapper resource="mappers/DeptMapper.xml"/>
</mappers>
</configuration>
app.java
public class App2{
public static void main( String[] args ) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//
SqlSession sqlSession = sqlSessionFactory.openSession();
//
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
Dept dept = deptMapper.getDeptById(1);
System.out.println(dept.getDeptName());
//sqlSession.commit();
sqlSession.close();
}
}
10. Spring
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.
Spring框架由七个定义明确的模块组成
Spring aop ,Spring dao , Spring context , Spring ORM ,
Spring Web,Spring web mvc,Spring Core(核心容器)
11. Spring MVC
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,
通过把Model,View,Controller分离,将web层进行职责解耦,
把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合
8. Spring MVC的请求流程:
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
12. 更多JAVA基础题
https://blog.csdn.net/weixin_43495390/article/details/86533482
13.java中实现多态的机制是什么?
官方:
接口的多种不同的实现方式即为多态。
多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术。
我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。
就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。
通俗说法:
允许将子类类型的指针赋值给父类类型的指针,把不同的子类对象都当作父类来看。比如你家有亲属结婚了,让你们家派个人来参加婚礼,邀请函写的是让你爸来,但是实际上你去了,或者你妹妹去了,这都是可以的,因为你们代表的是你爸,但是在你们去之前他们也不知道谁会去,只知道是你们家的人。可能是你爸爸,可能是你们家的其他人代表你爸参加。这就是多态。
多态的实现机制
原理也很简单,父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。
14. list 、Set、Map
15. jsp 四种会话跟踪技术是什么?
就是jsp四大作用域