Mybatis
- 支持定制SQL、存储过程的持久层框架,减少JDBC模板代码,手动设置参数以及获取结果集
- MyBatis 可以对配置和原生Map使用简单的 XML 或注解
- 将JPO映射成数据库中的记录
Mybatais框架结构
- API接口层:接受用户的请求,然后调用数据处理层,完成数据处理
- 数据处理层:负责SQL查找、SQL解析、SQL执行,结果映射,完成一次数据库操作
- 基础支持层:负责最基础的功能支持,连接管理、事务管理、配置加载和缓存处理
MyBatis的优缺点
优点
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
-
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
-
解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
缺点
-
编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
-
SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
-
框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
-
二级缓存机制不佳
安装
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
从XML构建SqlSessionFactory
每个Mybatais的应用都是以SqlSessionFactory的实例为核心的.SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder获得,而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的Configuration 的实例构建出 SqlSessionFactory 的实例
mybatis的xml配置文件,包含了mybatis系统的和兴设置,包含数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
mappers元素则是包含一组映射器(mapper,这些映射器的 XML 映射文件包含了SQL代码和映射定义信息
构建SqlSessionFactiory
//加载mybatis的配置文件
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
使用java构建SqlSessionFactory
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
说了这么多,我们的目的就是通过SqlsessionFactory来构建我们的Sqlsession
Sqlsession实例包含了所有完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过SqlSession 实例来直接执行已映射的 SQL 语句。(!!!sqlsession是线程不安全的,每次处理完成后,需要关闭)