网上很多Dubbo面试题都没有答案,所以花了很长时间搜集,本套Dubbo面试题大全,汇总了大量经典的Dubbo程序员面试题以及答案,包含Dubbo语言常见面试题、Dubbo工程师高级面试题及一些大厂Dubbo开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习!
小编分享的这份2022年Java秋招备战面试题总计有1000多道面试题,包含了MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Java 并发编程、Java基础、Spring、微服务、Linux、Spring Boot 、Spring Cloud、RabbitMQ、kafka等16个专题技术点,都是我结合近几年金三银四总结出来的面试真题,已经有很多粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到大家!【持续更新中!】
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 的过程)。
1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。
2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。
2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是不错的选择。
第 1 种: 通过在查询的 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>
第 2 种: 通过
- <select id="getOrder" parameterType="int"
- resultMap="orderresultmap">
- select * from orders where order_id=#{id}
- select>
- <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
- <id property=”id” column=”order_id”>
- 为数据表中的属性–>
- <result property = “orderno” column =”order_no”/>
- <result property=”price” column=”order_price” />
- reslutMap>
8、 模糊查询like语句该怎么写?
第 1 种:在 Java 代码中添加 sql 通配符。
- string wildcardname = “%smi%”;
- list
names = mapper.selectlike(wildcardname); - <select id=”selectlike”>
- select * from foo where bar like #{value}
- select>
第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入
- string wildcardname = “smi”;
- list
names = mapper.selectlike(wildcardname); - <select id=”selectlike”>
- select * from foo where bar like "%"#{value}"%"
- select>
9、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?
10、Mybatis是如何进行分页的?分页插件的原理是什么?
11、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给 对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
12、如何执行批量插入?
首先,创建一个简单的 insert 语句:
- <insert id=”insertname”>
- insert into names (name) values (#{value})
- insert>
然后在 java 代码中像下面这样执行批处理插入:
- list < string > names = new arraylist();
- names.add(“fred”);
- names.add(“barney”);
- names.add(“betty”);
- names.add(“wilma”);
- // 注意这里 executortype.batch
- sqlsession sqlsession =
- sqlsessionfactory.opensession(executortype.batch);
- try {
- namemapper mapper = sqlsession.getmapper(namemapper.class);
- for (string name: names) {
- mapper.insertname(name);
- }
- sqlsession.commit();
- } catch (Exception e) {
- e.printStackTrace();
- sqlSession.rollback();
- throw e;
- }
- finally {
- sqlsession.close();
- }
13、如何获取自动生成的(主)键值?
14、在mapper中如何传递多个参数?
1、第一种: DAO 层的函数
- public UserselectUser(String name,String area);
- 对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二
- 参数,更多参数一致往后加即可。
-
- <select id="selectUser"resultMap="BaseResultMap">
- select * fromuser_user_t whereuser_name = #{0}
- anduser_area=#{1}
- select>
2、第二种: 使用 @param 注解:
- public interface usermapper {
- user selectuser(@param(“username”) string
- username,@param(“hashedpassword”) string hashedpassword);
- }
然后,就可以在 xml 像下面这样使用(推荐封装为一个 map,作为单个参数传递给mapper):
- <select id=”selectuser” resulttype=”user”>
- select id, username, hashedpassword
- from some_table
- where username = #{username}
- and hashedpassword = #{hashedpassword}
- select>
- 3、第三种:多个参数封装成 m
ap
- try {
- //映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的
- SQL
- //由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此
- 我们使用 Map 集合来装载我们的参数
- Map < String, Object > map = new HashMap();
- map.put("start", start);
- map.put("end", end);
- return sqlSession.selectList("StudentID.pagination", map);
- } catch (Exception e) {
- e.printStackTrace();
- sqlSession.rollback();
- throw e;
- } finally {
- MybatisUtil.closeSqlSession();
- }
15、Mybatis动态sql有什么用?执行原理?有哪些动态sql?
16、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有
18、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联 集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自 动 ORM 映射工具。
19、 一对一、一对多的关联查询 ?
- <mapper namespace="com.lcb.mapping.userMapper">
- <select id="getClass" parameterType="int"
- resultMap="ClassesResultMap">
- select * from class c,teacher t where c.teacher_id=t.t_id and
- c.c_id=#{id}
- select>
- <resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
- <id property="id" column="c_id"/>
- <result property="name" column="c_name"/>
- <association property="teacher"
- javaType="com.lcb.user.Teacher">
- <id property="id" column="t_id"/>
- <result property="name" column="t_name"/>
- association>
- resultMap>
- <select id="getClass2" parameterType="int"
- resultMap="ClassesResultMap2">
- select * from class c,teacher t,student s where c.teacher_id=t.t_id
- and c.c_id=s.class_id and c.c_id=#{id}
- select>
- <resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
- <id property="id" column="c_id"/>
- <result property="name" column="c_name"/>
- <association property="teacher"
- javaType="com.lcb.user.Teacher">
- <id property="id" column="t_id"/>
- <result property="name" column="t_name"/>
- association>
- <collection property="student"
- ofType="com.lcb.user.Student">
- <id property="id" column="s_id"/>
- <result property="name" column="s_name"/>
- collection>
- resultMap>
- mapper>
20、MyBatis实现一对一有几种方式?具体怎么操作的?
21、MyBatis实现一对多有几种方式,怎么操作的?
有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap 里面的 collection 节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的 结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的查询通过 select 节点配置。
22、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
23、Mybatis的一级、二级缓存:
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
24、什么是MyBatis的接口绑定?有哪些实现方式?
25、使用MyBatis的mapper接口调用时有哪些要求?
26、Mapper编写有哪几种方式?
第一种:接口实现类继承 SqlSessionDaoSupport:使用此种方法需要编写mapper 接口,mapper 接口实现类、mapper.xml 文件。
1、在 sqlMapConfig.xml 中配置 mapper.xml 的位置
- <mappers>
- <mapper resource="mapper.xml 文件的地址" />
- <mapper resource="mapper.xml 文件的地址" />
- mappers>
1、定义 mapper 接口
3、实现类集成 SqlSessionDaoSupport
mapper 方法中可以 this.getSqlSession()进行数据增删改查。
4、spring 配置
- <bean id=" " class="mapper 接口的实现">
- <property name="sqlSessionFactory"
- ref="sqlSessionFactory">property>
- bean>
第二种:使用 org.mybatis.spring.mapper.MapperFactoryBean:
1、在 sqlMapConfig.xml 中配置 mapper.xml 的位置,如果 mapper.xml 和mappre 接口的名称相同且在同一个目录,这里可以不用配置
- <mappers>
- <mapper resource="mapper.xml 文件的地址" />
- <mapper resource="mapper.xml 文件的地址" />
- mappers>
2、定义 mapper 接口:
1、mapper.xml 中的 namespace 为 mapper 接口的地址
2、mapper 接口中的方法名和 mapper.xml 中的定义的 statement 的 id 保持一
致
3、Spring 中定义
- <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
- <property name="mapperInterface" value="mapper 接口地址" />
- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
- bean>
第三种:使用 mapper 扫描器:
1、mapper.xml 文件编写:
mapper.xml 中的 namespace 为 mapper 接口的地址;
mapper 接口中的方法名和 mapper.xml 中的定义的 statement 的 id 保持一致;如果将 mapper.xml 和 mapper 接口的名称保持一致则不用在 sqlMapConfig.xml中进行配置。
2、定义 mapper 接口:
注意 mapper.xml 的文件名和 mapper 的接口名称保持一致,且放在同一个目录
3、配置 mapper 扫描器:
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="mapper 接口包地址
- ">property>
- <property name="sqlSessionFactoryBeanName"
- value="sqlSessionFactory"/>
- bean>
4、使用扫描器后从 spring 容器中获取 mapper 的实现对象。
27、简述Mybatis的插件运行原理,以及如何编写一个插件。
更文较慢,更多资料可以评论区回复666或私信我领取,免费分享