高级映射

来源:互联网 发布:域名注册流程说明 编辑:程序博客网 时间:2024/06/07 11:39

数据模型分析思路

1.每张表记录的数据内容

分模块对每张表就的内容进行熟悉,相当于你学习系统需求(功能)的过程。

2.每张表的数据库字段的设置

非空字段、外键字段

3.数据库级别表与表之间的关系

外键关系

4.表与表的业务关系

在分析表与表之间的业务关系时一定要建立。

 

数据分析:

用户表(users):记录了购买商品的用户信息。

订单表(orders):记录了用户所创建的订单(购买商品的订单)。

订单明细表(orderdetails):记录了订单的详细信息,即购买商品的信息。

商品表(itmes):记录了商品信息。

 


一对一映射查询:

需求:需要订单信息,关联查询订单的用户信息。

ResultType:

SQL语句:selectorders.* ,users.username,users.sex,users.address from orders,useres whereorders.user_id=users.id;

创建vo实体类,包装类,通过此类映射订单和用户查询的结果,让此类继承较多的vo实体类

在自己的xml里面:

<mappernamespace=”com.neusoft.vo.OrderCustom”>

<select id=”findOrderCustom” ResultType =” OrderCustom”>

select orders.*,users.username,users.sex,users.address from orders,useres whereorders.user_id=users.id;

</select >

</mapper>

在dao接口中:publicList<OrderCustom> findOrderCustom();

resultMap:

SQL语句:selectorders.* ,users.username,users.sex,users.address from orders,useres where orders.user_id=users.id;

使用resultMap将查询结果的订单信息映射到Orders对象中,在Orders里面添加用户对象users,并将查询出来的结果中的用户信息映射到users对象中。

定义一个resultMap:

<resultMaptype=”com.neusoft.vo.Orders” id=”ordersUsersResultMap”>

<!—id:指定查询列中的唯一标识,如果有多个列组成唯一标识,那么就需要配置多个id

column :订单信息的唯一标识

property:订单信息的唯一标识列所映射字段名-->

<idcolumn=”id” property=”id” />

<resultcolumn=”userid” property=” userid”/>

<resultcolumn=”number” property=” number”/>

<resultcolumn=”createtime” property=” createtime”/>

<resultcolumn=”note” property=” note”/>

<!---配置映射的关联的用户信息,Property:将关联查询到的用户信息映射到Orders中的每个属性->

<associationproperty=”users” javaType=”com.neusoft.vo.Users”>

<idcolumn=”userid” property=”id” />

<resultcolumn=”username” property=” username”/>

<resultcolumn=”sex” property=” sex”/>

<resultcolumn=”birthday” property=” birthday”/>

<resultcolumn=”address” property=” address”/>

</association>

</resultMap>

resultType和resultMap的对比小结:

resultType:使用resultType实现较为简单,如果vo实体类中没有包括查询出来的列名,需要增加列名对象的属性,即可完成映射。

如果没有查询结果的特殊要求建议使用resultType。

ResultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射到vo实体类的字段中。

ResultMap可以实现延迟加载,resultType无法实现延迟加载。

 

 

 

一对多映射:

需求:查询订单及订单明细的信息。

SQL语句:select orders.*,orderdetail.id ordertail_id  from orders,orderdetails whereorders.id=orderdatils.orderid;

在订单实体类中添加订单明细变量,private List<Orderdetails> orderdetails;

定义resultMap:

<resultMaptype=”com.neusoft.vo.Orders” id=”ordersUsersResultMap”>

<!—id:指定查询列中的唯一标识,如果有多个列组成唯一标识,那么就需要配置多个id

column :订单信息的唯一标识

property:订单信息的唯一标识列所映射字段名-->

<idcolumn=”id” property=”id” />

<resultcolumn=”userid” property=” userid”/>

<resultcolumn=”number” property=” number”/>

<resultcolumn=”createtime” property=” createtime”/>

<resultcolumn=”note” property=” note”/>

<!—订单明细信息

一个订单关联查询出了多条明细,要使用collection进行映射

Collection:把查询到的多条就映射到集合对象中

Property:将查询的多条记录映射到orderdetails中-->

<collectionproperty=”orderdetails” ofType=”com.neusoft.vo.Orderdetails”>

<idcolumn=” ordertail_id”  property=”id”/>

<resultcolumn=”items_id” property =”itemsid” />

<resultcolumn=”items_num” property =”itemsnum” />

<resultcolumn=”orders_id” property =”ordersid” />

</collection>

</resultMap>

Mybatis采用collection对关联查询的多条记录映射到一个list集合中。

 

 

 

ResultMap总结:将association和collection实现一对一和一对多的高级映射。

 

 

 

什么是延迟加载?
resultMap可以实现高级映射(使用association和collection实现一对一和一对多的映射),association和collection具有延迟加载的功能。

延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库的性能,因为查询单表要比关联查询多张表速度要快。

0 0
原创粉丝点击