一、Hibernate

3. Hibernate的开发流程是怎么样的,为什么要用?

· 第一步:加载hibernate的配置文件,读取配置文件的参数(jdbc连接参数,数据库方言,hbm表与对象关系映射文件)
· 第二步:创建SessionFactory会话工厂(内部有连接池)
· 第三步:打开session获取连接,构造session对象(一次会话维持一个数据连接,也是一级缓存)
· 第四步:开启事务
· 第五步:进行操作
· 第六步:提交事务
· 第七步:关闭session(会话)将连接释放
· 第八步:关闭连接池

7. get和load区别?

get如果没有找到会返回null,load如果没有找到会抛出异常。
get会先查一级缓存,再查二级缓存,然后查数据库;load会先查一级缓存,如果没有找到,就创建代理对象,等需要的时候去查询二级缓存和数据库。(这里就体现load的延迟加载的特性。)

8. Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?

SessionFactory就是一个用于创建Hibernate的Session对象的工厂。SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。作为一个单个的数据存储,它也是线程安全的,所以多个线程可同时使用同一个SessionFactory。

9.Hibernate中的Session指的是什么? 可否将单个的Session在多个线程间进行共享?

Session代表着Hibernate所做的一小部分工作,它负责维护者同数据库的链接而且不是线程安全的,也就是说,Hibernage中的Session不能在多个线程间进行共享。

二、Spring

1. 谈谈你理解的spring的工作流程的理解?

l 创建配置文件applicationContext.xml
l 编写配置文件(加入一些对象的配置信息)
l Spring内部采用工厂模式,配合xml解析+反射技术,可以根据用户的配置,生成相应的对象
l 工厂提供一个getBean方法,从工厂中获取对象
l 操作对象的方法,属性

2. 说说spring对象创建的三种方式。

1.无参构造2.实例工厂 3.静态工厂<关于创建方式的描述,同学们自己组织一下自己的理解进行添加>

3. 不使用注解的情况下,如果给对象注入值的话,你知道的有几种方式?常用的是哪些?

1.set注值(重点) 2.构造器注值 3.P名称空间注值 4.Spel注值 5.注入java复杂类型6.注入对象类型(重点)aa
我常用的是set注值和对象类型注值。
Set 我们通过配置文件给对象(User)赋值,就相当于我们使用对象里边属性的set方法给对象设置值。
image.pngimage.pngimage.png
对象类型注值 使用ref表示注入一个已经存在的对象(默认还是调用set方法注入)

4. Spring有注解方式和xml配置两种,两者有什么区别?你常用spring注解有哪些?

我在公司主要使用的是注解开发,能够提高开发效率,在配置文件中把相关的注解扫描配置好,我们只要在自己写的类或者代码上边添加对应的注解就把事情解决了。
注解开发
1)创建对象
导入jar包(IOC基本)spring-aop-4.2.4.jar
导入约束context
开启注解扫描
在要创建的对象上使用注解@Component @Repository @Service @Controller
如果要产生对象是多例@Scope(value=”prototype”)
2)注入对象
在service有dao的属性
在dao的属性上加注解 @Autowired 按类型注入
@Reosource(name=””) 按bean的id注入

5. 谈谈spring的事务管理

spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式 主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.·
声明式:使用TransactionProxyFactoryBean:PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly
围绕Poxy的动态代理 能够自动的提交和回滚事务

6. spring原理

①IoC(Inversion of control): 控制反转,依赖注入
1) IoC:
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
2) 依赖IoC容器负责管理bean,有两种,一种是BeanFactory,另一种是ApplicationContext,但是ApplicationContext继承与BeanFactory。
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean
②AOP(Aspect-Oriented Programming): 面向方面编程
1) 代理的两种方式:
静态代理:
? 针对每个具体类分别编写代理类;
? 针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
2) AOP的主要原理:动态代理实现:有两种:JDK Proxy和Cglib,Spring规定对于有接口的类用JDK Proxy,对于无接口和抽象类用Cglib,虽然Cglib均可以代理,但是Cglib复杂,效率低。但是Cglib有例外,就是代理的类中不能是final修饰的类或者类中有final方法。

7.使用Spring有什么好处?

◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了 Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。
◆Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
◆Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的avaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
◆Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
◆Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
◆使用Spring构建的应单元测试。
◆Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
◆Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
■Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
◆低侵入式设计,代码污染极低
◆独立于各种应用服务器,可以真正实现Write Once,Run Anywhere的承诺
◆Spring的DI机制降低了业务对象替换的复杂性
◆Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

三、Struts2

3. 拦截器和过滤器有什么区别?

  • 拦截器是基于java的反射机制的,而过滤器是基于函数回调
    拦截器不依赖与servlet容器,而过滤器依赖与servlet容器
    拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
    拦截器可以访问action上下文、值栈里的对象,而过滤器不能
    在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
    * 拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

    四、SpringMVC

    1. SpringMVC的执行流程是什么?请简单阐述一下。

    image.png

    2. 你常用的SpringMVC注解有哪些?如何开启SpringMVC的注解扫描?

    常用的注解有:@requestMapping 用于请求url映射。
    @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象。
    @ResponseBody注解实现将controller方法返回对象转化为json响应给客户。
    其他的注解希望学生根据自己理解情况自行补充。

    3. 如何开启注解处理器和适配器的配置?

    我们在项目中一般会在springmvc.xml中通过开启 来实现注解处理器和适配器的开启。

    4. 使用springMVC框架的时候,如何解决post和get的乱码问题?

    解决post请求乱码:我们可以在web.xml里边配置一个CharacterEncodingFilter过滤器。设置为utf-8.
    解决get请求的乱码:有两种方法。对于get请求中文参数出现乱码解决方法有两个:
    1.修改tomcat配置文件添加编码与工程编码一致。
    2.另外一种方法对参数进行重新编码 String userName = New String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);

五、Mybatis

1.MyBatis编程步骤是什么样的?

1、创建SqlSessionFactory
2、通过SqlSessionFactory创建SqlSession
3、通过sqlsession执行数据库操作
4、调用session.commit()提交事务
5、调用session.close()关闭会话
提示:MyBatis与Hibernate开发流程基本一致

2.Mybatis和Hibernate的区别。

mybatis:
1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
2. 可以进行更为细致的SQL优化,可以减少查询字段。
3. 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
4. 二级缓存机制不佳。
hibernate:
1. 功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
2. 有更好的二级缓存机制,可以使用第三方缓存。
3. 缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?**
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

3. 使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
④ Mapper.xml文件中的namespace即是mapper接口的类路径。
注意:Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。原因就是namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。

4. mysql中mybatis如何获取自增型主键值?



SELECT LAST_INSERT_ID()

insert into user(userName,password,comment)
values(#{userName},#{password},#{comment})

注意:selectKey中order属性的值是不同的,BEFORE先选择主键,设置keyProperty的值然后执行插入语句。
AFTER是先执行插入语句,然后执行selectKey。

insert into user(userName,password,comment)
values(#{userName},#{password},#{comment})

5. 在mapper中如何传递多个参数?

//DAO层的函数
Public UserselectUser(String name,String area);
//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

使用 @param 注解:
public interface usermapper {
user selectuser(@param(“username”) string username,
@param(“hashedpassword”) string hashedpassword);
}
然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):

6. #{}和${}的区别是什么?

{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

{} 只是替换?,相当于PreparedStatement使用占位符去替换参数,可以防止sql注入。
${} 是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;$可以是sql中的任一部分传入到Statement中,不能防止sql注入。

7. 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
第2种: 通过来映射字段名和实体类属性名的一一对应的关系