互联网Java工程师面试题——每天背诵二十道面试题(一)


前言

离近毕业,面试是必须要面对的,那么记录一下面试题加深一下自己的印象。


一、MyBatis面试题

1、什么是MyBatis?

答:1.MyBatis是一个半ORM(对象关系映射)框架它内部分封装了JDBC,开发时只需要关注SQL语言本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程,程序员直接编辑原生态sql,可以严格控制sql执行性能,灵活度。

2.MyBatis可以使用XML或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了所有的JDBC代码和手动设置参数以及或者结果集。

3、通过xml文件或者注解的方式将要执行的各种statement配置起来,
然后通过java对象的statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回(从执行sql返回result的过程。)

Mybatis的优点:

答:1.基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,接触sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

2.与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗杂的代码,不需要手动开关连接。

3.很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只需要JDBC支持的数据库MyBatis都支持)

4.能够与Spring很好的集成。

5、提供映射标签、支持对象与数据库的 ORM字段关系映射;提供对象管理映射标签,支持对象关系逐渐维护。

扫描二维码关注公众号,回复: 12469493 查看本文章

3、那MyBatis框架有什么缺点呢?

答:1.SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定的要求。

2.SQL语句依赖于数据库,导致数据库移植性差,不能随便更换数据库。

4、你给我说一说MyBatis框架使用场景吧?

答:1.MyBatis 专注于SQL本身,是一个足够灵活的DAL层解决方案。

2.对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

5、 MyBatis与Hibernate有哪些不同你知道吗?

答:1.Mybatic和hibernate不同,它不完全是一个ORM框架,因为MyBatic需要程序员自己编写Sql语句。

2.MyBatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系型数据库要求不高的软件开发,因为这类软件需求变化频繁,一旦需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库软件,则需要自定义多套sql映射文件,工作量大。

3.Hibernate对象./关键映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

6、你给说一说#{}和${}的区别是什么?

答:#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}的时候,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值:

Mybatis在处理 的 时 候 , 就 是 把 {}的时候,就是把 {}替换层变量的值。

使用#{}可以有效的防止SQL注入,提高系统的安全性。

7、你给我说一下当实体类中的属性名和表中的字段名不一样的时候,该怎么办呢?

答:两种处理方法:
第一种:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

<select id=”selectorder” parametertype=”int” resultetype=
me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select>

第二种:通过< resultMap > 来映射字段名和实体类属性名的一一对应的关系。

<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用 id 属性来映射主键字段–>
<id property=”id” column=”order_id”>
<!–用 result 属性来映射非主键字段,property 为实体类属性名,column
为数据表中的属性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>

8、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?

答:Mapper接口里面的方法是不能重载的,因为是使用全限名+方法名的保存和寻找策略。Mapper接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。

Dao接口即Mapper接口。接口的全限名、就是映射文件中的namespace的值;接口的方法名,就是映射文件的Mapper的Statement的id值,接口方法内的参数,就是传递给sql的参数。

Mapper接口是没有实现类的,当调用接口方法时,接口权限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatic中,每一个< select >、< insert>、< update>、< delete> 标签,都会被解析为一个MapperStatement 对象。

举例:com.mybatis3.mappers.StudentDao.findStudentById
可以唯一找到 namespace 为:

 com.mybatis3.mappers.StudentDao 

下面 id 为findStudentById 的 MapperStatement。

9、Mybatic是如何进行分页的?分页插件的原理你给我说一说?

答:Mybatic使用RowBounds对象进行分页的,它是针对ResultSet结果集执行的内存分页,而非物理分页、可以sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

10、MyBatis的一级、二级缓存你给我说一说呗?

答:一级缓存它是基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中所有Cache求将清空,默认打开一级缓存。

二级缓存的话与一级缓存的机制相同,默认也是采用PerpetualCache,HashMap存储的,不同在于其存储作用域为Mapper(Namespace)并且可以自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置< cache/> ;

对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行呢C/U/D 操作后,默认该作用域下所有的select中的缓存将呗clear。

二、Redis面试题

1.什么是Redis?你给我简单说一下你的理解吧。

Redis是完全开源免费的,遵循BSD协议,是一个高性能的key-value的非关系型数据库。

Redis与其他key-value缓存产品有三个特点:
1.Redis支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。

2.Redis的优势你知道吗?

答:1.性能极高–Redis能读的速度是110000次/s,写的速度是81000次/s丰富的数据类型——Redis支持二进制案例的Strings、Lists、Hashes,Sets以及Ordered Sets数据类型操作。

原子——Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事物,即原子性。通过MULTI和EXEC指令包起来。丰富的特性,——Redis还支持publish /subscribl ,通知key 过去等等特性。

3.Redis的数据类型说一下?

答:Redis支持吴中数据类型:string(字符串),hash(哈希),list(列表),set(集合)以及zsetsorted set:有序集合。

我们实际项目中比较常用的是string ,hash如果你是Redis中高级用户还需要加上HyperLogLog、Geo、Pub/sub。

如果这个时候你还说你玩过 RedisModule,像BloomFilter、Redis-ML,面试官的眼睛就开始发亮了呢。

4.使用Redis有哪些好处呀?

答:速度很快啊!,因为数据存在再内存中,类似于HashMap,HashMap的优势就是查找和操作的侍剑复杂付都是O1.
2.支持丰富的数据类型呀,支持String,list,set,Zset,hash等

3.支持事物,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。

4.丰富的特性:可用于缓存。消息,按key设置过期时间,过期后将会自动删除。

5、Redis 是单进程单线程的吗?

答:Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

6、为什么把Radis需要把所有数据放放到内存中?

答:Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

7、是否使用过 Redis 集群,集群的原理是什么?

答:1)、Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为
master,继续提供服务。

2)、Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行
分片存储。

8、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?

答:Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson。

9、Redis 如何设置密码及验证密码?

答:设置密码:config set requirepass 123456

授权密码:auth 123456

10、使用过 Redis 分布式锁么,它是什么回事?

答:先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。

这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行 expire之前进程意外 crash 或者要重启维护了,那会怎么样?

这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。

紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得 set 指令有非常复杂的参数,

这个应该是可以同时把 setnx 和expire 合成一条指令来用的!

对方这时会显露笑容,心里开始默念:摁,这小子还不错。

猜你喜欢

转载自blog.csdn.net/qq_43055855/article/details/111322587