SQL映射文件详解

一.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>标签会智能地处理ANDOR条件。如果<where>标签内没有任何子元素的内容返回(即没有查询条件),则<where>标签本身不会被包含到生成的SQL语句中。

<if>标签用于判断参数的值,如果满足条件(即参数值不为null且不为空字符串),则包含相应的查询条件。

2. 编写Mapper接口

接下来,你需要创建一个与UserMapper.xml对应的Java接口UserMapper

在这个接口中,selectUsersByConditions方法接受一个User对象作为参数,该对象包含了你想要作为查询条件的字段(如usernameage)。

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 的区别

  1. 对象映射方式
    • resultMap:当查询返回的列名与POJO(Plain Old Java Object,普通Java对象)的属性名不一致时,resultMap可以用来定义列名和POJO属性名之间的映射关系。它允许用户自定义列名和Java对象属性名之间的映射关系,使得即使列名和属性名不完全匹配,也能成功进行映射。
    • resultType:resultType直接表示查询的返回类型,它要求数据库查询的列名与POJO的属性名完全一致,才能进行映射。如果列名和属性名不匹配,则无法完成映射。
  2. 描述与处理
    • resultMap:在处理一对一表连接的情况时,resultMap通常在主表的POJO中嵌套另一个表的POJO,并使用association节点元素在mapper.xml中进行连接处理。这使得resultMap能够处理更复杂的查询结果,如一对多、一对一关系等。
    • resultType:由于它要求列名和属性名完全一致,因此它更适用于简单的单表查询,且只能用于基本类型或List、Map等简单集合类型。它无法将查询结果映射到POJO的属性中,特别是在需要处理复杂查询结果时。
  3. 类型适用性
    • resultMap:在MyBatis中,查询的返回类型既可以使用resultType,也可以使用resultMap。resultMap提供了更灵活的映射方式,可以处理复杂类型的POJO和复杂的查询结果。
    • resultType:它直接表示返回的类型,与resultMap不能同时存在于同一个mapper.xml文件中。
  4. 应用场景
    • resultMap:适用于列名与属性名不一致的情况,或者需要进行复杂映射,如一对多、一对一关系的情况。
    • resultType:适用于列名与属性名一致且不需要复杂映射的简单查询场景。
  5. 性能
    • 在实际应用中,由于resultType的映射方式比较简单,所以它在性能上可能略优于resultMap。但是,在需要处理复杂查询和映射的情况下,resultMap提供了更大的灵活性和便利性。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL映射文件是指在使用对象关系映射(ORM)框架时,为了将对象与数据库表进行映射而创建的文件。在Java开发中,常用的ORM框架有MyBatis和Hibernate,它们都支持使用SQL映射文件来定义对象与数据库表之间的映射关系。 SQL映射文件通常使用XML格式来编写,包含了一系列的SQL语句和配置信息。下面是一个简单的SQL映射文件示例: ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.UserMapper"> <select id="getUserById" resultType="com.example.User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.example.User"> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert> <update id="updateUser" parameterType="com.example.User"> UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete> </mapper> ``` 在上述示例中,`namespace`属性指定了映射文件对应的Mapper接口或类的全限定名。`select`、`insert`、`update`和`delete`标签分别定义了查询、插入、更新和删除操作的SQL语句,使用`id`属性指定了方法名,`parameterType`属性指定了方法参数的类型,`resultType`属性指定了查询结果的映射类型。 通过SQL映射文件,我们可以将数据库操作的SQL语句独立出来,降低了代码和SQL的耦合度,使得代码更加清晰、易于维护。ORM框架会根据映射文件中的配置信息,自动将对象与数据库表进行映射,简化了开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值