SQL映射文件

本文详细介绍了MyBatis中SQL映射文件的使用,包括使用select完成单条件和多条件查询,利用resultMap进行结果映射,以及增删改操作。解释了mapper元素、resultMap、cache-ref、select、insert、update和delete等配置,并讨论了resultType与resultMap的区别和应用。同时,文章涵盖了resultMap的自动映射级别和MyBatis的缓存机制。

2.1使用MyBatis实现条件查询

2.1.1SQL映射文件

MyBatis真正强大之处就在于SQL映射语句,也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单。在上一章节中,我们简单地对比了SQL映射配置和JDBC代码.发现使用SOL映射文件配置可减少50%以上的代码量。并且MyBatis专注于SOL.对于开发人员来说,也可极大限度地进行SOL调优,以保证性能。下面是关于SQL映射文件的几个顶级元素配置:
➢mapper: 映射文件的根元素节点,只有一个属性namespace (命名空间).其作用如下:
◆用于区分不同的mapper,全局唯一
◆绑定DAO接口,即面向接口编程。当namespace绑定某接口之后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的mapper配置来执行SOL语句。因此namespace的命名必须要跟接口同名。
➢cache: 配置给定命名空间的缓存,
➢cache-ref: 从其他命名空间引用缓存配置。
➢resultMap: 用来描述数据库结果集和对象的对应关系。
➢sql: 可以重用的SQL块,也可以被其他语句引用。
➢insert: 映射插入语句。
➢update : 映射更新语句
➢delete:映射删除语句
➢select:映射查询语句

2.1.2使用select完成单条件查询

➢id:命名空间中唯一的标识符,可以被使用来引用这条语句
➢parameterType:表示查询语句传入参数的类型的完全限定名或别名.它支持基础数据类型和复杂数据类型。在上面的示例中使用的是基础数据类型"sting". 这是一个别名,代表String.属于一个内建的类型别名。对于普通的Java 类型,有许多内建的类型别名.并且它们对大小写不敏感。表2-1只列出了部分别名和Java类型的映射.其他的别名映射请参考MyBatis的帮助文档。在这里插入图片描述
➢resultType:查询语句返回结果类型的完全限定或别名.别名的使用方式与parameterType是一样的

2.1.3使用select完成多条件查询

2.1.4使用resultMap完成查询结果的展现

resultMap元素用来描述如何将结果集映射到Java对象,此处使用resultMap对列表展示所需的必要字段来进行自由映射,特别是当数据库的字段名和POJO中的属性名不- - 致的情况下.比如角色名称,字段名column是roleName,而User对象的属性名则为userRoleName,此时就需要做映射。
resultMap元素的属性值和子节点:
➢id属性:唯一标识,此id值用于select元素resultMap属性的引用。
➢type 属性:表示该resultMap的映射结果类型。
➢resut子节点:用于标识一些简单属性, 其中colurmn 属性表示从数据库中查询的字段名,propety则表示查询出来的字段对应的值赋给实体对象的哪个属性。
最后在测试类中进行相关字段的输出,展示列表(用户编码、 用户名称、性别、年龄、电话、用户角色)。注意:用户角色不再是角色id,输出的是角色名称。

MyBatis中在对查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap.么rsultType和resultMap到底有何关联和区别?应用场景又是什么?下面做详细讲解。

  1. resultType
    resultType直接表示返回类型,包括基础数据类型和复杂数据类型。

  2. resultMap
    resultMap则是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上。它的应用场景一般是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果。

  3. resultType和resultMap的关联
    在MyBatis进行查询映射的时候,其实查询出来的每个字段值都放在个对应的Map里面,其中键是字段名,值则是其对应的值。当select 元素提供的返回类型属性是resultType的时候. MyBatis会将Map里面的键值对取出赋给resultType 所指定的对象对应的属性( 即调用对应的对象里的属性的setter方法进行填充)。正因为如此,当使用resultType的时候,直接在后台就能接收到其相应的对象属性值。由此可看出,其实MyBatis的每个查询映射的返回类型都是resultMap, 只是当我们提供的返回类型属性是resultType的时候, MyBatis会自动把对应的值赋给resultType所指定对象的属性:而当我们提供的返回类型是resultMap的时候,因为Map不能很好地表示领域模型.我们就需要通过进一步的定义把它转化为对应的实体对象。
    当返回类型是resultMap时,也是非常有用的,这主要用在进行复杂联合查询上,当然在进行简单查询时是没有什么必要的,使用resultType足以。

4.resultMap的自动映射级别
在上面的示例中,选择部分字段进行resultMap映射,我们希望没有映射的字段不能在后台查询并输出的,即使SQL语句是查询所有字段(select*from…),因为我们使用resultMap也是为了自由灵活地控制映射结果,达到只对关心的属性进行赋值填充的目的

2.1.5技能训练

2.2使用MyBatis实现增删改操作

2.2.1使用insert完成增加操作

insert元素的属性
➢id:与select元素的id一样,是命名空间中唯一的标识符,可以被用来引用这条语句
➢parameterType:与select元素的parameterType一样,是传入参数的类型完全限定名或别名.别名的含义和用法见select元素中的解释

2.2.2使用update完成修改操作

Update元素的属性id和parameterType的含义和用法等同于insert元素中属性用法,此处不再赘述,另外由于是修改操作,因此更新的字段中须更新modifyBy和modifyDate.而不需要更新createBy和creationDate

2.2.3使用@Param注解实现多参数入参

使用注解@Param来传入多个参数入@param(“userPassword”)String pwd,相当于该参数pwd重命名为userPassword,在映射的SQL中需要使用#{注解名称},如#{userPassword}

2.2.4使用detele完成删除操作

delete元素的属性id和parameterType的含义和用法等同于insert.update元素中属性用法,此处不再赘述

2.2.5技能训练

2.3使用resultMap实现高级结果映射

2.3.1resultMap的基本配置

1.属性
➢id: resultMap的唯标识。
➢type: 表示该resultMap的映射结果类型(通常是Java 实体类)。
2.子节点
➢id: 一般对应数据库中该行的主键id,设置此项可以提升MyBatis性能.
➢result: 映射到JavaBean的某个简单类型” 属性,如基础数据类型、包装类等。
子节点id和result均可实现最基本的结果集映射,将列映射到简单数据类型的属性。这两者唯一不同的是:在比较对象实例时id将作为结果集的标识属性。这有助于提高总体性能,特别是应用缓存和嵌套结果映射的时候。而若要实现高级结果映射,就需要学习下面两个配置项: association和collection

2.3.2 assocaiation

association:映射到JavaBean的某个“复杂类型”属性,比如JavaBean 类.即JavaBean 内部嵌套一个复杂数据类型(JavaBean) 属性,这种情况就属于复杂类型的关联。但是需要注意: assocaiation仅处理一对一的关联关系。
下面通过一个示例来演示assocaiation具体的应用,示例需求:根据用户角色id获取该角色下的用户列表。

简单分析association的属性
➢javaType: 完整Java类名或者别名。若映射到一个JavaBean, 则MyBatis通常会自行检测到其类型:若映射到一个HashMap.则应该明确指定javaType,来确保所需行为。此处为Role。
➢property: 映射数据库列的实体对象的属性。此处为在User里定义的属性: role。
association的子元素如下:
➢id。
➢result。
◆property:映射数据库列的实体对象的属性。此处为Role的属性。
◆column; 数据库列名或别名。

2.3.3 collection

collection元素的作用和association元素的作用差不多一样, 事实上,它们非常类似,也是映射到JavaBean的某个“复杂类型” 属性,只不过这个属性是一个集合列表, 即JavaBean 内部嵌套一个复杂数据类型(集合)属性。和使用association元素一样,我们使用嵌套查询,或者从连接中嵌套结果集。
简单分析collection的属性
➢ofType:完整Java类名或者别名,即集合所包含的类型.此处为Address
➢property:映射数据库列的实体对象的属性.此处为在User里定义的属性:addressList可以理解为:一个名为addressList元素类型为Address的ArrayList集合
collection的子元素与association基本一致,此处不再赘述

2.3.4技能训练

2.4 resultMap自动映射级别和MyBatis缓存

2.4.1 resultMap自动映射级别

MyBatis对resultMap自动映射的三个匹配级别
➢NONE:禁止自动匹配
➢PARTIAL(默认):自动匹配所有属性,有内部嵌套(association.collection)的除外
➢FULL:自动匹配所有

2.4.2 MyBatis缓存

在这里插入图片描述

### SQL映射文件的定义 SQL映射文件是MyBatis框架中用于定义SQL语句及其与Java对象之间映射关系的核心配置文件。它通过XML格式描述了数据库操作的具体细节,包括查询、更新、删除等SQL语句,以及这些SQL语句的结果如何被映射到Java对象中[^1]。 #### 1. 文件命名与位置 为了便于管理和维护,SQL映射文件通常与其对应的Mapper接口同名,并存放在相同的包路径下。例如,`UserMapper.java` 接口对应的映射文件命名为 `UserMapper.xml` 并位于同一目录中。这样可以方便地通过接口的全限定名找到其对应的SQL映射文件。 #### 2. namespace属性 SQL映射文件中的根元素 `<mapper>` 需要设置 `namespace` 属性,其值为对应Mapper接口的全限定名(即包含包名的完整类名)。MyBatis通过组合 `namespace` 和 SQL语句的ID唯一标识每一条SQL语句,从而将其绑定到Mapper接口的方法上[^1]。 #### 3. 方法与SQL语句的映射 Mapper接口中的方法名需与SQL映射文件中定义的SQL语句ID一一对应。当调用某个Mapper方法时,MyBatis会根据 `namespace+ID` 找到相应的SQL语句并执行。 #### 4. 自动映射与手动映射 - **自动映射**:如果实体类的属性名与数据库表字段名完全一致,则可以直接使用 `resultType` 来指定返回结果的数据类型,MyBatis会自动完成映射[^2]。 - **手动映射**:对于不满足自动映射条件的情况(如数据库字段名含有下划线而实体类属性未遵循驼峰命名规则),需要借助 `<resultMap>` 进行显式的字段映射[^3]。 ```xml <!-- resultMap示例 --> <resultMap id="userResultMap" type="com.example.model.User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="email" column="email"/> </resultMap> ``` #### 5. 复杂关系映射 在处理一对多或多对多的关系时,可以利用 `<association>` 和 `<collection>` 标签分别表示单向关联和集合型关联[^4]。 --- ### 总结 SQL映射文件是MyBatis框架实现ORM(对象关系映射)的关键组成部分,负责将SQL语句抽象化并与Java对象建立映射关系。合理设计SQL映射文件能够极大地提高开发效率和代码可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值