SQL映射文件详解


前言

SQL映射是MyBatis框架最具有特色的部分,功能强大且简单。SQL映射文件与该Mapper接口同名并放置在同一包路径下,SQL映射是所有sql语句存放的地方,在配置文件mybatisConfig.xml中通过mappers属性去映射。减少了代码解耦,可以最大限度的实现对sql语句的灵活管理,方便调优保证性能。


一、MyBatis框架的查询条件

实现单一条件查询

使用单条件查询可用parameterType定义参数类型,多条件查询参数太多类型不统一故不使用了

<select id="countUser" resultType="Integer" parameterType="Interge">
<!--#{} 相当于一个占位符-->
        select count(*) from t_sys_user where id =#{id}
    </select>

实现多条件查询

 <select id="getStorage" resultMap="StorageWithSupplier">
        select srCode,goodsName,supplierId,totalAmount,payStatus,re.createdTime
        from t_storage_record re,t_supplier su
        where goodsName like concat('%',#{goodsName},'%')
        and supplierId=#{supplierId}
        and payStatus =#{payStatus}
        and re.supplierId=su.id
    </select>

使用多条件查询参数有三种方式

1.将查询条件封装成Java对象作为参数

List<SysStorage> getStorage(SysStorage storage);

2.将查询条件封装成Map对象作为参数

List<SysStorage> getStorage(Map<String,Object> map);

3.使用@Param注解实现多参数

List<SysStorage> getStorage(@Param("goodsName") String goodsName,@Param("supplierId") Integer supplierId,@Param("payStatus") Integer payStatus);

MyBatis框架的结果映射

MyBatis框架能正确的将查询结果封装在实体类的属性中,这是MyBatis框架自动映射的结果,MyBatis框架会获取结果集中地列名称并查找具有相同名称的属性进行赋值,实际开发中的情况会更复杂命名规则不统一,列名、属性名不相同等问题,我们会使用resultMap元素来自定义结果映射,简单灵活功能强大

使用resultMap元素自定义结果映射

此处supName为数据库中的字段名称,与实体类中定义的字段名不同

 <resultMap id="StorageWithSupplier" type="SysStorage">
        <result property="supplierName" column="supName"></result>
    </resultMap>
    <select id="getStorage" resultMap="StorageWithSupplier">
        select srCode,goodsName,supplierId,totalAmount,payStatus,re.createdTime,supName
        from t_storage_record re,t_supplier su
        where goodsName like concat('%',#{goodsName},'%')
        and supplierId=#{supplierId}
        and payStatus =#{payStatus}
        and re.supplierId=su.id
    </select>

resultMap属性

属性名描述
id映射规则集的唯一标识,可以被 select 元素的 resultMap 属性引用
type映射的结果类型,这里指定封装成 SysUser 实例。
autoMapping如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)

resultMap元素的子元素

元素名描述
id指定和数据表主键字段对应的标识属性。设置此项可以提升 MyBatis 框架的性能,特别是应用缓存和嵌套结果映射的时候(多表联查时可使用别名对其进行命名,以免不知道是哪个表的id)
result指定结果集字段和实体类属性的映射关系。
constructor用于在实例化类时,注入结果到构造方法中
association一个复杂类型的关联;许多结果将包装成这种类型
collection一个复杂类型的集合
discriminator使用结果值来决定使用哪个 resultMap

嵌套结果映射

1.association元素
association元素处理“一对一”、“多对一”类型映射关系

<association property="实体类字段" javaType="所在的类名">
    <id column="表字段" property="实体类字段"/>
    <result column="表字段" property="实体类字段“/>
</association>
属性名描述
property实体类中用来映射查询结果子集的属性
javaTypeproperty指定的属性的数据类型,可以使用Java完全限定类名或别名
2.collection元素
collection元素处理“一对多”、“多对多”类型映射关系
<collection property="实体类字段名" ofType="所在类名">
<id column="表字段" property="实体类字段"/>
<result column="表字段" property="实体类字段“/>
</collection>
属性名描述
property实体类中用来映射查询结果子集的集合属性
ofTypeproperty指定的集合属性中的元素的数据类型,可以使用Java完全限定类名或别名

自动映射行为

<result column=“表字段” property="实体类字段“/>
没有将属性值设置为FULL时,嵌套结果集会自动映射,
设置为PARTIAL时自动映射但嵌套结果不会被映射,
设置为NONE 表示关闭自动映射
在这里插入图片描述

MyBatis增删改操作

insert语句
有时需要获取插入的该列的主键值可通过使用useGeneratedKeys=“true” keyProperty=“id” 这两属性去获得

<insert id="addSupplier" useGeneratedKeys="true" keyProperty="id">
        insert into t_supplier(supCode,supName,supContact)
        values(#{supCode},#{supName},#{supContact})
    </insert>

update语句

 <update id="updateSupplier">
        update t_supplier set supName=#{supName} where id = #{id}
    </update>

delete语句

<delete id="deleteSupplier">
        delete from t_supplier where id = #{id}
    </delete>

总结

resultType与 resultMap 小结

从使用场景来看,resultType 属性直接指定结果类型,依靠自动映射实现对实体类等复杂数据类型的封装,适用于比较简单、直接的数据封装场景:而 resultMap 属性是对外部 resultMap 定义的引用,以自由控制结果映射规则和封装范围,能够处理结果集字段名与实体类属性名不一致,或需要对连接查询结果使用嵌套映射等较为复杂的问题。
从底层实现来看,MyBatis 框架将查询出来的结果集首先存储在 Map 结构中,以字段名作为 key当 select 元素使用 resultType 属性指定结果类型时,MyBatis 架会自动将 Map 中的键值对对应赋值给实体类中与 key 同名的属性 (通过调用 setter 访问器实现): 使用 resultMap 属性时,则根据所引用的resultMap 元素中定义的映射规则把 Map 中的键值对赋值给指定的实体类属性。
注意
使用 resultType 属性或 resultMap 属性封装查询结果本质上是一样的,均基于 Map 数据结构但是,在 select 元素中使用时需要注意,二者不能同时使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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框架会根据映射文件中的配置信息,自动将对象与数据库表进行映射,简化了开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值