本是apache的一个开源项目,他是一个优秀的持久层框架。它对jdbc操作数据库的过程进行了封装,使开发者只关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果检索等jdbc复杂的操作。
优点:
1. 简单易学,容易上手
2. 与jdbc相比,消除了大量冗余代码,不需要手动开关连接
3. 能够与spring集成
4. 支持动态sql
缺点:
1. sql语句编写工作量大
2. 依赖于数据库,导致数据库移植性差
1. 数据库创建连接、释放繁琐造成资源浪费
2. sql语句在代码中硬编码,不易维护--------MyBatis将sql配置在了XXXmapper.xml中
3. 使用preparedstatement向占位符传参数存在硬编码,不易维护
4. 对结果集进行解析存在硬编码----------MyBatis自动将结果映射到java对象
1. 创建SqlSessionFactory
2. 通过SqlSessionFactory创建SqlSession
3. 通过SqlSession操作数据库
4. 调用session.commit()提交事务
5. 调用Session.close()关闭会话
ORM:对象关系映射
1. 都是持久层框架,底层都是封装的jdbc,区别是Mybatis是一个不完全的ORM框架,需要程序员自己编写Sql语句。MyBatis可以通过XML或者注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最终将sql执行的结果在映射成java对象。但是MyBatis无法做到数据无关性,适合对关系数据模型要求不高的软件开发。
2. Hibernate是一个完全的ORM框架,不需要程序员自己编写SQL语句。
1. mapper.xml的namespace必须是mapper接口的类路径
2. 接口方法的名称与映射文件中sql的id一致
3. 接口方法的参数类型与映射文件的parameterType一致
4. 接口方法的返回值类型与映射文件的resultType一致
1. #{}解析传递进来的参数数据
2. ${}对传递进来的参数原样拼接在SQL中
3. #{}是预编译处理,${}是字符串替换
4. 使用#{}可以有效防止sql注入
1. 使用别名,将别名设置成与属性名一致
2. 使用resultMap
1. useGeneratedKeys
2. selectKey
一级缓存是默认使用的,二级缓存需要手动开启。
禁止使用缓存useCache="false"
select语句默认是false
增删改语句默认是true
1. 一级缓存:就是sqlsession,在sqlsession中有一个是数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key就是sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象----------缓存的数据只在SqlSession内有效。
2. 二级缓存:就是同一个namespace下的mapper,二级缓存中,也有一个map----------所以对SqlSession是共享的。
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
1. 接口的全限定名就是映射文件的namespace值,接口的方法名就是映射文件中sql的id,接口全限定名+方法名可以唯一定位一个mappedStatement。
2. mapper接口里的方法不能重载,因为是全限定名+方法名的保存和寻找策略。
3. 工作原理:动态代理,为mapper接口生成代理proxy对象,代理对象执行接口方法,转而执行sql,然后将结果返回。
1. 不同的XML配置文件,如果配置了namespace,那么id可以重复
2. 如果没有配置namespace,那么id不能重复
1. 先建立属性名和表的字段之间的映射关系:别名或者resultMap
2. 通过反射创建对象,使用反射给对象的属性逐一赋值并返回
使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select@Update等注解里面包含Sql语句来绑定,
另外一种就是通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.
当Sql语句比较简单时候,用注解绑定,
当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多