数据持久化面试题

1. ORM框架的原理是什么?

ORM是对象-关系映射(Object-Relational Mapping,简称ORM)
它是java中持久层框架技术的一种实现思想,基于这种思想常见的框架有MyBatis、Hibernate等。其原理是建立java中类(实体类)和数据表之间的映射关系,然后通过反射的思想,动态获取类中的属性,此时属性对应了表中的列,所以能够动态产生JDBC代码从而达到操作数据库的目的。

2. 什么是DAO模式?

dao全称是data access object,数据库访问对象,主要的功能就是用于进行数据操作的,在程序的标准开发架构中属于数据层的操作
DAO组成
在整个DAO中实际上都是以接口为操作标准的,即:客户端依靠DAO实现的接口进行操作,而服务端要将接口进行具体的实现。DAO由以下几个部分组成。
1.DatabaseConnection:专门负责数据库的打开与关闭操作的类
2.VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;
3.DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如:增加、修改、删除、按ID查询等;
4.Impl : DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭;
5  Proxy :代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作
6  Factory :工厂类,通过工厂类取得一个DAO的实例化对象

3. 举一个多对多关联的例子,并说明如何实现多对多关联映射。

例如:商品和订单、学生和课程都是典型的多对多关系。首先在数据库表中需要通过第三张关系表来进行数据的维护,该关系表中主要包含了两个外键。具体代码中实现根据框架的不同也有不同的实现方式,比如JPA中可以在实体类上通过@ManyToMany注解配置多对多关联或者通过映射文件中的和标签配置多对多关联,但是实际项目开发中,很多时候都是将多对多关联映射转换成两个多对一关联映射来实现的。

4. 谈一下你对继承映射的理解。

继承关系的映射策略有三种:
① 每个继承结构一张表(table per class hierarchy),不管多少个子类都用一张表。
② 每个子类一张表(table per subclass),公共信息放一张表,特有信息放单独的表。
③ 每个具体类一张表(table per concrete class),有多少个子类就有多少张表。
第一种方式属于单表策略,其优点在于查询子类对象的时候无需表连接,查询速度快,适合多态查询;缺点是可能导致表很大。后两种方式属于多表策略,其优点在于数据存储紧凑,其缺点是需要进行连接查询,不适合多态查询。

5. 什么是Hibernate,好处是什么?

1、Hibernate是一个基于ORM思想的操作数据库的框架技术,实现了对JDBC的封装;
2、Hibernate用的是面向对象的方法,但是在关系型数据库里,存的是一条条的记录;为了用纯面向对象的思想解决问题,所以需要将程序中的对象和数据库中的记录建立起映射关系,ORM就是将对象和数据库中的记录建立起映射的技术;
3、Hibernate通过方言来自动切换不同的数据库,无需在代码中编写;
4、使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session;
5、使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。

6. Hibernate的核心思想?

Hibernate是一个采用ORM(Object/Relation Mapping对象关系映射)机制持久层的开源框架其主要核心思想是面向对象,而非面向过程,而这个面向对象则主要通过ORM实现。

7. 什么是Mybatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

8. MyBatis中使用#和$书写占位符有什么区别?

1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
2.$将传入的数据直接显示生成在sql中。
3.#方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象
6.一般能用#的就别用$
注意: 一般如果将表名、列名作为参数的动态功能操作时,必须使用$,而不能使用#。如MyBatis排序时使用order by 动态参数时需要使用$。 

9. Hibernate 与 Mybatis区别(MyBatis与Hibernate有什么不同)。

相同点:
都是基于ORM思想的java持久层框架技术,都封装了JDBC实现数据库操作,提高了开发数据库编码的效率。	
不同点:
1) Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句;MyBatis需要我们自己在xml配置文件中写sql语句。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用MyBatis就是不错的选择,因为MyBatis还是由我们自己写sql语句;
2) Mybatis比hibernate对存储过程的支持更好一些。

10. 持久层设计要考虑的问题有哪些?

所谓"持久"就是将数据保存到存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。
持久层设计的目标包括: - 数据存储逻辑的分离,提供抽象化的数据访问接口。 
- 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。 
- 资源管理和调度的分离,在数据访问层实现统一的资源调度
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值