MyBatis
ORM框架简介
主流ORM选项 (建议: 小型项目用jpa,大型项目用mybatis)
对比项 | Spring Data JPA | Mybatis |
---|---|---|
单表操作方式 | 只需继承,代码量极少,非常方便,而且支持方法名用关键字生成SQL | 可以使用代码生成工具,也很方便,但相对JPA单表弱很多JPA单表操作简单到令人发指 |
多表关联查询 | 友好 动态sql使用不够方便,而且sql和代码耦合到一起 | 非常友好,可以有非常直观的动态sql |
自定义SQL | sql写在注解里面,写动态sql有些费劲 | sql可以写在 |
学习成本 | 略高 | 会写sql就会用 |
认识MyBatis
优点:
- SQL被统一提取出来,便于统一管理和优化
- SQL和代码解耦,将业务逻辑和数据访问逻辑分离
- 提供映射标签,支持对象和数据库的ORM字段关系映射
- 提供对象关系映射标签,支持对象关系组件维护
- 灵活书写动态SQL,支持各种条件的动态SQL生成
缺点:
- 编写SQL语句时工作量大,尤其是字段多、关联表多的时候更是如此
- SQL语句依赖数据可,导致数据库移植性差
MyBatis的基本概念
- Mapper配置:可以使用基于xml的Mapper配置文件来实现,也可以使用基于java注解的MyBatis注解来实现,甚至可以直接用MyBatis提供的API来实现。
- Mapper接口:自行定义一个数据操作的接口,类似于通常说的DAO接口,MyBatis会自动为Mapper接口创建动态代理对象。
- Executor:Mybatis中所有的Mapper语句的执行都是通过Excutor进行,Executor是MyBatis的一个核心接口。
- SqlSession:执行持久化草所的对象,类似于JDBC中的Connection对象。可以使用SqlSession实例直接执行被映射的SQL语句。
- SqlSessionFactory:单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory对象的实例通过SqlSessionFactoryBuilder对象获得。
MyBatis工作流程
- 加载Mapper配置的SQL映射文件或SQL注解
- 通过读取配置文件,创建会话工厂SqlSessionFactory
- 根据会话工厂创建会话对象Sqlsession,绘画对象是一个接口,包含CRUD数据库操作的方法
- 创建Executor接口帮助会话对象执行操作
- 执行器处理的SQL信息封装到MappedStatement对象中
- 操作数据库,返回结果,结束流程
Spring中使用Mybatis
- 创建项目选择依赖、依赖配置
- Mybatis的公共属性配置peoperties相关配置等
- 表的映射xml文件配置
- java类和接口的定义
映射文件的元素
mapper:
-
<select>: 映射查询语句,可自定义参数,返回结果集等
-
<insert>: 映射插入语句,执行返回一个整数,代表插入的条数
-
<update>: 映射更新语句,执行返回一个整数,代表更新的条数
-
<delete>:映射删除语句,执行返回一个整数,代表删除的条数
-
<sql>: 用于定义一部分SQL,然后可被其他语句引用此SQL
-
<cache>: 给定命名空间的缓存配置
-
<cache-ref>: 其他命名空间缓存配置的引用
-
<resultMap>: 用来描述如何从数据库结果集中来加载对象
ResultMap
- 解决两个问题
- Pojo属性名和表结构字段名不一致(有时候不只是驼峰式)
- 高级查询
- 主要作用:定义映射规则、级联的更新以及定义类型转换器等
SQL语句日志输出配置
- SpringBoot默认使用logback记录日志
- MyBatis的执行SQL也可以使用Logback记录
- 在properties文件中配置logback配置文件的位置:
logging.config = classpath:logback.xml
- 在logback.xml文件中加入MyBatis SQL的输出配置
- 在properties文件中配置logback配置文件的位置:
MyBatis的注解
- 注解版最大的特点就是具体的SQL文件需要写在Mapper类中,取消了Mapper的xml配置。
- 数据库操作的注解:
- @Select: 查询时使用
- @Insert: 插入数据库时使用,直接传入实体类会自动解析属性到对应的值
- @Update: 处理数据更新
- @Delete: 处理数据删除