Hibernate
1、ORM映射。
对象模型和关系模型的映射关系。也就是说,哪个类对应哪个表,哪个属性对应哪个列。而我们做持久层的目的就是完成对象模型和关系模型的数据转换。
2、hibernate优点和缺点。
优点:
Hibernate是一种开放源代码的对象/关系映射持久层框架
事务处理,生命周期管理不依赖于J2EE容器
解决数据库的方言问题
hibernate只需要操作对象就可以完成数据库的增、删、改、查操作。使用hibernate更面向对象
轻量级、无侵入性,移植性很好
缺点:
不适用于批量对对象进行操作时
不能使用数据库特定映射
表间关系很复杂时,会造成性能问题
3、hiberante环境的搭建
4、hibernate的编码。SessionFactory、Session、Query接口的使用。事务的开启、回滚、提交。
5、主键生成策略。
increment:由hibernate来生成主键。数据库可以不是自动增长列,不能用于集群。
identity:利用DB2、sqlserver、mysql的自动增长列来产生主键。
sequence:利用oracle的序列产生主键。
uuid:利用UUID算法产生字符串主键。
native:根据方言描述,来决定采用identity或sequence产生主键。
foreign:使用另一个表的主键,作为当前表的主键。用于一对一的主键关联。
6、对象状态
瞬时状态:对象是新建的。数据库中没有相关的记录,不受sesion管理。
持久状态:数据库中有相关记录,受session管理。对象数据和数据库数据随时同步。
游离状态:当session一提交,数据库中有相关记录。但该对象不受session管理。
7、原生SQL查询,利用SqlQuery接口查询,使用SQL语句来查询,用于比较复杂的查询。
8、HQL查询,利用Query接口查询,利用实体类、属性来查询数据。
9、get和load的区别。
get:立即加载,无论是否使用都发出sql语句作查询。如果主键不存在时,返回null
load:延迟加载,不立即发出sql语句查询,要使用时,再发出SQL语句查询。如果主键不存在,抛出异常。
10、HQL查询中参数绑定的两种方式(参数名称:name
参数位置?,从0开始)
参数名称:
Query query=session.createQuery(
“from User user where user.name=:customername ”);
query.setString("customername","张三");
参数位置:
Query query=session.createQuery(
“from User user where user.name=? ”);
query.setString(0,"张三");
11、HQL查询中的分页。
Query query = session.createQuery("from UserInfo");
//设置起始条数,第一条从0开始。
query.setFirstResult(0);
//设置显示条数
query.setMaxResults(2);
12、hibernate的实体映射
一对一(主键关联(一个表的主键同时又是另一个表的外键,没有专门的外键列),外键关联(有专门的外键列,是唯一的,是一对多的特例))一般使用外键关联,外键可以设置为null,但主键不行。
一对多、多对多
13、掌握cascade和inverse区别。
cascade类似数据库的级联操作,主表记录更改或删除,从表记录是否做相应的操作。维护是记录。
inverse控制反转。如果为true。表示在插入当前对象时,不插入外键,外键的维护由另一方完成。一般设置在一方,外键关系一般由多方维护,维护的是外键。
14、一级缓存和二级缓存的区别。
一级缓存:(事务级缓存) 是基于 Session的生命 周期实现的,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必需的。
二级缓存:(应用级缓存)即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享.在Hibernate中,应用级缓存由SessionFactory实现
15、二级缓存的产品EHcache、Oscache。及相关的配置。查询缓存是针对查询出的集合进行缓存,由于条件不一致导致集合内容不一致,利用率不高。
16、延迟加载的概念。分为对象延迟加载(load),集合延迟加载(一对多、多对多的关联集合),属性延迟加载(clob大数据使用时)
17、连接池的概念及工作原理。(c3p0、dbcp、proxool)
传统的持久层操作中,每一次请求都要建立一次数据库连接,使用完后都得断开,以释放内存资源。频繁的数据库连接操作势必导致流操作过多,占用很多的系统资源,从而导致响应速度下降。而且不能控制被创建的连接对象数,导致系统资源被毫无顾及的分配出去,最终可能导致服务器内存崩溃。
而连接池就是为数据库连接建立一个“缓冲池”。预先在连接池中放入一定数量的连接,当需要建立数据库连接时,只需从连接池中取出一个,使用完毕之后再放回去。由于连接一直不关闭从而减少了流操作,同时可以设置最大连接数来控制所建立的连接数量,防止服务器内存崩溃。
工作流程:当持久层需要一个连接对象时,先去连接池中寻找空闲连接。找到后,将连接对象状态设置为忙碌;用完后,放回连接池后,又将连接对象状态设置为空闲。
如果连接池中没有空闲连接,则检查连接池是否到达最大连接数。如果没有到达最大连接池,则创建新连接并分配给请求的用户;如果达到了最大连接数,则等待一段时间。在等待时间内如果有连接被释放,则分配给等待用户。如果在等待时间结束后,还没有连接释放,则返回null。
18、锁机制:当多个用户同时存取或查询数据时,在一个用户操作时保证数据不被别的用户修改。
悲观锁:一个用户操作记录时不允许别的用户进行操作。类似于线程同步。效率低,适合短事务。
乐观锁:通过版本控制器实现,一个用户操作时,会记录版本号,在提交时,会检查版本号和记录版本号是否一致。如果一致,则提交,并将版本号加一;如果不一致,需要重新下载新的记录。
19、掌握注解的使用。及使用注解环境的搭建。
Spring
1、spring容器的作用
a、Spring能有效地组织并管理中间层对象,减少类与类之间的依赖,达到松耦合的目的。
b、由于spring容器中取出的对象默认是单例模式,从而可以避免单例模式在项目中过多的使用。
c、spring容器可以实现真正的面向接口编程
d、spring的AOP通过代理模式,提供面向切面编程。并提供声明性事务管理。
e、spring支持JDBC及常见的ORM框架,以及支持常见的MVC框架
2、IOC是什么?
控制反转,不直接建对象,由配置文件描述类与类的关系。采用工厂模式将各个组件组合在一起。
3、IOC注入数据的方式:
接口注入,setter注入(set方法注入),构造方法注入(利用构造方法完成属性的注入)
ioc容器通过读取配置文件进行装配
IoC把工厂方法和对象生成这两者合并在一起
IoC的目的就是提高程序的灵活性和可维护性
IoC中最基本的Java技术就是“反射”编程
4、spring环境的搭建。(aop、core、mvc、orm、web)
5、spring容器:
Bean工厂、应用上下文。
6、Bean工厂和应用上下文的区别。
应用上下文是Bean工厂的子接口,功能更为强大。
Bean工厂是延迟加载,应用上下文是立即加载。
spring容器中取出的实体对象默认是单例模式
7、应用上下文的实现类作用。
ClassPathXmlApplicationContext 从src目录下查询配置文件。
FileSystemXmlApplicationContext 从工程下查询配置文件(只能用于java项目)
XmlWebApplicationContext 从web项目的目录下查询配置文件(只能用于web项目)
8、
bean装配的方式,value和ref的含义。
value是直接赋值,ref引用已经注册的bean。
bean默认是单例模式。利用scope="prototype"singleton="false"提供多实例。
bean的装配支持数组、List、Set、Map、Properties
bean标记提供基本类型、包装类、String、Resource类型(物理提供的资源)注入。不支持如date等复杂类型注入。
9、bean中id和name的区别。
id唯一,不能有特殊字符。name可以为一个bean建多个name。并可以有特殊字符。如果在整合Struts1时,必须用name
10、了解如何通过构造方法注入。
利用实体类的构造方法完成属性值的注入。
<constructor-argindex="0">
<value>aaaa</value>
</constructor-arg>
需要依赖实体类的构造方法。在创建对象时进行属性值注入。
相比而言,利用setter注入更为灵活
11、熟练掌握动态代理和静态代理代码的实现。
12、掌握AOP相关的术语。
切面(Aspect):要实现的交叉的非核心业务功能
通知(advice):通知切面的实际实现代码
目标对象(target):被通知的对象
代理对象(proxy):将通知应用到目标对象后创建的对象
切入点(Pointcut):定义通知应用在哪些连接点
13、掌握通知类型:
前置通知(方法执行前)
返回后通知(方法正常执行后执行。有异常不执行)
后通知(方法执行后,无论是否有异常都会执行)
环绕通知(方法执行前和方法执行后都附加逻辑)
抛出异常通知(异常抛出后)
14、ProxyFactoryBean 用于产生代理对象。PointCut用于产生切入点。
15、掌握通过自动代理+注解方式实现AOP。
通过自动代理,配置代码更少,程序代码可读性更好,更简洁,但性能较低
自动代理:<aop:aspectj-autoproxy/>
前置通知:@Before("execution(* com..*.*(..))")
返回后通知:@AfterReturning("execution(* com...*.*(..))")
环绕通知:@Around("execution(* com.lovo..*.*(..))")
ProceedingJoinPoint point;
Object targetObj = point.getTarget();//得到目标对象
Object returnObj = point.proceed();//执行目标方法
抛出异常通知:
@AfterThrowing("execution (*com.lovo.bean..*.*(..))")
16、熟练掌握SSH整合的步骤。
17、可以利用DataSource标记提供数据库连接,代替hibernate基本配置文件的设置。同时可以通过dbcp连接池的设置提高效率。
18、spring事务管理
利用HibernateTransactionManager定义事务管理器
spring可以利用@Transactional注解实现事务。
利用AOP环绕通知,通过代理模式实现事务管理。
19、单例模式
public class Single{
privatestatic Single s = new Single();
private Single(){}
public static Single getSingle(){
returns;
}
}
20、web容器加载spring的方式:
ContextLoaderServlet 利用servlet加载
ContextLoaderPlugIn 利用struts插件加载
ContextLoaderListener 利用监听器加载
利用这些方式读取spring相关的配置文件,从而加载spring容器管理的各个组件。
21、理解三层架构
三层架构是一种架构模式,指的是表现层、业务层、持久层。
持久层:采用DAO模式。建立实体类和数据库表映射。将类和表,属性和列建立映射关系。也就是说,哪个类对应哪个表,哪个属性对应哪个列。而持久层的目的也就是完成对象数据和关系数据的转换。
业务层:采用事务脚本模式。将一次请求的内容封装成一个方法,保证该方法中所做的数据库更新操作同时成功同时失败,从而避免数据混乱。
表现层:采用MVC模式。M为模型,也就是实体类,作用是封装和传输数据。V为视图,也就是jsp和html,负责展示数据。C为控制,也就是servlet和Action,负责业务流程的控制及业务组件的调用
SpringMVC
1、掌握springMVC的特点。
spring MVC是一个基于MVC模式的表现层框架,在spring2.5以后新增了注解功能。和同类的MVC表现层框架相比,有如下特点:
1、基于的是servlet/jsp模式
2、控制器不在需要继承其它类,只需要用@Controller注解
3、不需要有formbean之类的对象了,方法参数中需要的页面值,可通过@RequestParam直接从页面请求中获得。
4、控制器方法签名定义灵活。
5、返回页面直接在方法中指定,可以是String,也可以是其它的,比如:ModelAndView或void等。
6、性能也很优秀,性能高于struts2,和struts1相当。
2、springMVC环境的搭建。
导入相关的jar包
注册前端控制器DispatcherServlet。需要指明spring配置文件路径
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
默认情况下:DispatcherServlet会寻找WEB-INF下,命名规范为[servlet-name]-servlet.xml文件。也可以通过init-param改变默认配置
在spring 配置文件中,加入
<mvc:annotation-driven/>提供对spring mvc注解、验证支持
<context:component-scanbase-package="com.lovo.action"/>扫描指定文件夹中的@Controller类,读取类中的注解。该标签可以加入多个,以读取不同文件夹中的类
3、springMVC的工作流程
在springMVC中存在两种控制器:前端控制器和应用控制器。
前端控制器(DispatcherServlet),负责接收客户端请求,根据请求路径访问应用控制器,负责将页面参数填充javabean,负责转发页面,对标签类进行调用。
应用控制器(用户书写的Action),负责产生业务组件,调用业务组件的方法完成业务,根据结果返回转发的页面对象
工作流程:
当客户端以XX.do请求服务器,服务器使用前端控制器DispatcherServlet接收请求。DispatcherServlet借助HandlerMapping,根据请求的URL路径,定位到具体的Controller。
和应用控制器的具体方法。并将封装好数据的实体对象传入应用控制器方法。由应用控制器方法,完成业务组件的业务方法的调用,然后根据业务方法处理的结果,返回需要转发的页面路径。DispatcherServlet根据路径,完成页面转发。
4、应用控制器的使用。
应用控制器类前加入@Controller,注册为应用控制器,默认为单实例。
a、
@RequestMapping("/reg")
publicString mytest() throws Exception{
……
}
客户端请求路径为/reg.do
b、
@RequestMapping("/test")
public class UserAction {
@RequestMapping("reg")
publicString mytest() throws Exception{
……
}
客户端请求路径为/test/reg.do
5、Spring MVC方法签名
a、
public String mytest(
@RequestParam(value="name")String userName,接收客户请求参数name赋值给形参userName
int age , 如果请求参数名和形参名一致,可以不写@RequestParam
HttpServletRequest request, 请求对象
HttpServletResponse response 响应对象){
}
b、
@RequestMapping("ps/{id}",method=RequestMethod.GET")
publicString test(
@PathVariable("id")int myid){
}
<a href="ps/1.do">访问</a>
该请求只能处理GET方式。
利用PathVariable("id")得到路径参数数据
c、
@RequestMapping("/reg")
publicString test(
@RequestParam(value="tid",defaultValue="2")intid){
}
页面上提交tid的键值对,将值赋值给id参数。如果页面没有提交tid的键值对,那么默认将defaultValue的值赋值给id。
d、
@RequestMapping("/reg")
publicString mytest(
@ModelAttribute("user") UserBean bean,将请求参数的值赋给bean对象。同时将bean放置在request中。等价于request.setAttribute("user",bean);
){
return "/index.jsp";表示执行完该方法后,内部转发至index.jsp
// return "redirect:/index.jsp";重定向到index.jsp
}
6、自定义转换器
Spring类型转换器分为:局部类型转换器和全局类型转换器
全局类型转换器
public class DateConverter implementsConverter<String, java.util.Date>{
publicDate convert(String arg0) {
SimpleDateFormatdateFormat = new SimpleDateFormat("yyyy-MM-dd");
Datedate = null;
date= dateFormat.parse(arg0);
returndate;
}
}
applicationContext.xml:
<mvc:annotation-drivenconversion-service="tc"/>
<bean id="tc"class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<beanclass="com.lovo.util.DateConverter"/>
</list>
</property>
</bean>
7、文件上传
@RequestMapping("/reg")
publicString register(HttpServletRequest request,
@RequestParam("head")CommonsMultipartFile mFile) head为表单名
{
String fileName = mFile.getOriginalFilename();上传文件名
ServletContext context =request.getSession().getServletContext();
String path = context.getRealPath("face")+"/"+fileName;
mFile.transferTo(new File(path)); ;//写入数据
}
在spring配置文件中加入上传组件支持
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
8、异常处理
public class MyHandler implements HandlerExceptionResolver{
publicModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,Exception ex) {
//转向出错页面
return newModelAndView("/error.jsp");
}}
9、spring和springMVC整合
需要分成springMVC的配置文件和spring基本配置文件
spring 基本配置文件一般为和持久层框架整合信息
<!-- 扫描指定包中的spring注解类 -->
<context:component-scanbase-package="com.lovo.service">
</context:component-scan>
springMVC配置文件一般配置springMVC相关的信息
<context:component-scanbase-package="com.lovo.action">
</context:component-scan>
在web容器加载时,在上下文监听器中加载spring基本配置文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-base.xml</param-value>spring基本配置文件路径
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
在注册springMVC前端控制器时,加载springMVC配置文件
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-action.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Mybatis
1、mybatis特点:
mybatis是一种持久层框架,也属于ORM映射,前身是ibatis。
相比于hibernate,hibernate为全动自动化,配置文件书写之后不需要书写SQL语句,但欠缺灵活,很多时候需要优化
mybatis为半自动化,需要自已写SQL语句,需要自己定义映射。增加了程序员的一些操作,但带来了设计上的灵活
mybatis为对数据库的兼容性比hibernate差。移植性不好,但可编写灵活和高性能的SQL语句
2、mybatis环境搭建。
3、命名空间
在orm映射文件根元素下加入
<mapper namespace="user">
设置命名空间
命名空间的作用:
更好地分类SQL语句块,更好维护
防止SQL语句块重名
在设置了命名空间后,那么在相应的程序调用中,方可以使用 “命名空间 . 语句块名”进行调用相应的sql语句。
4、resultMap和resultType的使用
resultMap可以定义属性和数据库列的对应关系,提高重用性,其它查询语句也可以引用。
<resultMapid="resMan" class="com.lovo.bean.ManBean">
<result property="manId"column="id"/>
</resultMap>
书写SQL引用结果集
<selectid="findAll" resultMap="resMan">
select* from t_man
</select>
resultType为查询返回的类型,只能查询基本信息,不能查询关联信息,只能在属性名和列名相同时使用。
<selectid="all" resultClass="users">
select *from t_user
</select>
5、条件查询
mybatis同时支持parameterType和Map集合提供参数
parameterType方式:
<selectid="findByName" resultType="man" parameterType="user">
select * from t_man where userName like#{userName}
</select>
Map方式:
<selectid="findUserByName" resultType="user">
select *from t_user where id=#{id};//引用Map的id键对应的值
</select>
MapqueryMap = new HashMap();
queryMap.put("id",3);
List<UserBean>list = this.getSqlSessionTemplate().
selectList("findUserByName",queryMap);
6、条件查询SQL语句的书写
如果在SQL语句中有特殊字符,可以在CDATA块中书写。
<![CDATA[
select * from t_man wherebirthday < #{birthday}
]]>
7、$和#的区别
#在生成SQL时,对于字符类型参数,会拼装引号
$在生成SQL时,不会拼装引号,可用于orderby之类的参数拼装
8、批量操作和foreach标签
<deleteid="delManyMessage" parameterClass="message">
delete from t_message whereid in(
<foreachcollection="ids" item="id" separator=",">
#{id}
</foreach>
)
</delete>
collection为用于遍历的元素(必选)
item表示集合中每一个元素进行迭代时的别名.
separator表示在每次进行迭代之间以什么符号作为分隔 符.
9、动态SQL
当查询条件需要动态生成时,需要使用动态SQL
<selectid="dynaFindUser" resultMap="user">
select * from t_user where1=1
<if test="id !=0">
and u_id > #{id}
</if>
<if test="userName !=null">
and u_userName like'%${userName}%'
</if>
</select>
10、掌握一对多、多对多关系映射配置
<!-- 属性名resultList 类型为List集合
column是本表要传入的select语句块中的参数,集合查询的sql语句id定义为resultByUid-->
<collectionproperty="resultList" column="t_id"select="resultByUid"/>
11、掌握mybatis和spring整合
dataSource定义数据源DriverManagerDataSource。
配置核心对象sqlSession
配置事务管理器DataSourceTransactionManager
12、掌握动态分页查询
使用<includerefid="dynaUserSql"/>
链接已存在的sql语句块<sqlid="dynaUserSql">