一.SQL映射文件
SQL映射文件中的几个顶级元素介绍如下
① mapper:SQL映射文件的根元素。只有一个属性namespace,用于区分不同的mapper,必须全局唯一
② cache: 为给定命名空间配置缓存
③ cache-ref:应用其他命名空间中的缓存配置
④ resultMap:用来描述查询结果集中的字段和java实体类属性的对应关系。
⑤ sql:定义可重用的SQL语句块,可以在其他语句映射中引用,提高编写和维护SQL语句的效率
⑥ insert:映射insert语句。
⑦ update:映射update语句。
⑧ delete:映射delete语句。
⑨ select:映射select语句。
二.MyBatis框架的条件查询
实现单一条件查询
1. 定义 SQL 映射文件
假设你有一个 User
表,并且你想要根据用户名(username
)来查询用户信息。你可以创建一个名为 UserMapper.xml
的 SQL 映射文件,内容如下
2. 编写 Mapper 接口
接下来,你需要创建一个与 UserMapper.xml
对应的 Java 接口 UserMapper
:
3. 调用 Mapper 方法
最后,在你的服务层或控制器中,你可以通过 MyBatis 的 SqlSession 或 Mapper 代理来调用 UserMapper
接口中的 selectUserByUsername
方法
在这个示例中,targetUsername
是你想要查询的用户名。当你调用 selectUserByUsername
方法并传入用户名时,MyBatis 会将 #{username}
占位符替换为实际的用户名值,并执行相应的 SQL 查询语句。查询结果将被映射到 User
对象中并返回。
实现多条件查询
在MyBatis中实现多条件查询,你通常会使用<where>
和<if>
标签来构建动态的SQL查询语句。这些标签允许你根据参数的值来包含或排除某些查询条件。
1. 定义SQL映射文件
假设你有一个User
表,并且你希望根据用户名(username
)和年龄(age
)来查询用户信息。你可以创建一个名为UserMapper.xml
的SQL映射文件,内容如下:
在这个例子中,<where>
标签会智能地处理AND
或OR
条件。如果<where>
标签内没有任何子元素的内容返回(即没有查询条件),则<where>
标签本身不会被包含到生成的SQL语句中。
<if>
标签用于判断参数的值,如果满足条件(即参数值不为null
且不为空字符串),则包含相应的查询条件。
2. 编写Mapper接口
接下来,你需要创建一个与UserMapper.xml
对应的Java接口UserMapper
:
在这个接口中,selectUsersByConditions
方法接受一个User
对象作为参数,该对象包含了你想要作为查询条件的字段(如username
和age
)。
3. 调用Mapper方法
在你的服务层或控制器中,你可以通过MyBatis的SqlSession或Mapper代理来调用UserMapper
接口中的selectUsersByConditions
方法:
在这个示例中,你创建了一个User
对象,并设置了想要作为查询条件的字段的值。然后,你调用selectUsersByConditions
方法并传入这个对象。MyBatis会根据对象的属性值来构建SQL查询语句,并执行查询操作。查询结果将被映射到User
对象列表中并返回。
三.MyBatis框架的结果映射
MyBatis框架使用resultMap元素来自定义结果映射
resultMap 元素包含以下属性
① id:映射规则集的唯一标识,可以被select元素的resultMap属性引用
② type:映射的结果类型
resultMap 元素包含以下子元素
① id:指定和数据表主键字段对应的标识属性。设置此项可以提升MyBatis框架的性能,特别是应用缓存和嵌套结果映射的时候。
② result:指定结果集字段和实体类属性的映射关系
嵌套结果映射
1.association 元素
association元素用来处理“has-one”类型关系,如用户类内部“有一个”用户角色类型的属性,入库记录类中“有一个”供货商类型的属性。
association 元素的主要属性如下
① property:实体类中用来映射查询结果子集的属性。
② javaType:property指定的属性的数据类型,可以使用java完全限定类名或别名。
③ id。
④ result。
③ 和 ④中的含义和用法与在resultMap元素中相同,不再赘述。
1.collection 元素
collection 元素和 association 元素作用非常类似,只不过表达的是“一对多”关系,即实体类内部嵌套的是一个集合类型的属性。
collection 元素有如下常用属性
① property:实体类中用来映射查询结果子集的集合属性
② ofType:property 指定的集合属性中的元素的数据类型,可以使用java完全限定类名或别名
collection 元素的子元素与 association 元素及 resultMap 元素的基本一致,不再赘述。
resultMap与resultType 的区别
- 对象映射方式:
- resultMap:当查询返回的列名与POJO(Plain Old Java Object,普通Java对象)的属性名不一致时,resultMap可以用来定义列名和POJO属性名之间的映射关系。它允许用户自定义列名和Java对象属性名之间的映射关系,使得即使列名和属性名不完全匹配,也能成功进行映射。
- resultType:resultType直接表示查询的返回类型,它要求数据库查询的列名与POJO的属性名完全一致,才能进行映射。如果列名和属性名不匹配,则无法完成映射。
- 描述与处理:
- resultMap:在处理一对一表连接的情况时,resultMap通常在主表的POJO中嵌套另一个表的POJO,并使用association节点元素在mapper.xml中进行连接处理。这使得resultMap能够处理更复杂的查询结果,如一对多、一对一关系等。
- resultType:由于它要求列名和属性名完全一致,因此它更适用于简单的单表查询,且只能用于基本类型或List、Map等简单集合类型。它无法将查询结果映射到POJO的属性中,特别是在需要处理复杂查询结果时。
- 类型适用性:
- resultMap:在MyBatis中,查询的返回类型既可以使用resultType,也可以使用resultMap。resultMap提供了更灵活的映射方式,可以处理复杂类型的POJO和复杂的查询结果。
- resultType:它直接表示返回的类型,与resultMap不能同时存在于同一个mapper.xml文件中。
- 应用场景:
- resultMap:适用于列名与属性名不一致的情况,或者需要进行复杂映射,如一对多、一对一关系的情况。
- resultType:适用于列名与属性名一致且不需要复杂映射的简单查询场景。
- 性能:
- 在实际应用中,由于resultType的映射方式比较简单,所以它在性能上可能略优于resultMap。但是,在需要处理复杂查询和映射的情况下,resultMap提供了更大的灵活性和便利性。