MyBatis 面试题
1、什么是 Mybatis?
2、Mybaits 的优点:
3、MyBatis 框架的缺点:
4、MyBatis 框架适用场合:
5、MyBatis 与 Hibernate 有哪些不同?
6、#{}和${}的区别是什么?
7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
8、 模糊查询 like 语句该怎么写?
1、什么是 Mybatis?
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
2、Mybaits 的优点:
-
易于上手和掌握。
-
sql写在xml里,便于统一管理和优化。
-
解除sql与程序代码的耦合。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
3、MyBatis 框架的缺点:
-
sql工作量很大,尤其是字段多、关联表多时,更是如此。
-
sql依赖于数据库,导致数据库移植性差。
-
由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
-
字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
-
DAO层过于简单,对象组装的工作量较大。
-
不支持级联更新、级联删除。
-
编写动态sql时,不方便调试,尤其逻辑复杂时。
-
若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
-
参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
-
多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
-
缓存使用不当,容易产生脏数据。
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语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
方法二:通过来映射字段名和实体类属性名的一一对应的关系
在这里插入图片描述