数据模型分析思路
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具有延迟加载的功能。
延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库的性能,因为查询单表要比关联查询多张表速度要快。