1.1 为什么需要ORM框架
原生的JDBC开发存在弊端:
- 工作量大,操作数据库至少要5步;
加载驱动-获得连接-创建语句-获取prepareStatement结果集—处理结果集关闭资源
- 业务代码和技术代码耦合;
- 连接资源手动关闭,带来了隐患;
MyBatis是一种半自动ORM框架,除了POJO和映射关系之外,还需要编写SQL语句;MyBatis映射文件三要素:SQL、映射规则和POJO。
1.2 核心类分析
1. SqlSessionFactoryBuilder:读取配置信息创建 SqlSessionFactory,建造者模式,方法级别 生命周期;
2. SqlSessionFactory:创建 Sqlsession,工厂单例模式,存在于程序的整个生命周期;
3. SqlSession:代表一次数据库连接,一般通过调用 Mapper 访问数据库,也可以直接发送 SQL 执行, ;线程不安全,要保证线程独享(方法级);
4. SQL Mapper:由一个 Java 接口和 XML 文件组成,包含了要执行的 SQL 语句和结果 集映射规则。方法级别生命周期
1.3 应该用resultType 还是 resultMap?
1.3.1 resultType
使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的POJO中必须有和它相同的字段对应,而resultType中的内容就是POJO在本项目中的位置
自动映射注意事项:
- 前提SQL列明与JavaBean属性一致;
- 使用resultType想用简写需要配置typeAliases(别名)
- 如果列明和JavaBean不一致,但列明符合单词下划线分割,Java是驼峰命名法,则mapUnderscoreToCamelCase可设置为true;
1.3.2 resultMap
resultMap是MyBatis中最重要最强大的元素。它可以从大量的JDBC ResultSets数据提取代码中解放出来,在对复杂语句进行联合映射的时候,它很可能可以代替数百行的同等功能代码。ResultMap的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。
使用场景:①字段有自定义的转化规则;②复杂的多表查询;
1.4 怎么传递多个参数?
传递参数有三种方式:
开发手册上也建议不用Map作为mapper的输入和输出,不利于代码的可读性和维护
例:
追加:
1.5 怎么样获取主键?
只针对MySql、Oracle获取自增主键,如果用uuid作为主键,这种方式没有用。。。
1.5.1 通过insert/update标签相关属性
注意:自增长序号不是简单的行数+1,而是序号最大值+1;(这个需要进一步确认,验证是否跟存储引擎有关)
1.5.2 通过selectKey元素
①Oracle获取主键:
Mysql 通过自增长序号获取主键示例:
1.6 SQL元素和SQL参数
SQL元素:用来定义可重用SQL代码段,可以包含在其他语句中;
SQL参数:向SQL语句中传递的可变参数,分为预编译#{}和传值${}两种
√ 预编译#{}:将传入的数据都当成一个字符串,会对传入的数据加一个单引号,能有效的防止SQL注入‘
√ 传值${}:传入的数据直接显示生成在SQL中,无法防止SQL注入;
动态报表、表名选取的列是动态的可以适当的使用$
1.7 动态SQL
1.7.1 动态SQL元素
①在 select 中使用 if 元素,where 元素可以在 查询条件之前加 where 关键字,同时去掉语 句的第一个 and 或 or
②在 update 中使用 if 元素,set 元素可以在值 设置之前加 set 关键字,同时去掉语句最有 一个逗号
③在 insert 中使用 if 元素,trim 元素可以帮助 拼装 columns 和 values
④使用 foreach 做批量插入
1.8 关联查询
1.8.1关联查询需要注意:
- 超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时, 保证被关联的字段需要有索引。
- 不得使用外键与级联,一切外键概念必须在应用层解决;
1.8.2 一对一关联嵌套结果方式
Association标签:嵌套结果方式常用属性:
- property:对应实体类中的属性名,必填;
- javaType:属性对应的Java类型;
- resultMap:可以直接使用现有的resultMap,不需要在这里配置映射关系。
1.8.3 一对一嵌套查询方式
association 标签嵌套查询方式常用属性:
- select :另一个映射查询的id, MyBatis 会额外执行这个查询获取嵌套对象的结果。
- column :列名(或别名),将主查询中列的结果作为嵌套查询的参数。
1.8.4 一对多关联
collection 支持的属性以及属性的作用和association 完全相同。
mybatis 会根据id 标签,进行字段的合并,合理配置好ID 标签可以提高处理的效率;
技巧:如果要配置一个相当复杂的映射,一定要从基础映射开始配置,每增加一些配置就进行对应的测试,在循序渐进的过程中更容易发现和解决问题。
1.8.5 多对多关联
要实现多对多的关联,需要满足如下两个条件:
- 多对多需要一种中间表建立连接关系;
- 多对多关系是由两个一对多关系组成的,一对多可以也可以用两种方式实现;