一、Hibernate:
1. Jdbc操作数据库表
2. Hibernate是一个对象关系映射的持久层框架,对Jdbc封装后的产物,特点是:操作实体类,就相当于操作了数据库表。
3. 有两个配置文件:
映射文件:实体类名.hbm.xml
(1)配置了实体类与数据库表的映射关系,
配置表与表之间的关系。
(2)主要标签:
<hibernate-mapping>
<class> //声明实体类与数据库表名
<id> //声明主键及生成策略
<property> //声明实体类属性与数据库表列
</class>
</hibernate-mapping>
主配置文件:hibernate.cfg.xml
(1)配置SessionFactory,其中包括数据库信息、Hibernate基本配置和映射文件位置,与Spring
整合后由Spring管理这些对象。
(2)主要标签:
<hibernate-configuration>
<session-factory>
<property> //声明数据库连接信息(数据源),声明Hibernate基本配置,比如:是否输出SQL语句、采用何
种方式生成表结构...
<mapping> //声明映射文件位置
</session-factory>
</hibernate-configuration>
4.Hibernate的主要对象解析?
SessionFactory:
重量级对象,线程安全,主要用于Session初始化,同一个工厂生产的Session共享工厂数据,它还维护着Hibernate的二
级缓存。
Session:
Session用于操作数据库,还可以获取事物对象(transaction),它维护着Hibernate的一级缓存,是一个轻量级、线程不
安全的对象。
注:(1)使用factory.openSession();方法时,为了保证Session线程安全,需要把Session绑定到当前线程,配置即可。
(2)Session的get()和load()的区别?
Get()即立即查询;而Load()查询返回的是一个代理对象,仅初始化了OID属性值,当需要用到其余字段时才去执行
查询。
5.Hibernate的对象状态?
①.对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象
②.瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,当对象是持久化对象时,那么对
该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句
③.离线对象就是,数据库存在该对象,但是该对象又没有被session所托管
6.什么是事务,什么时候要用事物?
(1)涉及到DML(增删改)语句就要使用事务控制
(2)事务的4个特性:原子性、一致性、隔离性、持久性
(3)事物的隔离机制:
7.Hibernate的5中查询方式?
(1)根据Id查询,即Session的get()和load()方法
(2)对象导航查询,即两个实体有关联时,可以通过一个实体获取另一个实体数据
(3)HQL查询:
Session.createQuery(String sql);
特点:类名称代替表名,类属性代替表字段
(4)QBC查询:
Session.createQuery(实体类字节码);
特点:将查询条件优化为方法
注:QBC查询的离线对象
(5)原生SQL查询:
Session.createSQLquery(String sql);
8.Hibernate中的级联操作?
(1)表关系表述:
//一对多
<set name="集合属性名称" cascade="" inverse="false" >
<key column="外键"></key>
<one-to-many class="集合属性所对应实体类类型"/>
</set>
//多对一
<many-to-one name="属性名称" class="属性所对应实体类型" column="外键" />
(2)级联操作:
Cascade属性:取值为save-update,表示级联保存(对象)
取值为delete,表示级联删除(对象)
Inverse属性:只出现set标签上,是否维护关系(外键)
Fetch属性:查询的方式
lazy属性:查询的时机
注:1、当lazy="true" fetch="select" 时,使用延迟策略,只查询出一端实体,多端的不会查询,只有当用到的时候才会发出
sql语句去查询。
2、当lazy="false" fetch = "select" 时,没有使用延迟策略,同时查询出一端和多端,同时产生1+n条sql。
3、当fetch = "join"时,不管lazy设置为什么,这个时候延迟已经没有什么用了,因为采用的是外连接查询,同时把一
端和多端都查询出来了。
二、struts2
1.struts2用于数据展示的表现层框架,底层是Filter,基于类开发,每个Action都是多例的。
2.Servlet和Filter和区别?
共同点:
都能处理Url请求,分别通过service();和doFilter();实现
不同点:
Servlet创建:请求第一次到达Servlet
Filter创建:应用加载时创建
Servlet可以通过览浏器访问 ;Filter无法通过浏览器访问。
3. Struts2的执行流程?
(1)Url请求先找到web.xml中配置的struts2的前端总控制器StrutsPerpareAndExecuteFilter ,通过<url-pattern>标签进入
Filter
(2)找到struts.xml中的action标签明确Action及执行方法
(3)将结果返回页面或Action,根据struts.xml中的<result>标签完成页面或Action跳转
4. struts2的Action类功能及创建?
struts2默认Action类是ActionSupport,默认方法是excute();所以我们创建Action一般要继承Action接口或Action类的实现类
ActionSupport类。
注:public string 方法名(); 可以不使用execute()方法
5. struts2如何封装请求参数?
属性驱动:
提供跟表单属性一直的set()和get()方法
模型驱动:
必须实现ModelDriven接口,自行实例化对象,并实现抽象方法(返回值就是我们实例化的对象)
6.struts的配置文件struts.xml?
<struts>
<constant> 用于设置struts2的一些特性,name属性取值 struts.devMode :开启开发者模式
struts.action.extension:修改默认拦截后缀
<package> 设置包属性,比如extends属性取值struts-default,我们的包就继承了struts的核心功能;namespace属性
设置名称空间
<action> 用于建立与Action类、方法的对应关系
<result> 根据返回值跳往指定页面或Action,tape属性指定请求转发或重定向
<package>
<struts>
7.struts2如何获取三大域对象和ValueStack对象?
Struts2提供ActionContext工具类,通过ActionContext.getContext(); 获取ActionContext对象
8.struts2如何自定义拦截器?
(1)自定义拦截器类继承interceptor接口的实现类MethodFilterInterceptor类
(2)在struts.xml中声明拦截器并配置全局结果视图
9.struts2的页面取值?
1)EL表达式:将对象放到3大域中,直接使用${ }取值
2)OGNL表达式(配合struts2标签):
1.Struts2的数据都封装OGNL上下文中,Map数据结构,key值包括request、session、application、ValueStack ...
2.在值栈中取值即取根元素值不用加#号: <s:property value="user.name"/>
3.在3大域中取值即非根元素值需加#号:<s:property value="#session.Session_data"/>
4.OGNL表达式中%的作用:
用于通知执行环境%{}里的是OGNL表达式:<s:property value="%{#session.Session_data}"/>
三、Spring
1.Spring的AOP及具体应用?
Aop原理:
将重复代码提取出来,运用代理方式增强目标方法
具体应用:Spring事物
(1)Spring配置事务有编程式和声明式事务两种,声明式事务中包括注解式事务和配置文件式事务两种
(2)配置文件式事物详解:
第一步:在Spring配置文件中创建transactionManager
第二步:配置事务通知,声明所需事务方法的事务隔离级别、传播行为和是否只读
第三步:配置切点,声明方法所属包
第四步:配置切面,将通知织入切点
2.Spring的IOC和DI?
IOC即控制反转,是一种思想,而DI即依赖注入是具体实现。我们将对象的创建及维护交给了IOC容器,有别于我们传统new
的方式;而DI技术,应该从依赖和注入两方面讲,注入是为了初始化对象,有两种方式:构造方法和set()方法注入;依赖是
指对象依赖关系,比如Service层对象和Dao层对象。
四、SpringMvc
1.SpringMvc的运行流程?
(1)用户请求先找到web.xml中配置的Spring前端控制器DispatcherServlet
(2) 处理器映射器:完成Url与目标方法的映射,将获取到的Handler返回控制器
(3) 处理器适配器:执行处理器Handler,处理请求后返回ModelAndView到控制器
(4) 视图解析器:将view对象返回控制器(Url)
(5) DispatcherServlet将视图渲染,响应请求
2.SpringMvc的注解式开发?
(1)首先配置Spring注解开发:< context:component-scan base-package = "包路径" />
该标签的作用是:扫描指定包下的类,注册被@Component,@Controller,@Service,@Repository等注解标记的组
件。
(2)配置SpringMvc注解驱动:< mvc:annotation-driven />
该标签的作用是启用注解驱动,Spring会自动注册RequestMappingHandlerMapping 、
RequestMappingHandlerAdapter、ExceptionHandlerExceptionResolver对象来映射并处理请求及异
常,也是@Controller注解使用的前提配置。
(3)配置注解支持:
<context:annotation-config/>
(4)常用注解:
@RequestMapping :用于处理请求地址的映射,value属性指定请求路径、method属性指定请求方式等6个属性
@Resource和@Autowired:都用于bean对象的注入使用,@Resource有name和type两个属性,默认按照
ByName注入,也可以使用ByType注入;而@Autowired只能类型注入
@ResponseBody:不需要返回视图,而是返回Json数据时用。
@RequestParam :获取绑定的请求参数(get方式)
@PathVariable :获取路径中的参数
3. SpringMvc支持的方法参数类型?
(1)HttpServlet对象,主要包括HttpServletRequest、HttpServletResponse和HttpSession对象,需要使用时声明即可。
(2)使用@PathVariable 、@RequestParam标记的参数。
(3)通过bean来接收表单数据
(4)Model和ModelMap,用于封装模型数据,展示数据
(5)Spring封装的MultipartFile,用来接收上传文件的
4.SpringMvc支持的返回值类型?
ModelAndView 、ModelMap、View、字符串(即视图名称)、void
5.SpringMvc与struts2的区别?
(1)springmvc的入口是servlet即前端控制器,而struts2入口是一个filter过虑器。
(2)springmvc是基于方法开发即一个url对应一个方法,建议单例,struts2是基于类开发,传递参数是通过类的属性,只能
设计为多例。
(3)Struts采用值栈存储响应数据,通过OGNL取出数据, springmvc将数据和视图封装成ModelAndView对象,由控制器渲
染后响应页面。
6. SpringMvc中的自定义拦截器?
SpringMvc使用HandlerInterceptor接口实现请求拦截,该接口定义了3个方法,实现了方法前拦截、处理完请求返回结果
前拦截、方法后拦截功能。
自定义拦截器--->配置拦截器--->配置拦截Url
7.SpringMvc中的文件上传?
Spring提供了文件解析器CommonsMultipartResolver,在from表单上添加enctype="multipart/form-data",解析器会自
动识别;在Controller中使用MultipartFile对象来接收文件对象。
8.SpringMvc中的自定义异常?
(1)Java的异常处理机制?
Java的异常可以是方法中语句执行引发,也可以手动抛出,通常出现异常时,我们就用一个Java定义的异常类封装异
常,Jvm会自动寻找异常处理程序来处理异常。
(2)Java中的异常分类?
Throwable是异常的顶层父类,由它派生出Erro类和Exception类,Erro类代表Jvm本身错误,不能被我们处理的错误;我们
主要关注的是Exception类,我们可以通过代码规避的异常。
运行时异常:
RuntimeException及其子类,这类异常不要求我们必须处理,一般是代码问题,比如错误的类型转换
(ClassCastException)、数组索引越界(ArrayIndexOutOfBoundsException)、空对象异常(NullPointerException)...
非运行时异常:
除了Error 和 RuntimeException的其它异常。这类异常强制要求的异常,在方法中要么用try-catch语句捕获它并处理或抛
出,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。
(3)自定义异常类?
自定义异常类扩展Exception类即可,按照国际惯例,自定义异常类 包含一下一种或几种构造函数:
· 一个无参构造函数
· 一个带有String参数,并传递给父类的构造函数。
· 一个带有String参数和Throwable参数,并都传递给父类构造函数
· 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
(4)SpringMvc自定义异常解析器类?
SpringMvc中使用HandlerExceptionResolver 接口实现异常捕获,我们需要实现resolveException();如果是系统异常则
强制转换Exception异常返回,不是则返回自定义异常信息。
注:别忘记在springmvc.xml配置
五、Mybatis
1.Mybatis的开发流程?
Mybatis与Hibernate一样是封装了Jdbc,是针对数据库操作的框架,在Mybatis中的主要对象是sqlsessionFactory,由它生产的SqlSession对象封装了对数据库的所有操作,开发中有两种方式,传统的Dao层开发和Mapper接口代理的方式,其中区别就是一个有实现类一个没有,但代理式开发需要注意接口方法要与mapper.xml中的配置一一对应。
2.sqlMapConfig.xml主配置文件中使用较多的标签?
(1)<bean>:sqlsessionFactory对象,配置了数据源、主配置文件位置等
注:SqlSession中封装了对数据库的操作。
注:该标签用于Spring的配置文件
(2)<typeAliases> :别名,简写冗长的JAVA 类名。
注:在mapper.xml文件中,定义很多的statement,statement需要 resultType指定输出结果的映射类型。
(3)<plugins>:配置插件
(4)<environments>:配置mybatis环境
(5)< mappers>:映射器(mapper.xml子配置文件的路径)
(6)<settings>:是指定MyBatis的一些全局配置属性,如:开启驼峰映射等
3.Mapper.xml子配置文件?
(1)Dao层接口与mapper.xml的关联?
1、接口与其对应的xml文件必须放同一包下
2、Mapper.xml文件中的namespace与mapper接口的类路径相同,保证唯一性
3、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
4、Mapper接口方法的输入参数类型和mapper.xml中的每个sql 的parameterType的类型相同
5、Mapper接口方法的输出参数类型和mapper.xml中的每个sql的resultType的类型相同
(2)实体类与表的映射及关联关系?
注:当实体类间存在关联关系时,也需要在<resultMap>标签中表述
(3)Mapper.xml中配置了什么?
要执行的sql语句
4. mybatis的通用mapper和分页插件?
(1)通用mapper?
优点:
通用mapper是mybatis的一个插件,封装了对数据库操作的方法,针对一些简单的增删改查时,就不用再编写
mappe.xml,简便开发。
缺点:
只能单表查询,需要多表时,就只能通过编写mapper.xml实现。
使用:
1.mybatis主配置文件中配置通用mapper插件
2.Dao层接口需要实现Mapper接口
3.修改pojo,实现与数据库表的映射,通过JPA注解:(如:@Id、@Column)
注:JPA是Hiberbate注解式开发所必须的,Hibernate是JPA的一种实现。
亮点方法:
updateByPrimaryKeySelective(Obj);会忽略null,使用时直接把需要修改的属性设置到对象即可。
(2)分页插件?
分页插件是基于mybatis的一个分页工具。
使用:
1.mybatis主配置文件中配置分页插件
2.PageHelper分页插件拦截器类,
-->PageHelper.startPage();开启分页,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页。
参数:当前页和每页显示的条数
3.PageInfo类封装了分页信息,需要用到分页信息时,用PageInfo对结果进行包装即可