mybatis是什么

mybatis是一个半ORM(对象关系映射)框架,它内部封装好了jdbc,开发只需关注SQL语句本身,不必需要花费
精力区处理加载驱动 创建连接 创建statement等发炸的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活性能高

mybatis的优点

  1. 基于SQL语句编程,相当灵活,不会对应用程序或者数据的现有设计造成任何影响,SQL可以卸载XML里,

接触SQL与程序代码耦合,便于统一管理;提供XML标签,支持编写动态SQL,并可以重用
2. 与JDBC相比,减少50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
3.很好的与个汇总数据库兼容
4.能能够与spring很好的继承
5.提供映射标签,自持对象与数据库的ORM字段关系映射

#{}和${}的区别

{}是预编译处理,${}是字符串的替换
mybatis在处理#{}的时候。会把sql中的#{}替换为?,调用Prestatement的set放啊来赋值
mybatis在处理${}的时候,就是把${}替换成变量的值,使用#{}可以有效的防止SQL注入,提高系统的安全性

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

  1. 第一种一般是在查询的sql中定义字段名的别名,让字段名的别名和实体类类名一一致
  2. 通过映射字段名和实体类属性名的一一对应关系

    mybatis的动态SQL有什么用?执行原理?有哪些动态SQL

    mybatis动态sql可以在xml映射我呢见中,用标签的形式编写动态SQL,执行原理就是根据表达式完成逻辑判断
    并动态拼接SQL

mybatis是否支持延迟加载?如果支持他的原理是什么?

myabtis仅支持assication关联对象和collection关联集合的延迟加载,association指的就是一对一,
collection指的是一对多查询,在mybatis 的配置文件里面,可以配置是否启用延迟加载
lazyLoadingEnable=true/false
他的原理是,使用CGLIB创建目标对象的代理对象,当嗲用目标欧方法的时,进入拦截器,比如调用
a.getB().getName(),拦截器incoke()发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的
id,把b查询上来,然后调用a.set(B)方法,于是a的b属性就有值了,接着完成a.getB().getName()方法的调用

mybatis的一级 二级缓存

一级缓存:mybatis的一级缓存使用的是PerpetualCache类,内部是一个HashMap封装数据,其存储作用域为SQLSession,当SQLSession flush或者close之后,该Session中的所有的缓存Cache将清空,默认开启一级缓存
二级缓存:二级缓存与一级缓存机制相同,默认也是采用PerpetualCache,HashMap存储,不同于在其存储作用域为Mapper(NameSpace),并且可以自定义存储元,如EhCache。默认不打开二级缓存,使用二级缓存的属性
需要实现Serializable序列化接口
一般来说,我们不避免使用二级缓存,使用二级缓存 只能在单表操作的表上使用缓存,而且需要保证查询远远大于insert delete update

开启二级缓存
在XXXMapper.java为文件上直接配置@CacheNamespace
或者在XXXMapper..xml文件中增加属性

简述mybatis编写有哪几种方式