不一样 使用别名 数据字段和bean_Mybatis-<resultMap>标签详解

是Maybatis的结果集封装,搭配等标签的resultMap属性使用

属性:

id:该封装规则的唯一标识

type:封装出来的类型,可以是jdk自带的,比如Map,应该可以是自定义的,比如Employee

autoMapping:自动封装,如果数据库字段和javaBean的字段名一样,可以使用这种方式,但是不建议采取,还是老老实实写比较稳妥,如果非要使用此功能,那就在全局配置中加上mapUnderscoreToCamelCase=TRUE,它会使经典数据库字段命名规则翻译成javaBean的经典命名规则,如:a_column翻译成aColumn

extends:继承其他封装规则,和Java中的继承一样,也特别适合这样的场景

子标签:

用来标识出对象的唯一性,比如用表的主键,如:

column指定数据库字段名或者其别名

property指定javaBean的属性名

还有jdbcType,javaType,typeHandler,分别数据库类型,属性的java类型,数据库与Java类型匹配处理器

默认的类型匹配处理器有:

以上罗列的资料不全,可以参考官方文档的如下章节

非主键的映射规则

属性:

property:同标签

javaType:同标签

select:指定嵌套SQL,可以是本XML或者其他XML文件中的

fetchType:延迟加载,lazy打开延迟加载;eager积极加载

column:同标签

resultMap:不使用嵌套SQL,而是使用复杂SQL一次取出关联的对象,并封装,对应下面的方式三

resultSet:引用根据标签得到的resultSets,如:

SELECT * FROM BLOG WHERE ID = #{id}

SELECT * FROM AUTHOR WHERE ID = #{id}

{call getBlogsAndAuthors(#{id,jdbcType=INTEGER,mode=IN})}

autoMapping:同标签

columnPrefix:关联多张表查询时,为了使列明不重复,使用此功能可以减少开发量

select

B.id as blog_id,

B.title as blog_title,

A.id as author_id,

A.username as author_username,

A.password as author_password,

A.email as author_email,

A.bio as author_bio,

CA.id as co_author_id,

CA.username as co_author_username,

CA.password as co_author_password,

CA.email as co_author_email,

CA.bio as co_author_bio

from Blog B

left outer join Author A on B.author_id = A.id

left outer join Author CA on B.co_author_id = CA.id

where B.id = #{id}

抽取出共同的resultMap,因为作者和其他作者都具有同样的属性,因此有:

resultMap="authorResult" />

resultMap="authorResult"

columnPrefix="co_" />

foreignColumn:外键列

notNullColumn:不为空的列,如果指定了列,那么只有当字段不为空时,Mybatis才会真正创建对象,才能得到我们想要的值

typeHandler:同标签

方式一:

select employee_id,first_name,last_name,gendor,birthday,a.dept_id,dept_name,dept_desc

from employee a,department b

where a.dept_id=b.dept_id

and a.employee_id=#{id}

方式二:

select="com.jv.dao.DepartMentMapper.getDepartMentByIdNew" column="dept_id">

select="com.jv.dao.PostMapper.getPostById" column="post_id">

select employee_id,first_name,last_name,gendor,birthday,dept_id,post_id

from employee a

where a.employee_id=#{id}

方式三:

select employee_id,first_name,last_name,gendor,birthday,a.dept_id,dept_name,dept_desc

from employee a,department b

where a.dept_id=b.dept_id

and a.employee_id=#{id}

和association很像,collection是负责处理多行的结果集,如:

方式一:

使用嵌套SQL

SELECT * FROM BLOG WHERE ID = #{id}

SELECT * FROM POST WHERE BLOG_ID = #{id}

方式二:

使用复杂查询-在collection中直接配置封装规则

select

B.id as blog_id,

B.title as blog_title,

B.author_id as blog_author_id,

P.id as post_id,

P.subject as post_subject,

P.body as post_body,

from Blog B

left outer join Post P on B.id = P.blog_id

where B.id = #{id}

方式三:

使用复杂查询-抽取封装规则放到resultMap中

select

B.id as blog_id,

B.title as blog_title,

B.author_id as blog_author_id,

P.id as post_id,

P.subject as post_subject,

P.body as post_body,

from Blog B

left outer join Post P on B.id = P.blog_id

where B.id = #{id}

方式二和方式三只有在封装的方式上有区别

负责根据返回的字段的值封装不同的类型,如:

上面的配置就是如果vehicle_type的值是1,那么封装的结果为carResult,同事carResult又继承了vehicleResult的所有普通封装规则,最后的它结果可以按照下面的配置理解

使用构造器注入属性值,可能会问既然通过和就可以给属性注入值了,为什么还有一个构造器注入的,原因是有的JavaBean没有提供属性的getter和setter方法。

为了维护更方便,推荐在使用构造器注入的时候加上name属性,该属性值与构造器参数名字相同(需要编译参数加上-parameters,Jdk版本为1.8,而且Mybatis的参数useActualParamName设置为true(默认值为true)),也可以使用@param("paramName")指定特殊的参数名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值