关于MyBatis

MyBatis 是⼀个可以⾃定义 SQL、存储过程和⾼级映射的持久层框.
关于MyBatis的缓存,MyBatis 的缓存分为⼀级缓存和⼆级缓存,⼀级缓存放在 session ⾥⾯,默认 就有,⼆级缓存放在它的命名空间⾥,默认是不打开的,使⽤⼆级缓存属性类需要 实现 Serializable 序列化接⼝(可⽤来保存对象的状态),可在它的映射⽂件中配置。
MyBatis分页,1)Mybatis 使⽤ RowBounds 对象进⾏分⻚,也可以直接编写 sql 实现分⻚, 也可以使⽤ Mybatis 的分⻚插件。 2)分⻚插件的原理:实现 Mybatis 提供的接⼝,实现⾃定义插件,在插件的 拦截⽅法内拦截待执⾏的 sql,然后重写 sql。 举例:select from student,拦截 sql 后重写为:select t. from (select * from student)t limit 0,10。
MyBatis和Hibernate的区别:
1)Mybatis 和 hibernate 不同,它不完全是⼀个 ORM 框架,因为 MyBatis 需 要程序员⾃⼰编写 Sql 语句,不过 mybatis 可以通过 XML 或注解⽅式灵活配 置要运⾏的 sql 语句,并将 java 对象和 sql 语句映射⽣成最终执⾏的 sql,最 后将 sql 执⾏的结果再映射⽣成 java 对象。
2)Mybatis 学习⻔槛低,简单易学,程序员直接编写原⽣态 sql,可严格控制 sql 执⾏性能,灵活度⾼,⾮常适合对关系数据模型要求不⾼的软件开发,例 如互联⽹软件、企业运营类软件等,因为这类软件需求变化频繁,⼀但需求变 化要求成果输出迅速。但是灵活的前提是 mybatis ⽆法做到数据库⽆关性,如 果需要实现⽀持多种数据库的软件则需要⾃定义多套 sql 映射⽂件,⼯作量 ⼤。
3)Hibernate 对象/关系映射能⼒强,数据库⽆关性好,对于关系模型要求⾼的 软件(例如需求固定的定制化软件)如果⽤ hibernate 开发可以节省很多代 码,提⾼效率。但是 Hibernate 的缺点是学习⻔槛⾼,要精通⻔槛更⾼,⽽且 怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样⽤好 Hibernate 需要具有很强的经验和能⼒才⾏。
总之,按照⽤户的需求在有限的资源环境下只要能做出维护性、扩展性良好的 软件架构都是好架构,所以框架只有适合才是最好。
MyBatis的优点:
1)MyBatis 把 sql 语句从 Java 源程序中独⽴出来,放在单独的 XML ⽂件中 编写,给程序的维护带来了很⼤便利。
2)MyBatis 封装了底层 JDBC API 的调⽤细节,并能⾃动将结果集转换成 Java Bean 对象,⼤⼤简化了 Java 数据库编程的重复⼯作。
3)因为 MyBatis 需要程序员⾃⼰去编写 sql 语句,程序员可以结合数据库⾃ 身的特点灵活控制 sql 语句,因此能够实现⽐ Hibernate 等全⾃动 orm 框架 更⾼的查询效率,能够完成复杂查询。
MyBatis 的接口绑定和接口的实现方式:
接⼝映射就是在 MyBatis 中任意定义接⼝,然后把接⼝⾥⾯的⽅法和 SQL 语句绑定,我们直接调⽤接⼝⽅法就可以,这样⽐起原来了 SqlSession 提供的⽅ 法我们可以有更加灵活的选择和设置。
接⼝绑定有两种实现⽅式,⼀种是通过注解绑定,就是在接⼝的⽅法上⾯加上 @Select@Update 等注解⾥⾯包含 Sql 语句来绑定,另外⼀种就是通过 xml ⾥ ⾯写 SQL 来绑定,在这种情况下,要指定 xml 映射⽂件⾥⾯的 namespace 必须为接⼝的全路径名。
MyBatis的动态SQL
1)Mybatis 动态 sql 可以让我们在 Xml 映射⽂件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。
2)Mybatis 提供了 9 种动态 sql 标签: trim|where|set|foreach|if|choose|when|otherwise|bind。
3)其执⾏原理为,使⽤ OGNL 从 sql 参数对象中计算表达式的值,根据表达 式的值动态拼接 sql,以此来完成动态 sql 的功能
Mybatis 是否支持延迟加载?
1)Mybatis 仅⽀持 association 关联对象和 collection 关联集合对象的延迟加 载,association 指的就是⼀对⼀,collection 指的就是⼀对多查询。在 Mybatis 配置⽂件中,可以配置是否启⽤延迟加载 lazyLoadingEnabled=true|false。
2)它的原理是,使⽤ CGLIB 创建⽬标对象的代理对象,当调⽤⽬标⽅法时,进⼊拦截器⽅法,⽐如调⽤ a.getB().getName(),拦截器 invoke()⽅法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql, 把 B 查询上来,然后调⽤ a.setB(b),于是 a 的对象 b 属性就有值了,接着 完成 a.getB().getName()⽅法的调⽤。这就是延迟加载的基本原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值