持久层框架

文章探讨了Java持久层框架的发展,重点比较了Hibernate和MyBatis的优缺点。Hibernate以其映射简单、高效和可扩展性受到青睐,但配置复杂、运行时间长。MyBatis则以简单易用、自定义性强和高效著称,但配置繁琐,缺乏高级功能。文章还涉及了分页、缓存管理和设计模式的应用。
摘要由CSDN通过智能技术生成

持久层框架

前言

在上世纪90年代,针对Java连接数据库,JDBC(Java DataBase Connectivity)为Java开发人员提供了标准的访问数据库的接口。但是,随着时间的推移,数据库的访问量越来越大,对于数据库访问层的需求就越来越高。因此很多其他的持久层框架就应运而生了,例如MyBatis、Hibernate、JPA等。

Hibernate

优点:
  1. 映射简单: 使用XML或注解配置数据库表与Java对象之间的映射,因此它非常简单。
  2. 效率高: 使用缓存来提高性能,并且使用了延迟加载,以减少数据库请求。
  3. 可扩展性: 可以与多种数据库相兼容,并且可以轻松扩展到其他数据库系统。
  4. 易于维护: 设计很好,代码简洁,因此易于维护。
缺点:
  1. 配置复杂: 需要配置很多内容,因此起步较难。
  2. 运行时间长: 需要处理很多细节,因此其运行时间可能较长。
  3. 易于出错: 配置较为复杂,因此容易出错。

MyBatis

优点
  1. 简单易用:是一个简单而易用的持久层框架,学习曲线较短。
  2. 自定义性高:可以根据需求自定义 SQL,支持存储过程、动态 SQL 以及复杂的关联查询。
  3. 易于扩展:插件机制和自定义映射器接口使其易于扩展,可以和spring很好的集成。
  4. 高效:具有很高的执行效率,可以满足大部分的性能要求。
缺点:
  1. 缺乏易用性:XML映射文件不够简洁,缺乏易用性,sql依赖于数据库,一旦修改数据库会导致sql也要大量修改。
  2. 文档不够丰富:文档不够详细,不够丰富,很难帮助用户解决问题。
  3. 代码量大:代码量较大,维护和管理代码较困难。
  4. 缺乏高级功能:没有提供一些高级功能,如缓存管理、事务管理等,需要用户自己实现。
问题

1、#{}和${}的区别是什么?

答:#{}是预编译处理,${}是字符串替换。在处理前者时会用?号代替,而后者直接字符串替换,前者可以有效的防止sql注入问题,提高安全性。

2、实体类的属性名和表中的字段名不一样怎么处理?

答:首先可以通过SQL语句中定义别名,让字段名和属性名一致;其次可以通过映射字段名和实体类的属性名,即通过resultMap标签定义。

3、怎么分页?分页插件的原理是?

答:使用RowBounds对象进行分页,他是针对ResultSet结果集执行的内存分页(所有数据查出后在内存中改进型分页),不是物理分页(查询时已经决定查的页)。另外可以通过sql拼写limit进行分页。
分页插件时使用插件接口实现自定义插件,在插件的拦截方法内拦截执行的sql,重写sql进行查询。

4、如何将sql执行结果封装为目标对象并返回?有什么映射形式?

答:根据问题2中定义好对应的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象主义赋值。

5、如何执行批量插入?

答:第一,可以通过定义一条简单的插入语句,让后在代码中定义循环调用此语句进行批量插入。效率低。
第二,使用foreach标签在sql中定义达到目的。底层通过拼接sql的方式进行批量插入。
第三,通过excutor的batch处理进行插入,效率最高。

6、xml映射文件中的标签

答:1、select: 用于执行查询操作 2、insert: 用于执行插入操作 3、update: 用于执行更新操作 4、delete: 用于执行删除操作5、sql: 用于声明公共的SQL片段6、resultMap: 用于声明自定义的映射关系7、cache:用于配置二级缓存。8、flushCache:用于清空缓存。9、:用于剔除不需要的前后空格。10、set:用于动态SQL语句的11、update语句中的设置字段的值。12、where:用于动态SQL语句的13、update和delete语句中的where语句。14、if:用于判断条件语句。15、choose:用于多条件判断语句。16、foreach:用于遍历集合。17、bind:用于绑定变量值。

7、实现一对一的方式?怎么操作?

答:有联合查询和嵌套查询,联合查询是几个表联合后查询一次可通过resultMap里面配套association节点配置一对一的类就可以完成;嵌套查询是先查一个表,再根据外键去另一个表里查询,也是通过association配置,但是另一个表通过select属性配置。

8、是否支持延迟加载?实现原理是什么?

答:仅支持association关联对象和collection关联集合对象的延迟加载,前者指的是一对一,后者是一对多。可以通过是否启动延迟加载配置lazyLoadingEnabled=true/false。
原理是使用cglib创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了。

9、缓存机制?

答:MyBatis 使用了两级缓存:一级缓存和二级缓存。
一级缓存是 SqlSession 级别的缓存,也就是说,当使用 SqlSession 执行查询时,返回的结果会被缓存在 SqlSession 内部。在默认情况下,如果再次执行相同的查询,将不会执行实际的 SQL,而是直接从缓存中返回结果。
二级缓存是 Mapper 级别的缓存,也就是说,配置了二级缓存的 Mapper 中的数据会被缓存在二级缓存中,从而可以在不同的 SqlSession 之间共享。需要注意的是,二级缓存是需要手动开启的,默认情况下是不开启的。
MyBatis 的缓存机制可以加速数据查询,但是需要注意的是,如果数据发生变更,缓存中的数据也需要更新,否则将导致数据不一致。

10、JDBC编程步骤?

答:1、装载相应的数据库jdbc驱动并进行初始化;
2、创建连接:使用DriverManager类的getConnection方法来创建数据库连接。
3、创建语句:使用Connection对象的createStatement方法创建Statement对象,用于执行SQL语句。
4、执行语句:使用Statement对象的executeQuery方法执行查询语句,并返回ResultSet对象。
5、处理结果:使用ResultSet对象的next方法遍历查询结果,并使用getXXX方法获取数据。
6、关闭连接:关闭数据库连接,释放资源。

11、使用了什么设计模式?

答:
1、Builder模式:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
2、工厂模式:SqlSessionFactory、ObjectFactory、MapperProxyFactory;
3、单例模式:ErrorContext和LogFactory;
4、代理模式:Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
5、组合模式:SqlNode和各个子类ChooseSqlNode等;
6、模板方法模式: BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类IntegerTypeHandler;
7、适配器模式:Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
8、装饰者模式:cache包中的cache.decorators子包中等各个装饰者的实现;
9、迭代器模式:迭代器模式PropertyTokenizer;

12、为什么UserMapper.java是接口,为什么没有实体类还能调用?

答:使用jdk动态代理+MapperProxy。本质上调用的是MapperProxy的invoke方法。

Mybatis-plus

MyBatis-Plus 是基于 MyBatis 的扩展,它提供了更多的功能和优化,并且减少了开发人员需要手动编写的 SQL 代码,从而提高了效率和代码质量。MyBatis-Plus 还提供了一些高级功能,例如自动生成代码,分页查询,数据库字段自动映射等。

源码

简要介绍MyBatis的源码分析。

SqlSessionFactoryBuilder类:该类用于构建SqlSessionFactory对象,负责解析MyBatis的配置文件、创建DataSource数据源对象和创建Transaction事务管理器对象。

SqlSessionFactory类:该类是MyBatis的核心类,负责创建SqlSession对象,管理MyBatis的所有配置信息和资源,提供了对数据库的操作接口和方法。

SqlSession类:该类是MyBatis的数据访问层接口,封装了对数据库的所有操作和管理,包括查询、插入、更新和删除等,同时支持事务和缓存管理。

Mapper接口:该接口是MyBatis的映射接口,用于定义数据访问的方法和SQL语句,通过注解或XML文件实现与数据库的映射关系。

MapperProxy类:该类是MyBatis的Mapper接口的动态代理类,通过反射机制实现了Mapper接口的具体方法调用,可以在Mapper接口上面实现事务和缓存管理。

Configuration类:该类是MyBatis的配置类,包括了MyBatis的所有配置信息和资源,例如DataSource、Mapper接口、SQL语句等。

Executor类:该类是MyBatis的执行器类,负责执行Mapper接口定义的方法,解析SQL语句、处理参数、执行查询和更新等操作。

StatementHandler类:该类是MyBatis的SQL语句处理类,负责处理SQL语句、参数绑定、结果集映射等操作。

ParameterHandler类:该类是MyBatis的参数处理类,负责处理SQL语句中的参数绑定、转换和处理,支持多种数据类型和对象。

ResultSetHandler类:该类是MyBatis的结果集处理类,负责将数据库的结果集映射成Java对象或集合,支持多种映射方式和数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值