MyBatis 原本是 apache 的一个开源项目 iBatis, 2010年这个项目由 apache software foundation 迁移到了 google code,并且改名为MyBatis。2013年11月迁移到 Github下(https://github.com/mybatis/mybatis-3/releases)。
MyBatis 是一个优秀的持久层框架,它对 JDBC 的操作数据库的过程进行封装,使开发者只需要关注 sql 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 JDBC 繁杂的过程代码。
Mybatis 通过 xml 或 注解 的方式将要执行的各种 statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过 java 对象和 statement中 的 sql 进行映射生成最终执行的 sql 语句,最后由 MyBatis 框架执行 sql 并将结果集映射成 Java 对象并返回。
1、MyBatis 配置文件。
SqlMapConfig.xml:此文件作为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息。
mapper.xml:sql映射文件,配置了操作数据库的 sql 语句,此文件需要在 SqlMapConfig.xml 中加载。
2、通过 MyBatis 环境等配置信息构造 SqlSessionFactory(会话工厂)。
3、由会话工厂创建 SqlSession(会话),操作数据库需要通过 SqlSession 进行。
4、MyBatis 底层自定义了 Executor 执行器接口操作数据库,Executor 接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、Mapped Statement 也是 MyBatis 一个底层封装对象,它包装了 MyBatis 配置信息及 sql 映射信息等,mapper.xml 文件中一个 sql 对应一个 Mapped Statement 对象,sql 的 id 即是 Mapped statement 的 id。
6、Mapped Statement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 前将输入的 Java 对象映射至 sql 中,输入参数映射就是 JDBC 编程中对 preparedStatement 设置参数。
7、Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至 Java 对象中,输出结果映射过程相当于 JDBC 编程中对结果的解析处理过程。
1、配置 MyBatis 的配置文件:mybatis-config.xml(名称不固定)。
2、通过配置文件,加载 MyBatis 运行环境,创建 SqlSessionFactory 会话工厂(SqlSessionFactory 在实际使用时按单例方式)。
3、通过 SqlSessionFactory 创建 SqlSession。SqlSession 是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议 SqlSession 的应用场合在方法体内。
4、调用 SqlSession 的方法去操作数据。如果需要提交事务,需要执行SqlSession的commit()方法。
5、释放资源,关闭 SqlSession。
使用 MyBatis 开发 Dao 通常有两个方法:原始 Dao 、Mapper 动态代理开发(官方推荐)。
1、原始 DAO
代码:https://blog.csdn.net/qq_42322548/article/details/91703546
需要程序员编写 DAO 接口及其实现类。
需要在 DAO 接口的实现类上注入 sqlSessionFactory,创建 sqlSessionFactory 时需要读取 mapper.xml 到内存。
通过创建 sqlSession 对象来调用 mapper 中的 sql 语句,在操作结束后需要手工进行提交,释放资源,返回结果。
存在的问题:
2、Mapper 动态代理开发
代码:https://blog.csdn.net/qq_42322548/article/details/91718362
只需要程序员编写 mapper 接口(就是 dao 接口)。
程序员在编写mapper.xml(映射文件)和 mapper.java 需要遵循一个开发规范:
输入映射
parameterType:指定输入参数类型,可以为简单类型、pojo、hashmap。
MyBatis 通过 OGNL 从输入对象中获取参数值拼接在 sql 中。
对于综合查询,建议 parameterType 使用包装的 pojo,有利于系统扩展。
输出映射
MyBatis 将 sql 查询结果的一行记录数据映射为 pojo 对象(一对一),如果有多条数据则分别进行映射,并把对象放到容器 List 中(一对多)。
resultType:查询到的列名和映射的 pojo 的属性名一致时才能映射成功。
reusltMap:如果查询到的列名和映射的 pojo 的属性名不一致时,通过 resultMap 设置列名和属性名之间的映射关系,可以完成映射。
if判断
where
foreach
sql片段