[Java大厂必备面试题] 点滴促就辉煌, 每日三题【Day11】:MyBatis1

本文主要是介绍[Java大厂必备面试题] 点滴促就辉煌, 每日三题【Day11】:MyBatis1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是汤圆,为什么要写面试题呢(这是直接搬的哈哈 表格的文章) ,太无聊了 就看一遍  然后搬一篇,我也要坚持搬运完100篇!

目录

面试题1:你怎么理解ORM框架,常见的ORM框架都有哪些?

正经回答:

追问1:大家都在用Mybatis,Mybatis都有哪些优势?

面试题2:相比较Hibernate与Mybatis,你有哪些看法?

正经回答:

深入追问:

追问1:Hibernate与Mybatis 的缓存机制都有哪些区别?

面试题3:Mybatis中的#{}和${}有哪些区别

正经回答:

深入追问:

追问1:什么是sql注入?



  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识集合容器并发编程JVMSpring全家桶MyBatis等ORMapping框架MySQL数据库Redis缓存RabbitMQ消息队列Linux操作技巧等。


面试题1:你怎么理解ORM框架,常见的ORM框架都有哪些?



正经回答:

对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

JAVA编程免不了和数据库打交道,那么如何高效便捷地操作数据库,也是一个需要应对的问题,原生的基于JDBC的方式非常低效,而且要写一大堆无用的模板代码,不值得选取。ORM是对JDBC的封装,让我们不需要重复的造轮子,目前已经有很多优秀的ORM框架可供使用了,常见的比如Mybatis(batis)、Hibernate、Jpa、Jdo等。 

优点:

  • ORM是对JDBC的封装,从而解决了JDBC的各种存在问题,提高效率
  • 使开发更加对象化
  • 可移植性强
  • 可以很方便地引入数据缓存之类的附加功能

缺点:

  • 自动化进行关系数据库的映射需要消耗少量系统性能。
  • 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。

市面上主流ORM框架:

EJB:重量级、高花费的ORM技术,支持JPA,尤其是EJB3低侵入式 的设·计,增加了Annotation
Hibernate:开源,支持JPA ,被选作JBoss的持久层解决方案
iBatis:”SQL Mapping”框架,Apache软件基金组织的子项目,后 转Google Code旗下,ibatis3.x正式更名为Mybatis
Spring Data JPA:Spring框架中的子模块
TopLink:Oracle公司的产品
Open JPA:Apache软件基金组织的开源项目
 

追问1:大家都在用Mybatis,Mybatis都有哪些优势?

  • Mybatis入门简单;在使用上,对于熟悉编写SQL的同学来说,基本上是即学即用。
  • Mybatis对jdbc的抽象封装程度更高,spring jdbc要想实现的细节很多,例如Mybatis封装了更多的对象映射。
  • 支持注解,面对接口开发,效率高,分分钟解决一个sql。
  • 对于复杂的SQL,springJDBC编写麻烦,动态SQL语句设计也麻烦,相比之下,Mybatis更加灵活且人性化。
  • mybatis的高度封装,使得程序员可专注与业务层,开发效率高。所以选择mybatis的开发公司多。

面试题2:相比较Hibernate与Mybatis,你有哪些看法?



正经回答:

  Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

  Hibernate和MyBatis都支持JDBC和JTA事务处理。
 Mybatis优势
 

  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势

  • Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

Hibernate

  • Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
  • Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

MyBatis

  • MyBatis入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
  • MyBatis的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

深入追问:



追问1:Hibernate与Mybatis 的缓存机制都有哪些区别?

相同点

       Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

不同点

 Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

  MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
 

两者比较:

  因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

  而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

面试题3:Mybatis中的#{}和${}有哪些区别



正经回答:

-- #{}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = #{username}
and password = #{password}
</select>

-- ${}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = ${username}
and password = ${password}
</select>
 

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

 如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=“111”, 如果传入的值是id,则解析成的sql为where username=“id”.

  •      $将传入的数据直接显示生成在sql中。 
  •  如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
  • 那么,如果传入的值是:;drop table user;会怎么样?解析后的sql为:

select id, username, password, role from user where username=;drop table user;
 

呀,被迫删库跑路?

  • #方式能够很大程度防止sql注入,$方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名;
  • 一般能用#的就别用$,若不得不使用 “${xxx}” 这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
  • 在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。

  综上,我们在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
 

深入追问:



追问1:什么是sql注入?

 sql注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者)

 说到SQL注入,相信大家都不陌生,这是黑客同学常用的一种攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。

  所以,在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性要求很高的应用中(比如银行软件),经常使用将SQL语句全部替换为存储过程这样的方式,来防止SQL注入。这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。
 

 追问2:mybatis是如何做到防止sql注入的?

 

MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。其实,MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构,参考上面的两个例子。

  其中,parameterType表示了输入的参数类型,resultType表示了输出的参数类型。回应上文,如果我们想防止SQL注入,理所当然地要在输入参数上下功夫。上面代码中使用#的即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:
 

select id, username, password, role from user where username=? and password=?
 

  不管输入什么参数,打印出的SQL都是这样的。这是因为MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。


 每日小结

mybatis问题 你清楚了么 ,我知道没有  继续看吧....

锻炼锻炼

这篇关于[Java大厂必备面试题] 点滴促就辉煌, 每日三题【Day11】:MyBatis1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/651922

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定