这次实验,我做的是基于SSH框架的物流管理系统
登陆界面
主界面
此系统主要分为五大模块:
仓库管理模块、库存管理模块(包括出库、入库)、历史记录模块、托运单管理模块、用户管理模块(注册、登陆)
具体实现:
dao层
例如:StoreDAO.java(仓库管理)
package com.guigu.store.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.guigu.store.domain.Store;
/**
* 仓库DAO
* @author Administrator
*/
public class StoreDAO extends HibernateDaoSupport {
/**
* 添加仓库
* @param store
*/
public void save(Store store) { //保存实例
this.getHibernateTemplate().save(store);
}
/**
* 查询所有
* @return
*/
public List<Store> findAll() {
return this.getHibernateTemplate().find("from Store");//find 返回所有User对象
}
/**
* 删除仓库
* @param store
*/
public void delete(Store store) { //删除指定持久化实例
// 直接删除store,删除脱管对象
this.getHibernateTemplate().delete(store);
}
/**
* 根据id查询
* @param id
* @return
*/
public Store findById(String id) {
return this.getHibernateTemplate().get(Store.class, id); //id是按照主键查询
}
/**
* 修改
* @param store
*/
public void update(Store store) {
this.getHibernateTemplate().update(store);
}
}
其中
extends HibernateDaoSupport 的用法:
spring为hibernate的DAO提供工具类:HibernateDaoSupport。该类主要提供如下两个方法,方便DAO的实现: public final HibernateTemplate getHibernateTemplate()
public final void setSessionFactory(SessionFactory sessionFactory)
其中,setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例,getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后生成HibernateTemplate来完成数据库访问。
其他dao层写法相同。
在实体类映射的文件中,配置了许多关联映射:
以Store.hbm.xml和Goods.hbm.xml两个配置文件为例:
<hibernate-mapping>
<class name="com.guigu.store.domain.Store" table="store" catalog="sshexec">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="uuid" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="32" />
</property>
<property name="addr" type="java.lang.String">
<column name="addr" length="100" />
</property>
<property name="manager" type="java.lang.String">
<column name="manager" length="32" />
</property>
<property name="storetel" type="java.lang.String">
<column name="storetel" length="20" />
</property>
<set name="goodses" inverse="true">
<key>
<column name="storeid" length="32" />
</key>
<one-to-many class="com.guigu.store.domain.Goods" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.guigu.store.domain.Goods" table="goods" catalog="sshexec">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="uuid" />
</id>
<many-to-one name="store" class="com.guigu.store.domain.Store" fetch="select">
<column name="storeid" length="32" />
</many-to-one>
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
<property name="nm" type="java.lang.String">
<column name="nm" length="10" />
</property>
<property name="unit" type="java.lang.String">
<column name="unit" length="10" />
</property>
<property name="amount" type="java.lang.Double">
<column name="amount" precision="10" />
</property>
<property name="checkId" type="java.lang.String">
<column name="check_id" length="32" />
</property>
<set name="histories" inverse="true">
<key>
<column name="goodsid" length="32" />
</key>
<one-to-many class="com.guigu.store.domain.History" />
</set>
</class>
</hibernate-mapping>
其中,包括了双向的多对一关联映射(一个仓库对应多个货物)和单向的一对多(一个产品对应多条历史记录,包括增、删、改、查等操作)。
service层(以Store.service为例):
将dao层以对象的形式注入到service层,处理逻辑
package com.guigu.store.service;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
import com.guigu.store.dao.StoreDAO;
import com.guigu.store.domain.Store;
/**
* Store业务层
* @author Administrator
*/
@Transactional
public class StoreService {
// 注入DAO
private StoreDAO storeDAO;
public void setStoreDAO(StoreDAO storeDAO) {
this.storeDAO = storeDAO;
}
/**
* 添加仓库
* @param store
*/
public void addStore(Store store) {
storeDAO.save(store);
}
/**
* 查询所有仓库
* @return
*/
public List<Store> listStores() {
return storeDAO.findAll();
}
/**
* 删除仓库
* @param store
*/
public String deleteStore(Store store) {
store = storeDAO.findById(store.getId()); // 持久对象
if (store.getGoodses()==null) {
// 无货物
storeDAO.delete(store);
return "true";
} else {
// 有货物
return "false";
}
}
/**
* 根据id 查询store
* @param id
* @return
*/
public Store findStore(String id) {
return storeDAO.findById(id);
}
/**
* 修改仓库信息
* @param store
*/
public void editStore(Store store) {
storeDAO.update(store);
}
}
action层(以Store.action为例):
将service层注入到action里,操作web层,方法返回参数以便于页面跳转
package com.guigu.store.web.action;
import java.util.List;
import com.guigu.store.domain.Store;
import com.guigu.store.service.StoreService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 仓库操作web层
*/
public class StoreAction extends ActionSupport implements ModelDriven<Store> {
// 模型驱动
private Store store = new Store();
public Store getModel() {
return store;
}
// 注入Service
private StoreService storeService;
public void setStoreService(StoreService storeService) {
this.storeService = storeService;
}
/**
* 添加仓库
* @return
*/
public String add() {
storeService.addStore(store);
return "addSUCCESS";
}
/**
* 查询所有仓库
* @return
*/
public String list() {
// 将查询结果 保存到Action成员变量,放入值栈
stores = storeService.listStores();
return "listSUCCESS";
}
private List<Store> stores;
public List<Store> getStores() {
return stores;
}
/**
* 删除仓库
* @return
*/
public String delete() {
String a=storeService.deleteStore(store);
if(a.equals("true")){
return "deleteSUCCESS";
}else{
this.addActionError(this.getText("仓库中有货物,无法删除"));
return "deleteFAIL";
}
}
/**
* 修改前,查询显示
* @return
*/
public String editview() {
// 根据id 查询store
store = storeService.findStore(store.getId());
return "editviewSUCCESS";
}
/**
* 修改操作
* @return
*/
public String edit() {
storeService.editStore(store);
return "editSUCCESS";
}
public String ajaxlist(){
stores=storeService.listStores();
return "ajaxlistSUCCESS";
}
}
以仓库管理模块为例演示项目:
查看仓库:
增加仓库:
成功增加了一个新仓库:
修改仓库:
成功的修改仓库的信息: