文章目录
前言
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 | 实体类中用来映射查询结果子集的属性 |
javaType | property指定的属性的数据类型,可以使用Java完全限定类名或别名 |
2.collection元素 | |
collection元素处理“一对多”、“多对多”类型映射关系 |
<collection property="实体类字段名" ofType="所在类名">
<id column="表字段" property="实体类字段"/>
<result column="表字段" property="实体类字段“/>
</collection>
属性名 | 描述 |
---|---|
property | 实体类中用来映射查询结果子集的集合属性 |
ofType | property指定的集合属性中的元素的数据类型,可以使用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 元素中使用时需要注意,二者不能同时使用。