您的位置:首页 > Web前端 > JavaScript

###Jsp+Servlet购物商城day04.3:订单模块Order实体设计失误。【Bean属性设计两大原则】-MyBeanUtils使用注意事项。

2017-09-14 12:35 731 查看
Order  bean代码:

package cn.itcast.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

public class Orders implements Serializable{
private String oid;
//	private Date orderTime;
/*========#########======
===属性名和字段名不一致。导致set get方法名和字段名不一致。
插入订单信息时,因为是SQL 参数是 传参数:Order对象getDate();
====【插入 只需要SQL语句字段名和表字段对应即可,和属性get。set方法名称和字段名是否一致无关!!!。】
====【查询 封装数据时,这里使用了工具类MyBeanUtils(封装了BeanUtils,对日期类型进行注册),
他会根据map字段名匹配对应的get方法,读取map数据,把map封装为bean:BeanUtils.populate(bean,map)。
】
====这里,把ordertime 写成了date,插入订单成功。显示订单封装数据时,死活查不出来date和OrderItem的subtotal。
=====【找了一上午的错误,就是出不来!!】

===subtotal是计算出来的,不用set方法赋值【插入值的时候】。于是我给注释掉了。。。
* ====######===但是查询Order,BeanUtils封装查询的map时,需要set方法封装数据。
* 所以,原则:
* 【Bean的get set 方法即使一时没用到,全都加上。
* 不用管他,难保什么时候用到!!!】

public void setSubtotal(double subtotal) {
this.subtotal = subtotal;
}
========######=======总之:
【牢记bean属性设计 两大原则】:
《1》属性名和字段名 必须严格一致;
【即使属性名 不一致有时不会报错,但是大大减少出错的可能,检查错误也方便。
何况 后面学习 Struts2 必须要求一致,也能养成好习惯。】
《2》get set 方法 用不到的,bean 也全都给加上。===不要轻易删除。

======熟练BeanUtils的使用注意事项:属性名和字段名 必须严格一致;
* */
//private Date orderTime;//==###=getOrderTime()获取失败,只能getOrdertime()==(已测)
private Date ordertime;
private double total;
private int state;
//对着关系图写。sql语句找起来还是费点劲的。
private String address;
private String name;//===不使用user表的username,因为收货人未必是下单的用户。
private String telephone;
//	private String uid ;
private User user;//每个用户有自己的订单

//================#######===========【加深理解:Bean属性有 两种。业务需要,表字段映射】
//订单和订单项。1:n关系。所以Orders表里不需要添加 itemid属性。
//但是业务逻辑上: Orders 包含 多个OrderItem,Orders本就是用来封装OderItem的。
//(和分页 PageBean类似,封装数据,作用只不过是:方便页面取值)
//所以:和【Cart封装CartItem一样,这里也要添加一个Map<Stirng pid,OderItem item> 的map 封装多个订单项。 】
//===所以说:这个map属性是 业务需要。其他属性是表字段映射。
//private LinkedHashMap<String,OrderItem> orderItems = new LinkedHashMap<String,OrderItem>();
private List<OrderItem> orderItems = new ArrayList<OrderItem>();
/*
private List<OrderItem> orderItems;//teacher
===######=======为什么,CartItem用LinkedHashMap<String,CartItem>,
而OrderItem使用List<OrderItem>?
(前面说过,哪种集合都可以实现,实现复杂度不同。如何选择集合,实现最简单的集合呢?)其实都差不多。
* */
/*public Collection<OrderItem> getOrderItems() {
return orderItems.values();//===为了页面取值方便。
}*/
/*public Collection<OrderItem> getOrderItems() {
return orderItems.values();//===date,subtotal取不到。
}*/
public List<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List< OrderItem> orderItems) {
this.orderItems = orderItems;
}
public Orders() {
super();
}

public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
/*public Date getOrderTime() {//==getOrderTime()获取失败,只能getOrdertime()
return ordertime;
}*/
public Date getOrdertime() {
return ordertime;
}

public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public double getTotal() {
Collection<OrderItem> items = getOrderItems();
int total=0;
for (OrderItem item : items) {
total += item.getSubtotal();
}
return total;
}
public void setTotal(double total) {
this.total = total;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

/*@Override
public String toString() {
return "Orders [oid=" + oid + ", ordertime=" + ordertime + ", total=" + getTotal() + ", state=" + state + ", address="
+ address + ", name=" + name + ", telephone=" + telephone + ", user=" + user + ", orderItems="
+ orderItems + "]";
}*/

@Override
public String toString() {
return "Orders [oid=" + oid + ", ordertime=" + ordertime + ", total=" + total + ", state=" + state
+ ", address=" + address + ", name=" + name + ", telephone=" + telephone + "]";
}

}


MyBeanUtils:

package cn.itcast.utils;

import java.util.Date;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;

/*
======封装优化了BeanUtils类。
解决:BeanUtils封装  含有 Date 类型属性 的实体。封装不了Date类型。只可以封装String。
* */
public class MyBeanUtils {

//====只是getObject去掉了Map泛型。
public static void setObject(Object obj, Map map) {
try {
DateConverter dc = new DateConverter();
dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd"});// 设置要转换的字符串的格式
// 注册时间转换器,将某种格式的字符串转换成 Date 对象
//===BeanUtils底层本来就会 调用类型转换器。
//===(因为基本类型可以自动转换:String:"1"会自动转为数字)。===ConvertUtils
ConvertUtils.register(dc, Date.class);
BeanUtils.populate(obj, map);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void getObject(Object obj, Map<String, String[]> map) {
try {
DateConverter dc = new DateConverter();
dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd"});// 设置要转换的字符串的格式
// 注册时间转换器,将某种格式的字符串转换成 Date 对象
ConvertUtils.register(dc, Date.class);
BeanUtils.populate(obj, map);
} catch (Exception e) {
e.printStackTrace();
}
}

public static <T>T getObj(Class<T> clazz, Map<String, String[]> map){
T t = null;
try {
t = clazz.getConstructor().newInstance();
BeanUtils.populate(t, map);
} catch (Exception e) {
e.printStackTrace();
}

return t;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐