MyBatis
概念
Mybatis是Apache的一个开源项目ibatis,2010年这个项目由asf迁移到了google,并改名为Mybatis,2013年11月迁移到Github.
ibatis一词来源于 internet 和 abatis 组合,是一个基于Java的
持久层框架,ibatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
有哪些好处?
1.Mybatis是支持普通SQL查询,存储过程和高级映射的优秀
持久层框架.
2.Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装
3.Mybatis可以使用简单的XML注解用于配置和原始映射,讲接口和java的pojo映射成数据库中的记录
原理
Mybatis作为持久性框架,其主要思想是将程序中的大量sql语句剥离出来,配置在配置文件中,实现将sql与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改sql.
**
mybatis和hibernate的区别
**
- hibernate是全自动,而mybatis是半自动。
hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
- hibernate数据库移植性远大于mybatis。
hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、 mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某 数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。
- hibernate拥有完整的日志系统,mybatis则欠缺一些。
hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
- mybatis相比hibernate需要关心很多细节
hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为 mybatis使用简单,才导致它要比hibernate关心很多技术细节。mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因 此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。 但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。
- sql直接优化上,mybatis要比hibernate方便很多
由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而 hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就 是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵 活度上hibernate不及mybatis。
总结:
mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动
.mybatis定义别名typeAlias和package的区别
1)typeAlias具有属性type 和alias
(2).package具有属性name。顾名思义就是所在包的名字。,为一个包定义别名
简述一级缓存和二级缓存的区别
1.相同:都是采用prepetual的hashmap本地缓存
执行cud操作后,本地所有的select中的缓存将会被clear
2.不相同:一级缓存作用域为session,当session flush或close后缓存会消失
二级缓存储存作用域为Mapper,并且可以自定义存储资源,如ehcache
一对一标签
<association>用于一对一的关联查询的
<property>对象属性名称
javatype java对象类型
column 所对应的外键字段名称
select 使用另一个查询封装的结果
一对一和一对多的区别
调用存储过程
分析以下每行代码代表什么。
DELIMITER $//将定界符指定为 $
CREATE PROCEDURE mybatis.ges_user_count(IN sex_id INT, OUT user_count INT)//创建一个名为mybatis.get_ user_ count新的存储过程,有两个参数,一个sex_ id,一个user_count,数据库名.过程名是一个存储函数,传入参数,输出参数
BEGIN //执行的开始
IF sex_id=0 THEN//判断语句,如果传入的sex_ id 为0,则继续
SELECT COUNT() FROM mybatis.p_user WHERE p_user.sex=‘女’ INTO user_count;
//查询mybatis.p_ user 的记录数,将查询结果存入user_ sex 变量中,给变量设值
ELSE
SELECT COUNT() FROM mybatis.p_user WHERE p_user.sex=‘男’ INTO user_count;
//查询mybatis.p_ user 的记录数,将查询结果存入user_ sex 变量中,给变量设值
END IF**;//结束判断语句**
END //执行的结束
$ //结束并执行上面的命令
调用存储过程
DELIMITER;
SET @user_count=0;//设置初始值为0
CALL mybatis.ges_user_count(1,@user_count); //调用函数mybatis.ges_user_count,设置sex_id为1;
SELECT @user_count; //查询符合条件的对象个数