近两年时常客串一下面试官,给组内招募一些初级以及中级的Java开发工程师,其实程序员这个职业,在我看来,沟通能力,自主查找问题、解决问题的能力是最重要的,工作中呢,遇到的99%的问题,都可以依靠网络解决。所以,我招人时,主要看项目经历,个人遇到的问题,最后如何解决的。
但是偶尔也会形式上的也会问几个基础的问题,这几天闲着无事,瞎写几个,希望大家通过问题,可以偶尔去思考底层的东西。源码、底层实现、算法这些东西,工作中虽然99%用不到,但是希望大家还是去涉猎一下。
问1:Mybatis 中$与#号的区别
答:①首先明白${}底层实现的相当于是JDBC中的statement,即字符串的+号;然而#{}相当去preparestatement,即问号占位符
②我们通常的回答是推荐使用#{},因为它可以防止sql注入
③还有一点是,在模糊查询时我们推荐使用的是${},因为#{}会在参数类型是string的时候,默认拼接反斜杠,处理麻烦。
④${}其实是OGNL 对象图表达式(了解过struts2的伙伴会知道)所以可以使用的方式如${user.name},但是#{}底层是通过反射获取data
问2:数据库设计的三大范式
答:第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库,是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值;
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 (不允许有冗余数据)
问3:mysql的索引和索引优化涉猎过吗
答:了解过。首先索引的原理:把无序的数据变成有序的查询;
每一个数据库一个文件夹;
1,MYISAM引擎:每一个表(table_name)-->
table_name.MYI:存放的是数据表对应的索引信息和索引内容;
table_name.FRM:存放的是数据表的结构信息;
table_name.MYD:存放的是数据表的内容;
2,InnoDB引擎:每一个表(table_name)-->
table_name.frm:存放的是数据表的结构信息;
数据文件和索引文件都是统一存放在ibdata文件中;
3,索引文件都是额外存在的,对索引的查询和维护都是需要消耗IO的;
问4:谈谈索引的利弊,以及什么情况下不创建索引
答:索引的好处:
1,提高表数据的检索效率;
2,如果排序的列是索引列,大大降低排序成本;
3,在分组操作中如果分组条件是索引列,也会提高效率;
索引的问题:索引需要额外的维护成本;
不创建索引的情况,例如:
1,较频繁的作为查询条件的字段应该创建索引;
2,唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;
3,更新非常频繁的字段不适合创建索引;
4,不会出现在WHERE 子句中的字段不该创建索引;
问5:Mysql语句的优化,常用手段是什么
答:查看MYSQL的执行计划和执行明细状态(explain+profiling)
1,Explain:可以让我们查看MYSQL执行一条SQL所选择的执行计划;
2,Profiling:可以用来准确定位一条SQL的性能瓶颈;
本文作者分享了作为面试官在招聘初级和中级Java开发工程师时的经验,强调沟通能力和问题解决能力的重要性。文章提及Mybatis中$与#号的区别,解释了数据库设计的三大范式,以及MySQL索引的原理和优化。同时,讨论了索引的利弊以及何时不应创建索引,并提出了MySQL语句优化的常用方法,如使用EXPLAIN和PROFILING进行性能分析。
432

被折叠的 条评论
为什么被折叠?



