MyBatis干的——resultType、resultMap等常用标签详解

  • Post author:
  • Post category:其他


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 多对多关联

要实现多对多的关联,需要满足如下两个条件:

  • 多对多需要一种中间表建立连接关系;
  • 多对多关系是由两个一对多关系组成的,一对多可以也可以用两种方式实现;



版权声明:本文为qq_31129841原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。