Java 杂谈技术干货程序员

Java面试题 - 03

2018-11-18  本文已影响0人  贪挽懒月

前言:

再接着Java面试题 - 02,说说剩下的内容。


欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新,且简书上的付费文章在公众号上将免费。


三、框架篇:

(三)、mybatis

1. JDBC编程有什么不足?mybatis是如何解决的?
答:主要有以下几个方面:

2. mybatis编程步骤是怎样的?
答:步骤如下:

3. Mybatis中#和$的区别?
答: 使用${参数}就是单纯的字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低;#{参数名}在SQL中相当于一个参数占位符“?”,用来补全预编译语句,所有这种方式可以防止SQL注入,它补全预编译语句时,会在此参数值两端加了单引号。但是有些地方必须要用$,比如参数是表名的时候:${表名},因为如果使用#,sql语句就会变成 '表名',会加上单引号,这样就找不到该表。总之,能用#就不要用$。

4. 使用MyBatis的mapper接口调用时有哪些要求?
答:有以下规则:

5. 谈谈mybatis中的一级缓存和二级缓存。
答:

6. 在进行插入操作时如何回传ID?
答:在insert标签中配置如下属性即可:

<insert id="insert" parameterType="com.test.User" keyProperty="userId" useGeneratedKeys="true" > 
   ......
</insert>

用keyProperty指定Id属性,把useGeneratedKeys设置为true即可。

7. mapper接口工作原理是什么?
答:mapper接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为mapper接口生成代理对象,代理对象会拦截接口方法,转而执行对应的sql,然后将sql执行结果返回。

8. mapper接口里的方法可以重载吗?为什么?
答:不能重载。对应的xml映射文件是根据方法名将方法与sql语句绑定的,如果重载,将无法区分绑定哪个方法。

9. 你了解mybatis的动态SQL吗?
答:动态SQL可以完成逻辑判断和动态拼接sql的功能。在mybatis的xml映射文件中,我们可以标签的形式编写动态sql。常用的动态sql标签有<if>、<where>、<set>等。

10. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
答:Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置lazyLoadingEnabled=true来启用延迟加载。它的原理是使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

(四)、hibernate

1. 简单的说一下hibernate的开发流程。
答:步骤如下:

2. 说说hibernate中对象的三种状态。
答:hibernate中,对象有以下3种状态:

3. 你知道hibernate的缓存吗?
答:使用缓存的目的就是减少对数据库的访问次数,以提高hibernate的执行效率。hibernate有一级缓存和二级缓存之分:

4. hibernate有几种查询方式?
答:hibernate有3种查询方式:

String hql = "select userName from User"; // userName是实体类属性名而非表的字段名,User是实体类名
Query query = session.createQuery(hql);
List<Object> nameList = query.list();
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("userName", "James"));
List<User> userList = c.list();
String sql = "select id,username,userpwd from t_user";
List list = session.createSQLQuery(sql).list();

5. hibernate的ORM思想你了解多少?
答:ORM 指的是对象关系映射(Object RelationShip Mapping ),指的就是实体类对象和数据库中的表关系进行一一对应,实现通过操作实体类对象来更改数据库里边的数据信息。这就是对象关系映射。hibernate框架也是一个orm框架,主要是通过主配置文件和实体类对应的映射配置文件来实现对象关系映射。

6. 你知道hibernate的懒加载吗?
答:通过设置lazy属性开启懒加载(hibernate3之后默认开启)。当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,节省了服务器的内存开销,从而提高了服务器的性能。比如使用hibernate进行查询,可以使用get方法,也可以使用load方法,get方法不支持懒加载,而load方法支持。get方法会先查一级缓存,再查二级缓存,然后查数据库,如果没有找到会返回null。load方法会先查一级缓存,如果没有找到,就创建代理对象,等需要的时候去查询二级缓存和数据库。也就是说,使用load方法的时候,并不会立刻去数据库查找,等你真的要用到该对象的时候,才会去数据库查找,这就是懒加载。

7. hibernate和mybatis有何异同?
答:异同如下:
(1).相同点:

(2).不同点:

总的来说,mybatis小巧灵活,易于使用,而hibernate学习成本相对较高,数据库移植性好。

8. 谈谈Hibernate中inverse的作用。
答:inverse属性默认是false,就是说双方都维护关联关系。 比如Student和Teacher是多对多关系,用一个中间表TeacherStudent维护。如果Student这边inverse=”true”, 那么关系就由Teacher维护,就是说当插入Student时,不会操作TeacherStudent表。只有Teacher插入或删除时才会触发对中间表的操作。所以两边都inverse=”true”是不对的,会导致任何操作都不触发对中间表的影响;当两边都inverse=”false”或默认时,会导致在中间表中插入两次关系。

9. Hibernate有哪些核心接口?
答:有如下核心接口:

(五)、Redis

1. 什么是redis?
答:redis是使用C语言编写的典型的NoSQL数据库,它是一个key-value存储系统,数据存储在内存中,所以存取速度非常快。

2. 为什么redis要把数据放到内存中?
答:Redis为了达到最快的读写速度将数据都读到内存中,并定期将数据写入磁盘。如果不将数据放在磁盘中,会严重影响 redis 的性能。

3. redis支持哪些数据类型?
答:redis有5种基本数据类型,分别是String(字符串)、Hash(字典)、List(列表)、Set(集合)、Zset(有序集合)。

4. 说说redis的优缺点。
答:优缺点如下:
(1). 优点:

(2). 缺点:

上一篇 下一篇

猜你喜欢

热点阅读