当前位置: 首页 > news >正文

360产品展示网站广州网站建设公司小程序

360产品展示网站,广州网站建设公司小程序,网上申请营业执照,wordpress 4.0 谷歌字体梳理面试过程中Mybatis相关的常见问题。为保证知识点覆盖#xff0c;参考了《Mybatis从入门到精通》、《深入浅出Mybatis技术原理与实战》、《Mybatis技术内幕》等书籍。 Mybatis 简介 Mybatis 是一款优秀的持久层框架(ORM框架)#xff0c;它支持自定义SQL、存储过程以及高…梳理面试过程中Mybatis相关的常见问题。为保证知识点覆盖参考了《Mybatis从入门到精通》、《深入浅出Mybatis技术原理与实战》、《Mybatis技术内幕》等书籍。 Mybatis 简介 Mybatis 是一款优秀的持久层框架(ORM框架)它支持自定义SQL、存储过程以及高级映射。Mybatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。Mybatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects普通老式 Java 对象为数据库中的记录。 Mybatis优缺点 在介绍Mybatis优缺点前先简单介绍下传统JDBC开发存在以下问题 (1) 频繁地创建数据库连接对象、释放容易造成系统资源浪费影响系统性能。可以使用连接池解决这个问题。但是使用jdbc需要自己实现并管理连接池。 (2) sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大一旦发生变化需要修改java代码系统需要重新编译重新发布。(不能很好的适应变化) (3) 使用preparedStatement向占位符传参数存在硬编码因为sql语句的where条件不固定如条件查询可能多也可能少修改sql还要修改代码系统不易维护。 (4) 结果集处理存在重复代码处理麻烦。如果可以映射成Java对象会比较方便。 Mybatis针对传统JDBC开发存在的问题进行优化实现以下功能优点 (1) 实现数据库连接配置及管理无需编写数据库连接、释放等代码。减少编码 (2) 将Sql语句配置xml文件中实现SQL语句与java代码分离便于统一管理。提供XML标签支持编写动态SQL语句。 (3) 支持自动将java对象映射至sql语句、自动将sql执行结果映射至java对象。打通sql与java对象的交互 但Mybatis也存在以下问题 (1) SQL语句的编写工作量较大尤其当字段多、关联表多时对开发人员编写SQL语句的功底有一定要求。 (2) SQL语句依赖于特定数据库无法做到数据库无关导致数据库移植性差。 Mybatis 是一个足够灵活的ORM框架。对性能的要求很高或者需求变化较多的项目Mybatis是比较不错的选择。 Mybatis和hibernate对比 Hibernate和Mybatis都是对jdbc的封装都是ORM框架在选择时要根据业务场景合理选择。Hibernate和Mybatis主要有以下不同 (1) 映射关系 Mybatis 是一个半自动映射的框架配置Java对象与sql语句执行结果的对应关系多表关联关系配置简单。 Hibernate 是一个全表映射的框架配置Java对象与数据库表的对应关系多表关联关系配置复杂。 Mybatis 需要编写原生SQL可以严格控制sql执行性能灵活度高但无法做到数据库无关性如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件工作量大。 Hibernate 无需编写原生SQL可以做到数据库无关性但是其多表关联关系配置复杂。 (2) SQL优化和移植性 Hibernate 对SQL语句封装提供了日志、缓存、级联级联比 Mybatis 强大等特性此外还提供 HQLHibernate Query Language操作数据库数据库无关性支持好但会多消耗性能。如果项目需要支持多种数据库代码开发量少但SQL语句优化困难。 Mybatis 需要手动编写 SQL支持动态 SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库不支持数据库无关性但sql语句优化容易。 (3) 开发难易程度和学习成本 Hibernate 是重量级框架学习使用门槛相对较高适合于需求相对稳定、对性能要求不高、关联查询场景较少的场景如办公自动化系统。 Mybatis 是轻量级框架学习使用门槛相对较低适合于需求变化频繁、对性能要求较高、关联查询场景较多的场景如互联网电子商务系统。 为什么说Mybatis是半自动ORM映射工具它与全自动的区别在哪里 Hibernate属于全自动ORM映射工具使用Hibernate查询关联对象或者关联集合对象时可以根据对象关系模型直接获取所以它是全自动的。 而Mybatis在查询关联对象或关联集合对象时需要手动编写sql来完成所以称之为半自动ORM映射工具。 简单介绍下一条SQL在Mybatis中是如何执行的 这里重点介绍下基于xml编写SQL的场景。 (1) 读取 MyBatis 配置文件。如名为mybatis-config.xml的文件为 MyBatis 的全局配置文件配置了 MyBatis 的运行环境等信息例如数据库连接信息。 (2) 加载映射文件。映射文件即 xxxMapper.xml文件。mybatis-config.xml 文件可以加载多个映射文件每个文件对应数据库中的一张表。 (3) 构造会话工厂。通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。SqlSessionFactory用来创建SqlSession。 (4) 创建会话实例。会话工厂创建 SqlSession 对象该对象中包含了执行 SQL 语句的所有方法。 (5) 执行Executor执行器。MyBatis 底层定义了一个 Executor 接口来操作数据库它将根据 SqlSession 传递的参数动态地生成需要执行的SQL语句同时负责查询缓存的维护。 (6) 访问MappedStatement对象在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数该参数是对映射信息的封装用于存储要映射的 SQL 语句的 id、参数等信息。 (7) 输入参数映射。输入参数类型可以是 Map、List 等集合类型也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。 (8) 输出结果映射。输出结果类型可以是 Map、 List 等集合类型也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于JDBC对结果集的解析过程。 能简单介绍下Mybatis映射器吗 映射器是Mybatis最强大的工具也是我们使用Mybatis时使用最多的工具。 在映射器中可以定义的元素有select、insert、update、delete、resultMap、parameterMap、sql、include、selectKey此外还有动态sql的元素trim、where、set、foreach、if、choose、when、otherwise、bind等。 Mybatis如何实现主键回填 在插入记录时会遇到主键回填的问题。针对这个场景可以使用keyProperty属性来指定主键字段并通过useGeneratedKeys来启用数据库内置生成策略或通过selectKey来自定义生成策略。 Mybatis为什么引入延迟加载它的实现原理是什么 使用级联(多表查询或嵌套查询)后即使不需要关联的信息在执行select语句时也会被执行这会造成SQL执行过多导致性能下降这就是N1问题。为了解决N1问题Mybatis引入延迟加载功能。延迟加载功能默认开启无需手动开启。如果需要禁止 延迟记载功能的意义在于一开始并不取出级联数据只有当使用级联数据时才发送SQL去取回数据。 在Mybatis的配置中有两个全局的参数lazyLoadingEnabled和aggressiveLazyLoading。lazyLoadingEnabled用于表示是否启用延迟加载功能默认是即时加载。aggressiveLazyLoading表示积极应对延迟加载层级加载默认是true。在设置延迟加载时要主动将该参数设置为false。(也即是说延迟加载默认是关闭的需要主动开启) 上述方案是全局延迟加载方案有时需要实现局部延迟加载。可以在association和collection元素上添加属性fetchType。其中eager表示主动加载lazy表示延迟加载。局部延迟加载的优先级高于全局延迟加载。 延迟加载的实现原理是动态代理。在默认情况下Mybatis在3.3及以后的版本采用JAVASSIST实现动态代理在低版本采用CGLIB。举例来说当调用目标方法时进入拦截器方法比如调用a.getB().getName()拦截器invoke()方法发现a.getB()是null值那么就会单独发送事先保存好的查询关联B对象的sql把B查询上来然后调用a.setB(b)于是a的对象b属性就有值了接着完成a.getB().getName()方法的调用。 Mybatis动态sql了解吗其执行原理可以介绍下吗有哪些动态sql 在实际的应用中常常需要动态的组装SQL。Mybatis提供对SQL语句动态的组装能力只需用几个基本元素就可实现大量代码才能实现的功能这体现了Mybatis的灵活性、高度可配置性和可维护性。 Mybatis也支持在注解中配置SQL但由于注解中配置功能受限对于复杂的SQL而言可读性较差。推荐在Mapper.xml中动态组装SQL。 Mybatis的动态SQL主要分内如下几类 (1) if元素。判断语句单条件分支判断。 (2) choose(when、when、otherwise)元素。多条件分支判断类比Java语言中的switch、case、default。 (3) trim、where、set等元素。辅助元素用于处理一些SQL拼装问题。 (4) foreach元素。循环语句。在in语句等列举条件中常用。 动态SQL的原理是使用OGNL(Object-Graph Navigation Language)从sql参数对象中计算表达式的值根据表达式的值动态拼接sql以此来完成动态sql的功能。 多数据库支持 Mybatis是一种半自动映射的框架需要配置Java对象与sql语句执行结果的对应关系无法做到数据库无关性。Mybatis提供了多数据库支持的能力。Mybatis 可以根据不同的数据库厂商执行不同的语句这种多厂商的支持是基于映射语句中的 databaseld 属性的。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseld 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相 同语句则后者会被舍弃。 接下来以select元素为例介绍如何实现多数据库支持。 select idselectXxx databaseIdmysqlselect id, code, name from Xxx where name like concat (#{name}%) /select select idselectXxx databaseIdoracleselect id, code, name from Xxx where name like #{userName}||% /select需要说明的是databaseId通过是通过DatabaseMetaData#getDatabaseProductName()返回的字符串进行设置。 注意尽管Mybatis支持使用if标签配合上下文中的 databaseOd 参数实现多数据库支持但是因为这种写法在同一个SQL里面包含了不同类型的数据库不利于后面的维护不建议使用这种写法。反例如下 select idselectXxx databaseId”mysql”select id, code, name from Xxx whereif testname ! null and name ! if testdatabaseId mysqland name like concat (#{name}%)/ifif testdatabaseId oracleand name like #{userName}||%/if/if/where /selectMybatis的一级缓存和二级缓存了解吗该如何使用 使用缓存可以使应用更快地获取数据避免频繁的数据库交互尤其是在查询越多、缓存命中率越高的情况下使用缓存的作用就越明显。Mybatis作为持久化框架提供了非常强大的查询缓存特性可以非常方便地配置和定制使用。 Mybatis提供两级缓存。一般提到Mybatis缓存的时候都是指二级缓存。一级缓存也叫本地缓存〉默认会启用并且不能控制因此很少会提到。 一级缓存默认开启。 一级缓存存在于SqlSession的生命周期中在同一个SqlSession中查询时Mybatis会把执行的方法和参数通过算法生成缓存的键值将键值和查询结果存入一个Map对象中。如果同一个SqlSession中执行的方法和参数完全一致那么通过算法会生成相同的键值当Map缓存对象中己经存在该键值时则会返回缓存中的对象。 如果在执行方式的时候不想使用一级缓存可以对该方法做如下修改。 二级缓存默认不开启。Mybatis的二级缓存存在于SqlSessionFactory的生命周期中对应作用域为Mapper(Namespace)。虽然目前还没接触过同时存在多个SqlSessionFactory的情况但可以知道当存在多个SqlSessioηFactory时它们的缓存都是绑定在各自对象上的缓存数据在一般情况下是不相通的。只有在使用如Redis这样的缓存数据库时才可以共享缓存。 将Mybatis二级缓存应用于生产环境还需考虑二级缓存可能带来的脏读问题及避免策略。 Mybatis的二级缓存是和命名空间绑定的所以通常情况下每一个Mapper映射文件都拥有自己的二级缓存不同Mapper的二级缓存互不影响。在关联多表查询时肯定会将该查询放到某个命名空间下的映射文件中这样一个多表的查询就会缓存在该命名空间的二级缓存中。涉及这些表的增、删、改操作通常不在一个映射文件中它们的命名空间不同因此当有数据变化时多表查询的缓存未必会被清空这种情况下就会产生脏数据。二级缓存面向命名空间不同的Mapper的二级缓存相互隔离。对于多表联合查询涉及的表的增、删、改操作不在一个映射文件中当数据变化时多表查询的缓存未必会被清空会产生脏数据 对于多表联合查询存在的脏数据问题可以使用参照缓存解决。当某几个表可以作为一个业务整体时通常是让几个会关联的ER表同时使用同一个二级缓存这样就能解决脏数据问题。 什么是Mybatis的接口绑定有哪些实现方式 接口绑定就是在Mybatis中任意定义接口然后把接口里面的方法和SQL语句绑定我们直接调用接口方法就可以这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。 接口绑定有两种实现方式 (1) 注解绑定就是在接口的方法上面加上 Select、Update等注解里面包含Sql语句来绑定 (2) 通过xml里面写SQL来绑定在这种情况下要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候用注解绑定当SQL语句比较复杂时候用xml绑定一般用xml绑定的比较多。 推荐使用xml方式SQL本身就是变化点同一个接口可能面向不同的数据库有不同的实现。 #{}和${}的区别是什么 /#{} 是预编译处理${}是字符串替换。 Mybatis在处理#{}时会将sql中的#{}替换为?号调用PreparedStatement的set方法来赋值可以有效的防止SQL注入提高系统安全性。 Mybatis在处理${}时就是把${}替换成变量的值存在SQL注入的风险。 Mybatis是如何进行分页的分页插件的原理是什么 Mybatis使用RowBounds对象进行分页它是针对ResultSet结果集执行的内存分页而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用Mybatis提供的插件接口实现自定义插件在插件的拦截方法内拦截待执行的sql然后重写sql根据dialect方言添加对应的物理分页语句和物理分页参数。 Mybatis多表查询了解吗 实现一对一有几种方式?具体怎么操作的 有联合查询和嵌套查询两种方式。 联合查询是几个表联合查询只查询一次通过在resultMap里面配置association节点配置一对一的类就可以完成。 嵌套查询是先查一个表根据这个表里面的结果的外键id去再另外一个表里面查询数据也是通过association配置但另外一个表的查询通过select属性配置。 实现一对多有几种方式怎么操作的 有联合查询和嵌套查询。 联合查询是几个表联合查询只查询一次通过在resultMap里面的collection节点配置一对多的类就可以完成。 嵌套查询是先查一个表根据这个表里面的 结果的外键id去再另外一个表里面查询数据也是通过配置collection但另外一个表的查询通过select节点配置。 参考 https://zhuanlan.zhihu.com/p/347935099 Mybatis面试题 《Mybatis从入门到精通》 刘增辉 著 《深入浅出Mybatis技术原理与实战》 杨开振著 《Mybatis技术内幕》 徐郡明 著
http://www.w-s-a.com/news/364179/

相关文章:

  • 湖南岳阳网站开发网络公司石家庄做网站的公司哪个好
  • 西安市做网站的公司门户网站对应序号是什么
  • 太原网站域名开发什么是网页界面设计
  • 做产品类网站有哪些做一百度网站吗
  • 在线视频网站建设国外最新创意产品网站有哪些方面
  • 在一个网站下建设多个子网站宣传册画册设计公司
  • 潍坊网站建设公司排名网站建设预付
  • 手机和wap网站建设crm客户管理系统模板
  • 微商城网站建设市场唐山地方志网站建设
  • 想象力做网站网站301跳转代码
  • 做暧暧小视频有声音的网站太原网页搜索排名提升
  • 公众号链接的手机网站怎么做动易2006学校网站
  • 网站网上推广网站推他网站
  • 如何进行网站建设分析济宁做企业网站
  • 长沙网站seo技巧wordpress插件头像
  • appserv做网站教程微信信息流广告案例
  • 前端网站开发兼职长春火车站地下停车场收费标准
  • 苏州推广网站建设概况大连公交app
  • 移动互联网站开发与维护招聘网站建设计入什么费用
  • 郑州营销型网站建设erp系统有什么用
  • 公司网站开发费怎么入账投放广告网站
  • 企业网站开发文献综述加盟网网站建设策划书
  • 最便宜的网站空间网站建设和app开发
  • 承装承修承试材料在哪个网站做如何用虚拟主机建设网站
  • 如何建一个外贸网站网页设计零基础学习课程
  • 营销型外贸网站广州昆明建设网站制作
  • 网页制作网站素材项目建设全过程管理
  • 正能量网站下载柬埔寨网赌网站开发
  • 如何免费建设公司网站广州传业建设有限公司网站
  • 织梦做的网站快照被攻击张家口网站建设公司