数据持久化面试题库


一:你用过的持久层框架有哪些?
早期jdbc代码太麻烦,所以出现了很多持久层框架,我使用的有mybatis,hibernate。

二:@OneToMany注解的mappedBy属性有什么作用?
mappedBy属性主要是告诉hibernate关联关系是通过对方外键引用完成关联映射。
One的一方会成为主控方,加入mappedBy以后,就不会生成这两张关联表的中间表了,而是在Many的一方的表中生成一列作为外键

三:mybatis中的动态sql是什么意思?
Mybatis的动态sql是基于OGNL表达式的,它可以帮助我们方便的在sql语句中实现某些逻辑,一般在我们的Mapper.xml映射文件中使用,Mybatis中用于实现动态sql的标签元素主要有:
if
choose(when,otherwise)
trim
where
set
foreach

四:如何解决mybatis“n+1”问题。
N+1问题主要是数据库中的级联问题,就是在查询的时候使用了association或collection标签进行关联数据时,如果使用了嵌套的select方式,则会造成N+2的问题,解决方案是:
1.使用一条多表关联的sql语句,一次性查询出需要的数据
2.使用mybatis的延迟加载机制,在具体使用到的时间再去加载数据

五:mybatis动态sql相关标签作用及含义?
1.mybatis的动态sql是基于OGNL表达式的,它可以帮助我们方便的在sql语句中实现某些逻辑
2.mybatis中用于实现动态sql的元素主要有,含义是?
if 动态sql中的if用法
choose(when,otherwise) 动态sql中的choose用法
trim 动态sql中的trim语句
where 动态中的where语句的作用主要是给sql语句添加一个条件判断
set 动态sql中的set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的
foreach 动态sql中的foreach

六:什么是jdbc,简述实现方法?
JDBC是java进行数据库操作时的技术统称,提供了很多操作接口,但是编写的代码非常繁琐麻烦,创建一个以JDBC连接数据库的程序,包含7个步骤:
1、加载JDBC驱动程序: Class.forName(“com.mysql.jdbc.Driver”)
2、提供JDBC连接的URL: “jdbc:mysql://localhost:3306/数据库名”
3、创建数据库的连接
Connection conn = DriverManager.getConnection(“URL”,”root”,”123456”)
4、创建一个执行sql命令的Statement对象
PreparedStatement pstmt = conn.prepareStatement(sql);
5、执行SQL语句
(1)增删改 pstmt.executeUpdate() ?返回int为影响的行数
(2)查询 pstmt.executeQuery()?返回ResultSet为查询的结果集
6、循环读取结果: while(rst.next())
7、关闭JDBC相关资源对象

七:请介绍一下数据库连接池技术
1.据库连接池技术主要是提高应用程序和数据库交互时的性能问题,因为连接数据库是非常耗费资源的,如果每个操作都去频繁连接和断开,则会造成巨大的开销,连接池技术即在系统初始化时,就创建一系列的连接对象放入集合中管理,需要连接数据库时从连接池中取出使用,使用完毕归还给连接池,这样的目的是提高同一个连接的可重用性。
2.java中有很多连接池框架,比如dbcp、c3p0,我个人比较喜欢使用阿里的druid连接池,因为性能稳定,功能强大。
注:一般项目使用时直接添加maven引用

八:mysql,Oracle,SqlServer各数据库服务的默认端口号
1.mysql:3306
2.oracle:1521
3.sqlserver:1433

九:mybatis中如何实现分页?
分页的目的是假案年少一次性查询出数据的额外开销,提高应用的性能
mybatis中可以使用如下几种方案
1.sql语句分页,利用传递的页码和每页显示数,使用limit分页
2.采用mybatis拦截器插件实现分页

十:mybatis中如何实现数据映射?
mybatis要求我们自己完成查询sql语句,然后对查询的类进行映射,默认情况下如果类和实体类属性一致,则可以直接视同reusltType进行关联映射,如果不一致,则需自定义resultMap进行映射说明,当然如果数据库列是下划线,而java中是驼峰命名,则可以在mybatis主配置中添加驼峰命名的全局setting配置即可