What's this
- 是一款优秀的持久层框架,用于简化 JDBC 开发
- 是 Apache 的一个开源项目
Java EE 三层架构:表现层、业务层、持久层(存储层)
(持久层:负责将数据保存到数据库的那一层代码)
ORM(Object Relation Mapping)框架
即对象关系映射框架,意义是在关系型数据库(如MySQL)和业务实体对象(如POJO)之间作一个映射。经过分层和封装让我们在具体操作业务对象时,就不需要去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
为什么不要原始的 JDBC 而要引入 ORM 框架呢?因为纯用 JDBC 导致项目代码量增多且冗余又不好维护。
所谓框架就是一个半成品软件,属于一套可重用、通用的软件基础代码模型,因此在框架的基础上构建软件会更加高效、规范、通用以及可扩展。
JDBC 缺点:
- 硬编码(不易统一配置文件)
- 注册驱动、获取连接
- SQL 语句
- 操作繁琐(不能自动完成)
- 手动设置参数
- 手动封装结果集
如何使用 Mybatis?
- 引入 pom.xml 依赖文件
- 写个 Mybatis 配置文件(mybatis-config.xml)
- 编写映射文件,即写出实体对象和数据库的映射关系(Dao / Mapper)
- 获取 sqlSession 对象(相当于 JDBC 的 Connection 对象)并执行 SQL 语句
- 关闭资源(sqlSession)
Dao / Mapper 代理开发
- 通过使用 / 来让 resources 文件和 java 文件识别到同一目录下
- 记得把 Mapper 接口的全限定类名写到xml文件里
- 接口方法名和SQL语句的 id 一致且保持参数列表一致
- 通过SqlSession对象的getMapper()方法获取接口的代理对象并调用方法
- 处理结果集后释放资源
MyBatis XML配置文件的结构
每一个在包 domain.blog
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author
的别名为 author
;若有注解,则别名为其注解值。 (不区分大小写)
配置文件完成“增删改查”
实体表、属性名 和 表名、列名一致问题
数据库表字段名和实体类属性名不一致,则不能自动封装数据
- 起别名:对不一样的列名起别名,让别名和列名一致(缺点:每次查询都需定义)
- SQL片段替换:一次写好多次调用(缺点:比较呆板)
- resultMap:利用属性名绑定(需要定义resultMap标签)
id:唯一标识
type:映射的类型,支持别名(实体名)
<resultMap>
id:完成主键字段的映射
result:完成一般字段的映射
<result>
column:数据表字段的别名
property:实体类的属性名
</result>
</resultMap>
参数占位符 # 和 $ 的参数替换
- #{}:会将其替换为 ?,是为了防止 SQL 注入问题,所以为了安全优先用 # (参数传递)
- ${}:直接拼接 SQL,会存在 SQL 注入问题(表名或列名不固定时)
由于接口方法的参数规范,所以一般不用写Mapper.xml文件里的参数类型(paremeterType)。
特殊字符处理方式:
- 转义字符:如下表格
- CDATA 区:<!CDATA[ 内容 ]]>
格式 | 描述 |
---|---|
& | 和& |
< | 小于号< |
> | 大于号> |
| 空格 |
" | 双引号" |
© | 版权符© |
® | 注册符® |
条件查询*
- 编写接口方法:Mapper interface
- 参数如何设置?
- 结果如何接收?
- 编写SQL语句:SQL 映射文件 .XML
- 执行方法等
MyBatis 事务
- openSession():默认开启事务,进行增删改操作后需要使用 sqlSession.commit(); 手动提交事务
- openSession(true):可以设置为自动提交事务
所谓“动态”就是无尽的判断
注解完成“增删改查”
暂空
总结:MyBatis 的 JDBC 主要由 xml 环境依赖配置文件和 xml(SQL)操作文件还有 Dao/Mapper 接口以及 java 运行文件及 java 实体类组成
扩展:遇到错误
数据类型默认错误,如int类型默认为0
mybatis-config.xml 配置文件识别不到错误