修改客户的功能
1、先通过客户的主键查询出客户的详细信息,显示到修改的页面上
要把客户的主键和上传文件的路径使用隐藏域保存起来
2、修改客户的信息
修改表单的enctype属性(enctype="multipart/form-data")
给edit.jsp页面添加文件上传项
如果用户新上传了文件,删除旧的文件,上传新的文件
如果用户没有上传新文件,正常更新
3、如果要客户和联系人配置了一对多
在修改客户的时候,由于Customer对象中linkman的set中没有值【不然循环调用会报异常】,所以在默认修改Customer的时候,会把set集合中的Linkman的外键设置为null
创建linkman的sql语句中,要求外键是不能为null的
解决 一方放弃外键的维护
<set name="linkman" inverse="true">
抽取通用的BaseDao功能
1、通过上面编写的功能,发现DAO层的代码比较固定,所以可以想办法抽取
2、代码
//压制 去黄线
@SuppressWarnings("all")
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
//定义成员的属性
private Class clazz;
public BaseDaoImpl(){
// System.out.println("执行了");
//this表示的子类 c表示的就是 CustomerDaoImpl的对象
Class c = this.getClass();
// CustomerDaoImpl extends BaseDaoImpl<Customer> map<K,V>
//第2步:获取到的是BaseDaoImpl<Customer>
Type type = c.getGenericSuperclass();
//目的:把type接口转换成子接口
if(type instanceof ParameterizedType){
ParameterizedType ptype = (ParameterizedType) type;
//获取到Customer
Type[] types = ptype.getActualTypeArguments();
this.clazz = (Class) types[0];
}
// this.clazz = clazz;
}
/**
* 添加
*/
public void save(T t) {
this.getHibernateTemplate().save(t);
}
/**
* 删除
*/
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
/**
* 修改
*/
public void update(T t) {
this.getHibernateTemplate().update(t);
}
/**
* 通过主键查询
*/
public T findById(Long id) {
return (T) this.getHibernateTemplate().get(clazz, id);
}
/**
* 查询所有的数据
*/
public List<T> findAll() {
return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
}
/**
* 分页查询
*/
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
//创建分页的对象
PageBean<T> page = new PageBean<T>();
//一个一个设置
page.setPageCode(pageCode);
page.setPageSize(pageSize);
//设置查询聚合函数,SQL已经变成了select count(*) from
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>) this.getHibernateTemplate().findByCriteria(criteria);
if(list != null && list.size()>0){
int totalCount = list.get(0).intValue();
//总记录数
page.setTotalCount(totalCount);
}
//清除sql select * from xxx
criteria.setProjection(null);
List<T> beanList = (List<T>) this.getHibernateTemplate().findByCriteria(criteria,(pageCode-1)*pageSize,pageSize);
//每页显示的数据
page.setBeanList(beanList);
return page;
}
}
抽取BaseAction的功能
1、Action需要完成分页的代码,需要接受pageCode和pageSize的请求参数,可以编写BaseAction用来接受分页的请求参数
//属性驱动的方式
//当前页,默认值就1
private Integer pageCode= 1;
public void setPageCode(Integer pageCode) {
if(pageCode== null){
pageCode = 1;
}
this.pageCode = pageCode;
}
//每页显示的数据的条数
private Integer pageSize = 2;
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageCode() {
return pageCode;
}
public Integer getPageSize() {
return pageSize;
}
/**
* 调用值栈对象的set方法
*/
public void setVs(String key,Object obj){
ActionContext.getContext().getValueStack().set(key, obj);
}
/**
* 调用值栈对象的push方法
* @param obj
*/
public void pushVs(Object obj){
ActionContext.getContext().getValueStack().push(obj);
}
}
/**
* Action的父类
* @author Administrator
*
*/
public class BaseAction extends ActionSupport{
private static final long serialVersionUID = 6121625148251505151L;
//属性驱动的方式
//当前页,默认值就1
private Integer pageCode= 1;
public void setPageCode(Integer pageCode) {
if(pageCode== null){
pageCode = 1;
}
this.pageCode = pageCode;
}
//每页显示的数据的条数
private Integer pageSize = 2;
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageCode() {
return pageCode;
}
public Integer getPageSize() {
return pageSize;
}
/**
* 调用值栈对象的set方法
*/
public void setVs(String key,Object obj){
ActionContext.getContext().getValueStack().set(key, obj);
}
/**
* 调用值栈对象的push方法
* @param obj
*/
public void pushVs(Object obj){
ActionContext.getContext().getValueStack().push(obj);
}
}
/**
* 所有的Dao层的实现类,都可以继承BaseDaoImpl,增删改查分页方法不用再编写了
* @author Administrator
*
* @param <T>
*/
//压制 去黄线
@SuppressWarnings("all")
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
//定义成员的属性
private Class clazz;
public BaseDaoImpl(){
// System.out.println("执行了");
//this表示的子类 c表示的就是 CustomerDaoImpl的对象
Class c = this.getClass();
// CustomerDaoImpl extends BaseDaoImpl<Customer> map<K,V>
//第2步:获取到的是BaseDaoImpl<Customer>
Type type = c.getGenericSuperclass();
//目的:把type接口转换成子接口
if(type instanceof ParameterizedType){
ParameterizedType ptype = (ParameterizedType) type;
//获取到Customer
Type[] types = ptype.getActualTypeArguments();
this.clazz = (Class) types[0];
}
// this.clazz = clazz;
}
/**
* 添加
*/
public void save(T t) {
this.getHibernateTemplate().save(t);
}
/**
* 删除
*/
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
/**
* 修改
*/
public void update(T t) {
this.getHibernateTemplate().update(t);
}
/**
* 通过主键查询
*/
public T findById(Long id) {
return (T) this.getHibernateTemplate().get(clazz, id);
}
/**
* 查询所有的数据
*/
public List<T> findAll() {
return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
}
/**
* 分页查询
*/
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
//创建分页的对象
PageBean<T> page = new PageBean<T>();
//一个一个设置
page.setPageCode(pageCode);
page.setPageSize(pageSize);
//设置查询聚合函数,SQL已经变成了select count(*) from
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>) this.getHibernateTemplate().findByCriteria(criteria);
if(list != null && list.size()>0){
int totalCount = list.get(0).intValue();
//总记录数
page.setTotalCount(totalCount);
}
//清除sql select * from xxx
criteria.setProjection(null);
List<T> beanList = (List<T>) this.getHibernateTemplate().findByCriteria(criteria,(pageCode-1)*pageSize,pageSize);
//每页显示的数据
page.setBeanList(beanList);
return page;
}
}
Customer.hbm.xml
<!-- 配置的多方 name是JavaBean属性名称 class="一方类的全路径" column="外键的名称"-->
<many-to-one name="source" class="my.domain.Dict" column="cust_source"></many-to-one>
<many-to-one name="industry" class="my.domain.Dict" column="cust_industry"></many-to-one>
<many-to-one name="level" class="my.domain.Dict" column="cust_level"></many-to-one>
<!-- 让客户放弃外键的维护的权力 -->
<set name="linkmans" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="my.domain.Linkman"/>
</set>
<!-- 使用静态引入 -->
<%@ include file="/jsp/page.jsp" %>