MyBatis常见面试题整理

MyBatis 面试题

1、什么是 Mybatis?

2、Mybaits 的优点:

3、MyBatis 框架的缺点:

4、MyBatis 框架适用场合:

5、MyBatis 与 Hibernate 有哪些不同?

6、#{}和${}的区别是什么?

7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

8、 模糊查询 like 语句该怎么写?


1、什么是 Mybatis?

mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

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

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

2、Mybaits 的优点:

  1. 易于上手和掌握。

  2. sql写在xml里,便于统一管理和优化。

  3. 解除sql与程序代码的耦合。

  4. 提供映射标签,支持对象与数据库的orm字段关系映射

  5. 提供对象关系映射标签,支持对象关系组建维护

  6. 提供xml标签,支持编写动态sql。

3、MyBatis 框架的缺点:

  1. sql工作量很大,尤其是字段多、关联表多时,更是如此。

  2. sql依赖于数据库,导致数据库移植性差。

  3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

  4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)

  5. DAO层过于简单,对象组装的工作量较大。

  6. 不支持级联更新、级联删除。

  7. 编写动态sql时,不方便调试,尤其逻辑复杂时。

  8. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。

  9. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

  10. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

  11. 缓存使用不当,容易产生脏数据。

4、MyBatis 框架适用场合:

MyBatis是一个半映射的框架,它也支持缓存,级联等操作,缺点就在于需要你提供映射规则和SQL,
工作量比Hibernate要大。MyBatis虽然开发不如Hibernate效率高,但是其灵活,可SQL优化的特点很
吸引人,正因为此,在于大数据,高并发移动互联网项目中较为常用。

5、MyBatis 与 Hibernate 有哪些不同?

1、开发方面
        在项目开发过程当中,就速度而言:
            hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发;
            Mybatis 属于半自动化,sql需要手工完成,稍微繁琐;
        但是,凡事都不是绝对的,如果对于庞大复杂的系统项目来说,发杂语句较多,选择hibernate 就不是一个好方案。
2、 sql优化方面
        Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;
        Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;
2、对象管理比对
        Hibernate 是完整的对象-关系映射的框架,开发工程中,无需过多关注底层实现,只要去管理对象即可;
        Mybatis 需要自行管理 映射关系;

6、#{}和${}的区别是什么?

 #{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
 ${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

 1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.

 2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.

 3 使用#可以很大程度上防止sql注入。(语句的拼接)

 4 但是如果使用在order by 中就需要使用 $.

 5 在大多数情况下还是经常使用#,但在不同情况下必须使用$. 

7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

方法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
在这里插入图片描述
方法二:通过来映射字段名和实体类属性名的一一对应的关系
在这里插入图片描述
在这里插入图片描述

发布了44 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42784951/article/details/104632723