1.mybatis是什么?
mybatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,得到statement,处理结果集等复杂的过程。
mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。
2.工作原理
mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。
3.工作的流程
mapper接口:
接口的全类名是xml文件中namespace的值。
- 接口中的方法名是xml文件中mapperstatement的id值。
- 接口中方法的参数就是传递给sql的参数
- mapper接口是没有实现类的,当调用一个方法时,接口的全类名定位一个配置文件,接口的方法名定位这个配置文件中的一个mapperStatment,所以说mapper的方法名是不能重载的,因为mapperStatment的保存和寻找策略。
- mapper接口的工作原理是,mybatis会使用jdk动态代理方式为mapper接口创建proxy对象,代理对象会拦截接口中的方法,转而执行mapperStatment所代表的sql语句,然后将执行的结果封装返回。
4.mybatis解决的问题
- 1.使用数据库连接池管理链接,避免了频繁创建了、关闭链接,浪费资源,影响性能的问题。
- 2.用xml管理sql语句,让Java代码和sql语句分离,使得代码更易维护。
- 3.解决了sql语句参数不定的问题。xml中可以通过where条件决定sql语句的条件参数。mybatis将Java对象映射到sql语句,通过statement的parameterType定义输入参数的类型。
- 4.mybatis自动将结果集封装成Java对象, 通过statement的resultType定义输出的类型。避免了因sql变化,对结果集处理麻烦的问题。
1、mybatis的编程步骤?
创建sqlSessionFactory
通过sqlSessionFactory创建SqlSession
sqlSession执行数据库操作
调用session.commit()提交事务
调用session.close()关闭会话
2、jdbc有哪些不足之处,mybatis是如何解决的?
数据库频繁的创建和释放影响性能
解决:在SqlMapConfig.xml中配置数据连接池,管理数据库连接
sql语句写在代码中不易维护,实际应用中sql的变化很大
解决:将sql语句中配置在xml文件中与java代码分离
向sql语句中传参麻烦,where的条件不一定或多或少,占位符要与参数对应
解决:Mybatis自动将java对象映射到sql中
对结果集解析麻烦,sql变化对结果也有变化
解决:Mybatis自动将sql执行结果映射到java对象
3、mybatis的一级缓存、二级缓存
一级缓存:mysql内部缓存存储是一个hashMap,key是hashcode+sqlId+sql,value为查询出来的对象
二级缓存:作用域是一个mapper的namespace,即一个namespace中查询sql可以从缓存中获取数据,可以跨sqlsession
- MyBatis的编程步骤
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过SqlSession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭事务
- #{}和${}的区别是什么?
- #{}是预编译处理,${}是字符串替换;
- MyBatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
- MyBatis在处理时,会把
-
- {}替换成变量的值
- 使用#{}可以有效防止SQL注入,提高系统的安全性
- Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
- <resultMap>、<parameterMap>、<sql>、<include>、,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等
- JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
- JDBC编程的不足之处
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
- Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
- 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
- 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
- MyBatis的解决方案
- 在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
- 将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
- Mybatis自动将java对象映射至sql语句。
- Mybatis自动将sql执行结果映射至java对象。
- JDBC编程的不足之处
- MyBatis的优缺点
- 优点
- 易于上手和掌握
- Sql写在xml里面,便于统一管理和优化
- 减少Sql与程序代码的耦合
- 提供xml标签,支持动态Sql编写
- 缺点
- Sql工作量大,尤其是字段多,关联表多时,更是如此
- Sql依赖于数据库,导致数据库移植性差
- 由于xml里面标签id必须唯一,导致DAO中方法不支持方法重载。所以dao层必须是接口
- 优点
- 使用MyBatis的mapper接口调用时有哪些要求?
- Mapper接口方法名和mapper.xml中定义的每个sql的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
- Mapper.xml文件中的namespace即是mapper接口的类路径
- Mybatis和Hibernate的区别
- Hibernate是全自动ORM映射工具,而Mybatis是半自动ORM映射工具
- hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。
- 而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
- Hibernate数据库移植性远大于mybatis
- hibernate拥有完整的日志系统,mybatis则欠缺一些。
- hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
- mybatis相比hibernate需要关心很多细节
- sql直接优化上,mybatis要比hibernate方便很多。
- Hibernate是全自动ORM映射工具,而Mybatis是半自动ORM映射工具