阅读SSM项目之scm
導(dǎo)入項(xiàng)目
項(xiàng)目是由eclipse來編寫的,我使用的開發(fā)環(huán)境是Idea,那么就需要將eclipse項(xiàng)目導(dǎo)入進(jìn)去Idea中。要想項(xiàng)目能夠啟動起來。是這樣干的:
導(dǎo)入eclipse的項(xiàng)目
添加對應(yīng)的Web Model,添加完畢之后,默認(rèn)會提示要我們創(chuàng)建對應(yīng)的Facts的。
接著修改Facets中標(biāo)出的值,因?yàn)槲覀兪謩觿?chuàng)建的話,指向的是Idea中的web目錄的。可是項(xiàng)目是用eclipse編寫的,因此要改成是WebRoot對應(yīng)的文件!
接著配置Tomcat,就基本可以讓eclipse中的項(xiàng)目在Idea環(huán)境下運(yùn)行了。
主菜單跳轉(zhuǎn)JSP頁面
在主菜單頁面上有很多的URL跳轉(zhuǎn)到不同的JSP頁面。
這些超鏈接是不同的模塊下的。但是我們可以使用BaseAction對他們進(jìn)行統(tǒng)一管理起來!
? ? ? ?//方法參數(shù)folder通過@PathVariable指定其值可以從@RequestMapping的{folder}獲取,同理file也一樣 ? ? ? ?@RequestMapping("/goURL/{folder}/{file}") ? ? ? ?public String goURL(@PathVariable String folder,@PathVariable String file) { ? ? ? ? ? ?return "forward:/WEB-INF/"+folder+"/"+file+".jsp"; ? ? ? ?}? ? ? ?("/goURL/{folder}/{file}")
? ? ? ?public String goURL(@PathVariable String folder,@PathVariable String file) {
? ? ? ? ? ?return "forward:/WEB-INF/"+folder+"/"+file+".jsp";
? ? ? ?}
我們常常在跳轉(zhuǎn)頁面之前都要查詢數(shù)據(jù)庫的數(shù)據(jù)的,那如果是這樣設(shè)計(jì)的話,我們可以將常用數(shù)據(jù)放在application域?qū)ο笾?#xff0c;或者使用ajax來進(jìn)行獲取數(shù)據(jù)!
分頁對象設(shè)計(jì)
之前我們做的分頁對象就僅僅把我們分頁所用到的基本屬性封裝起來。如果頁面上有查詢條件的話,我們另外創(chuàng)建了一個(gè)查詢對象。
當(dāng)時(shí)候創(chuàng)建出來的查詢對象的屬性是根據(jù)頁面上的條件來編寫的。這樣做得不夠好,沒有通用性!
這次看見這個(gè)項(xiàng)目的Page設(shè)計(jì)就非常通用了,雖然把查詢條件都放在了Page對象中,但我感覺比之前那個(gè)好!
public class Page<T> implements Serializable { ? ?private static final long serialVersionUID = 337297181251071639L; ? ?private Integer page;//當(dāng)前頁 ? ?private Integer rows;//頁大小 ? ?private Integer totalRecord;// 總記錄 數(shù) ? ?private List<T> list;//頁面數(shù)據(jù)列表 ? ?private String keyWord;//查詢關(guān)鍵字 ? ?private T paramEntity;//多條件查詢 ? ?private Integer start;//需要這里處理 ? ?//因?yàn)樗玫氖莈asyUI,所以沒有設(shè)置總頁數(shù)的屬性,使用Map集合來替代了。 ? ?private Map<String, Object> pageMap = new HashMap<String, Object>() ; ? ?public Map<String, Object> getPageMap() { ? ? ? ?return pageMap; ? ?} ? ?/*public void setPageMap(Map<String, Object> pageMap) { ? ? ? ?this.pageMap = pageMap; ? ?}*/ ? ?public T getParamEntity() { ? ? ? ?return paramEntity; ? ?} ? ?public void setParamEntity(T paramEntity) { ? ? ? ?this.paramEntity = paramEntity; ? ?} ? ?public Integer getPage() { ? ? ? ?return page; ? ?} ? ?public void setPage(Integer page) { ? ? ? ?this.page = page; ? ?} ? ?public Integer getRows() { ? ? ? ?return rows; ? ?} ? ?public void setRows(Integer rows) { ? ? ? ?this.rows = rows; ? ?} ? ?/*public Integer getTotalRecord() { ? ? ? ?return totalRecord; ? ?}*/ ? ?public void setTotalRecord(Integer totalRecord) { ? ? ? ?pageMap.put("total", totalRecord); ? ? ? ?this.totalRecord = totalRecord; ? ?}/* ? ?public List<T> getList() { ? ? ? ?return list; ? ?}*/ ? ?public void setList(List<T> list) { ? ? ? ?pageMap.put("rows", list); ? ? ? ?this.list = list; ? ?} ? ?public String getKeyWord() { ? ? ? ?return keyWord; ? ?} ? ?public void setKeyWord(String keyWord) { ? ? ? ?this.keyWord = keyWord; ? ?} ? ?public Integer getStart() { ? ? ? ?this.start = (page-1)*rows; ? ? ? ?return start; ? ?} ? ?public void setStart(Integer start) { ? ? ? ?this.start = start; ? ?} ? ?@Override ? ?public String toString() { ? ? ? ?return "Page [page=" + page + ", rows=" + rows + ", totalRecord=" ? ? ? ? ? ? ? ?+ totalRecord + ", list=" + list + ", keyWord=" + keyWord ? ? ? ? ? ? ? ?+ ", paramEntity=" + paramEntity + ", start=" + start + "]"; ? ?}}class Page<T> implements Serializable {? ?private static final long serialVersionUID = 337297181251071639L;
? ?private Integer page;//當(dāng)前頁
? ?private Integer rows;//頁大小
? ?private Integer totalRecord;// 總記錄 數(shù)
? ?private List<T> list;//頁面數(shù)據(jù)列表
? ?private String keyWord;//查詢關(guān)鍵字
? ?private T paramEntity;//多條件查詢
? ?private Integer start;//需要這里處理
? ?//因?yàn)樗玫氖莈asyUI,所以沒有設(shè)置總頁數(shù)的屬性,使用Map集合來替代了。
? ?private Map<String, Object> pageMap = new HashMap<String, Object>() ;
? ?public Map<String, Object> getPageMap() {
? ? ? ?return pageMap;
? ?}
? ?/*public void setPageMap(Map<String, Object> pageMap) {
? ? ? ?this.pageMap = pageMap;
? ?}*/
? ?public T getParamEntity() {
? ? ? ?return paramEntity;
? ?}
? ?public void setParamEntity(T paramEntity) {
? ? ? ?this.paramEntity = paramEntity;
? ?}
? ?public Integer getPage() {
? ? ? ?return page;
? ?}
? ?public void setPage(Integer page) {
? ? ? ?this.page = page;
? ?}
? ?public Integer getRows() {
? ? ? ?return rows;
? ?}
? ?public void setRows(Integer rows) {
? ? ? ?this.rows = rows;
? ?}
? ?/*public Integer getTotalRecord() {
? ? ? ?return totalRecord;
? ?}*/
? ?public void setTotalRecord(Integer totalRecord) {
? ? ? ?pageMap.put("total", totalRecord);
? ? ? ?this.totalRecord = totalRecord;
? ?}
/* ? ?public List<T> getList() {
? ? ? ?return list;
? ?}*/
? ?public void setList(List<T> list) {
? ? ? ?pageMap.put("rows", list);
? ? ? ?this.list = list;
? ?}
? ?public String getKeyWord() {
? ? ? ?return keyWord;
? ?}
? ?public void setKeyWord(String keyWord) {
? ? ? ?this.keyWord = keyWord;
? ?}
? ?public Integer getStart() {
? ? ? ?this.start = (page-1)*rows;
? ? ? ?return start;
? ?}
? ?public void setStart(Integer start) {
? ? ? ?this.start = start;
? ?}
? ?
? ?public String toString() {
? ? ? ?return "Page [page=" + page + ", rows=" + rows + ", totalRecord="
? ? ? ? ? ? ? ?+ totalRecord + ", list=" + list + ", keyWord=" + keyWord
? ? ? ? ? ? ? ?+ ", paramEntity=" + paramEntity + ", start=" + start + "]";
? ?}
}
抽取Service層
之前我們也抽取過Service層的代碼,當(dāng)時(shí)候也覺得用得十分巧妙:
然而,這次看到的baseService就用得更加巧妙了,并且設(shè)計(jì)得更加好!
如下代碼:
package cn.itcast.scm.service.impl;import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;import cn.itcast.scm.dao.AccountMapper;import cn.itcast.scm.dao.AccountRecordsMapper;import cn.itcast.scm.dao.BaseMapper;import cn.itcast.scm.dao.BuyOrderDetailMapper;import cn.itcast.scm.dao.BuyOrderMapper;import cn.itcast.scm.dao.GoodsMapper;import cn.itcast.scm.dao.SupplierMapper;import cn.itcast.scm.dao.SysParamMapper;import cn.itcast.scm.entity.Page;import cn.itcast.scm.service.BaseService;public class BaseServiceImpl<T> implements BaseService<T> { ? ?protected ?BaseMapper<T> baseMapper; ? ?@Autowired ? ?protected ?SupplierMapper supplierMapper; ? ?@Autowired ? ?protected ?AccountMapper accountMapper; ? ?@Autowired ? ?protected ?GoodsMapper goodsMapper; ? ?@Autowired ? ?protected ?BuyOrderMapper buyOrderMapper; ? ?@Autowired ? ?protected ?BuyOrderDetailMapper buyOrderDetailMapper; ? ?@Autowired ? ?protected ?AccountRecordsMapper accountRecordsMapper; ? ?@Autowired ? ?protected ?SysParamMapper sysParamMapper; ? ?@PostConstruct//在構(gòu)造方法后,初化前執(zhí)行 ? ?private void initBaseMapper() throws Exception{ ? ? ? ?//完成以下邏輯,需要對研發(fā)本身進(jìn)行命名與使用規(guī)范 ? ? ? ?//this關(guān)鍵字指對象本身,這里指的是調(diào)用此方法的實(shí)現(xiàn)類(子類) ? ? ? ?System.out.println("=======this :"+this); ? ? ? ?System.out.println("=======父類基本信息:"+this.getClass().getSuperclass()); ? ? ? ?System.out.println("=======父類和泛型的信息:"+this.getClass().getGenericSuperclass()); ? ? ? ?ParameterizedType type =(ParameterizedType) this.getClass().getGenericSuperclass(); ? ? ? ?//獲取第一個(gè)參數(shù)的class ? ? ? ?Class clazz = (Class)type.getActualTypeArguments()[0]; ? ? ? ?System.out.println("=======class:"+clazz); ? ? ? ?//轉(zhuǎn)化為屬性名(相關(guān)的Mapper子類的引用名)Supplier ?supplierMapper ? ? ? ?String localField = clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"Mapper"; ? ? ? ?System.out.println("=======localField:"+localField); ? ? ? ?//getDeclaredField:可以使用于包括私有、默認(rèn)、受保護(hù)、公共字段,但不包括繼承的字段 ? ? ? ?Field field=this.getClass().getSuperclass().getDeclaredField(localField); ? ? ? ?System.out.println("=======field:"+field); ? ? ? ?System.out.println("=======field對應(yīng)的對象:"+field.get(this)); ? ? ? ?Field baseField = this.getClass().getSuperclass().getDeclaredField("baseMapper"); ? ? ? ?System.out.println("=======baseField:"+baseField); ? ? ? ?System.out.println("=======baseField對應(yīng)的對象:"+baseField.get(this)); ? ? ? ?//field.get(this)獲取當(dāng)前this的field字段的值。例如:Supplier對象中,baseMapper所指向的對象為其子類型SupplierMapper對象,子類型對象已被spring實(shí)例化于容器中 ? ? ? ?baseField.set(this, field.get(this)); ? ? ? ?System.out.println("========baseField對應(yīng)的對象:"+baseMapper); ? ?} ? }import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import cn.itcast.scm.dao.AccountMapper;
import cn.itcast.scm.dao.AccountRecordsMapper;
import cn.itcast.scm.dao.BaseMapper;
import cn.itcast.scm.dao.BuyOrderDetailMapper;
import cn.itcast.scm.dao.BuyOrderMapper;
import cn.itcast.scm.dao.GoodsMapper;
import cn.itcast.scm.dao.SupplierMapper;
import cn.itcast.scm.dao.SysParamMapper;
import cn.itcast.scm.entity.Page;
import cn.itcast.scm.service.BaseService;
public class BaseServiceImpl<T> implements BaseService<T> {
? ?protected ?BaseMapper<T> baseMapper;
? ?
? ?protected ?SupplierMapper supplierMapper;
? ?
? ?protected ?AccountMapper accountMapper;
? ?
? ?protected ?GoodsMapper goodsMapper;
? ?
? ?protected ?BuyOrderMapper buyOrderMapper;
? ?
? ?protected ?BuyOrderDetailMapper buyOrderDetailMapper;
? ?
? ?protected ?AccountRecordsMapper accountRecordsMapper;
? ?
? ?protected ?SysParamMapper sysParamMapper;
? ?//在構(gòu)造方法后,初化前執(zhí)行
? ?private void initBaseMapper() throws Exception{
? ? ? ?//完成以下邏輯,需要對研發(fā)本身進(jìn)行命名與使用規(guī)范
? ? ? ?//this關(guān)鍵字指對象本身,這里指的是調(diào)用此方法的實(shí)現(xiàn)類(子類)
? ? ? ?System.out.println("=======this :"+this);
? ? ? ?System.out.println("=======父類基本信息:"+this.getClass().getSuperclass());
? ? ? ?System.out.println("=======父類和泛型的信息:"+this.getClass().getGenericSuperclass());
? ? ? ?ParameterizedType type =(ParameterizedType) this.getClass().getGenericSuperclass();
? ? ? ?//獲取第一個(gè)參數(shù)的class
? ? ? ?Class clazz = (Class)type.getActualTypeArguments()[0];
? ? ? ?System.out.println("=======class:"+clazz);
? ? ? ?//轉(zhuǎn)化為屬性名(相關(guān)的Mapper子類的引用名)Supplier ?supplierMapper
? ? ? ?String localField = clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"Mapper";
? ? ? ?System.out.println("=======localField:"+localField);
? ? ? ?//getDeclaredField:可以使用于包括私有、默認(rèn)、受保護(hù)、公共字段,但不包括繼承的字段
? ? ? ?Field field=this.getClass().getSuperclass().getDeclaredField(localField);
? ? ? ?System.out.println("=======field:"+field);
? ? ? ?System.out.println("=======field對應(yīng)的對象:"+field.get(this));
? ? ? ?Field baseField = this.getClass().getSuperclass().getDeclaredField("baseMapper");
? ? ? ?System.out.println("=======baseField:"+baseField);
? ? ? ?System.out.println("=======baseField對應(yīng)的對象:"+baseField.get(this));
? ? ? ?//field.get(this)獲取當(dāng)前this的field字段的值。例如:Supplier對象中,baseMapper所指向的對象為其子類型SupplierMapper對象,子類型對象已被spring實(shí)例化于容器中
? ? ? ?baseField.set(this, field.get(this));
? ? ? ?System.out.println("========baseField對應(yīng)的對象:"+baseMapper);
? ?} ?
}
這個(gè)baseService并沒有給出對應(yīng)的setDao的方法,那它是怎么將BaseDao實(shí)例化的呢???關(guān)鍵就在于initBaseMapper()這個(gè)方法!
我們來看一下方法內(nèi)部打印數(shù)據(jù)的內(nèi)容吧:
=======this :cn.itcast.scm.service.impl.BuyOrderServiceImpl@13a739e=======父類基本信息:class cn.itcast.scm.service.impl.BaseServiceImpl=======父類和泛型的信息:cn.itcast.scm.service.impl.BaseServiceImpl<cn.itcast.scm.entity.BuyOrder>=======class:class cn.itcast.scm.entity.BuyOrder=======localField:buyOrderMapper=======field:protected cn.itcast.scm.dao.BuyOrderMapper cn.itcast.scm.service.impl.BaseServiceImpl.buyOrderMapper=======field對應(yīng)的對象:org.apache.ibatis.binding.MapperProxy@7cc946=======baseField:protected cn.itcast.scm.dao.BaseMapper cn.itcast.scm.service.impl.BaseServiceImpl.baseMapper=======baseField對應(yīng)的對象:null========baseField對應(yīng)的對象:org.apache.ibatis.binding.MapperProxy@7cc946BuyOrderServiceImpl@13a739e=======父類基本信息:class cn.itcast.scm.service.impl.BaseServiceImpl
=======父類和泛型的信息:cn.itcast.scm.service.impl.BaseServiceImpl<cn.itcast.scm.entity.BuyOrder>
=======class:class cn.itcast.scm.entity.BuyOrder
=======localField:buyOrderMapper
=======field:protected cn.itcast.scm.dao.BuyOrderMapper cn.itcast.scm.service.impl.BaseServiceImpl.buyOrderMapper
=======field對應(yīng)的對象:org.apache.ibatis.binding.MapperProxy@7cc946
=======baseField:protected cn.itcast.scm.dao.BaseMapper cn.itcast.scm.service.impl.BaseServiceImpl.baseMapper
=======baseField對應(yīng)的對象:null
========baseField對應(yīng)的對象:org.apache.ibatis.binding.MapperProxy@7cc946
這個(gè)方法被@PostConstruct注解給修飾著
通過我一陣的梳理,BaseDao的實(shí)例化過程是這樣的:
其實(shí)上面也是通過具體的serviceImpl來對baseDao來進(jìn)行初始化,不過它這樣子做的話就顯得更加優(yōu)雅了。并不需要在每個(gè)具體的serviceImpl使用setDao()的方式來進(jìn)行實(shí)例化。
通過上面的解釋、我們把注釋寫上,就很容易理解了。
? ?/** ? ? * 每當(dāng)service實(shí)例化的時(shí)候,這個(gè)方法都會被調(diào)用 ? ? * @throws Exception ? ? */ ? ?@PostConstruct ? ?private void initBaseMapper() throws Exception{ ? ? ? ?//獲取泛型的信息 ? ? ? ?ParameterizedType type =(ParameterizedType) this.getClass().getGenericSuperclass(); ? ? ? ?Class clazz = (Class)type.getActualTypeArguments()[0]; ? ? ? ?//拼接成“泛型”Mapper字符串 ? ? ? ?String localField = clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"Mapper"; ? ? ? ?//通過反射來獲取成員變量的值 ? ? ? ?Field field=this.getClass().getSuperclass().getDeclaredField(localField); ? ? ? ?Field baseField = this.getClass().getSuperclass().getDeclaredField("baseMapper"); ? ? ? ?//將baseDao來進(jìn)行實(shí)例化 ? ? ? ?baseField.set(this, field.get(this)); ? ?}? ?
? ?private void initBaseMapper() throws Exception{
? ? ? ?//獲取泛型的信息
? ? ? ?ParameterizedType type =(ParameterizedType) this.getClass().getGenericSuperclass();
? ? ? ?Class clazz = (Class)type.getActualTypeArguments()[0];
? ? ? ?//拼接成“泛型”Mapper字符串
? ? ? ?String localField = clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"Mapper";
? ? ? ?//通過反射來獲取成員變量的值
? ? ? ?Field field=this.getClass().getSuperclass().getDeclaredField(localField);
? ? ? ?Field baseField = this.getClass().getSuperclass().getDeclaredField("baseMapper");
? ? ? ?//將baseDao來進(jìn)行實(shí)例化
? ? ? ?baseField.set(this, field.get(this));
? ?}
分析項(xiàng)目的業(yè)務(wù)
本項(xiàng)目主要用EASY-UI來作為前段的頁面構(gòu)建。這里就不一一去探究EASY-UI的用法的,當(dāng)用到這個(gè)前段UI的時(shí)候再回頭看吧。下面就直接分析它的具體邏輯體悟了。
用戶登陸
首先,程序的入口是用戶登錄的界面。用戶設(shè)計(jì)得比較簡單,因?yàn)橹挥脕碜龅卿洝?/strong>
CREATE TABLE account( ? ?acc_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, ? ?acc_login VARCHAR(20), ? ?acc_name VARCHAR(20), ? ?acc_pass VARCHAR(20));TABLE account(
? ?acc_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
? ?acc_login VARCHAR(20),
? ?acc_name VARCHAR(20),
? ?acc_pass VARCHAR(20)
);
對于用戶登陸而言,我們已經(jīng)是非常熟悉這個(gè)業(yè)務(wù)了。只是在數(shù)據(jù)庫中對比一下數(shù)據(jù)、如果存在這個(gè)數(shù)據(jù),那么在session域中保存即可!
基本數(shù)據(jù)的數(shù)據(jù)庫表
CREATE TABLE supplier( ? ?sup_id INT(11) PRIMARY KEY NOT NULL, ? ?sup_name VARCHAR(20), ? ?sup_linkman VARCHAR(20), ? ?sup_phone VARCHAR(11), ? ?sup_address VARCHAR(100), ? ?sup_remark VARCHAR(100), ? ?sup_pay DECIMAL(12,2), ? ?sup_type VARCHAR(10));TABLE supplier(
? ?sup_id INT(11) PRIMARY KEY NOT NULL,
? ?sup_name VARCHAR(20),
? ?sup_linkman VARCHAR(20),
? ?sup_phone VARCHAR(11),
? ?sup_address VARCHAR(100),
? ?sup_remark VARCHAR(100),
? ?sup_pay DECIMAL(12,2),
? ?sup_type VARCHAR(10)
);
CREATE TABLE goods( ? ?goods_Id VARCHAR(36) PRIMARY KEY NOT NULL, ? ?goods_name VARCHAR(20), ? ?goods_unit VARCHAR(10), ? ?goods_type VARCHAR(10), ? ?goods_color VARCHAR(10), ? ?goods_store INT(11), ? ?goods_limit INT(11), ? ?goods_commission DECIMAL(2,2), ? ?goods_producer VARCHAR(50), ? ?goods_remark VARCHAR(100), ? ?goods_sel_price DECIMAL(12,2), ? ?goods_buy_price DECIMAL(12,2));TABLE goods
(
? ?goods_Id VARCHAR(36) PRIMARY KEY NOT NULL,
? ?goods_name VARCHAR(20),
? ?goods_unit VARCHAR(10),
? ?goods_type VARCHAR(10),
? ?goods_color VARCHAR(10),
? ?goods_store INT(11),
? ?goods_limit INT(11),
? ?goods_commission DECIMAL(2,2),
? ?goods_producer VARCHAR(50),
? ?goods_remark VARCHAR(100),
? ?goods_sel_price DECIMAL(12,2),
? ?goods_buy_price DECIMAL(12,2)
);
CREATE TABLE store_house( ? ?sh_id VARCHAR(10) PRIMARY KEY NOT NULL, ? ?sh_name VARCHAR(20), ? ?sh_responsible VARCHAR(20), ? ?sh_phone VARCHAR(11), ? ?sh_address VARCHAR(50), ? ?sh_type VARCHAR(10), ? ?sh_remark VARCHAR(100));TABLE store_house
(
? ?sh_id VARCHAR(10) PRIMARY KEY NOT NULL,
? ?sh_name VARCHAR(20),
? ?sh_responsible VARCHAR(20),
? ?sh_phone VARCHAR(11),
? ?sh_address VARCHAR(50),
? ?sh_type VARCHAR(10),
? ?sh_remark VARCHAR(100)
);
上邊這幾張表都僅僅是CRUD的操作。
那么這個(gè)項(xiàng)目是這樣處理的,將經(jīng)常用到的數(shù)據(jù)用一張表保存起來。
drop table if exists sys_param;/*====================================系統(tǒng)參數(shù)表==============================*//*==============================================================*//* Table: sys_param ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *//*==============================================================*//*create table sys_param( ? sys_param_id ? ? ? ? bigint ?auto_increment, ? sys_param_field ? ? ?varchar(50), ? sys_param_value ? ? ?varchar(50), ? sys_param_text ? ? ? varchar(50), ? primary key (sys_param_id));*/create table sys_param( ? sys_param_id ? ? ? ? bigint ?auto_increment, ? sys_param_field ? ? ?varchar(50), ? sys_param_value ? ? ?varchar(500), ? sys_param_text ? ? ? varchar(50), ? sys_param_type ? ? ? varchar(2), ? ? primary key (sys_param_id));insert into sys_param(sys_param_field,sys_param_value,sys_param_type) values('shId','select s.sh_id as sys_param_value,s.sh_name as sys_param_text from store_house s','1');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','1','一級供應(yīng)商');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','2','二級供應(yīng)商');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','3','普通供應(yīng)商');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('goodsColor','1','紅色');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('goodsColor','2','綠色');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('goodsColor','3','藍(lán)色');select * from sys_param;table if exists sys_param;/*====================================系統(tǒng)參數(shù)表==============================*/
/*==============================================================*/
/* Table: sys_param ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */
/*==============================================================*/
/*
create table sys_param
(
? sys_param_id ? ? ? ? bigint ?auto_increment,
? sys_param_field ? ? ?varchar(50),
? sys_param_value ? ? ?varchar(50),
? sys_param_text ? ? ? varchar(50),
? primary key (sys_param_id)
);
*/
create table sys_param
(
? sys_param_id ? ? ? ? bigint ?auto_increment,
? sys_param_field ? ? ?varchar(50),
? sys_param_value ? ? ?varchar(500),
? sys_param_text ? ? ? varchar(50),
? sys_param_type ? ? ? varchar(2), ?
? primary key (sys_param_id)
);
insert into sys_param(sys_param_field,sys_param_value,sys_param_type) values('shId','select s.sh_id as sys_param_value,s.sh_name as sys_param_text from store_house s','1');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','1','一級供應(yīng)商');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','2','二級供應(yīng)商');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','3','普通供應(yīng)商');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('goodsColor','1','紅色');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('goodsColor','2','綠色');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('goodsColor','3','藍(lán)色');
select * from sys_param;
上面我們可以看到,除了單單保存了一些的基本屬性之外,我們來存儲了SQL語句,那么我們怎么將SQL語句轉(zhuǎn)成是我們的數(shù)據(jù)呢???
那它是怎么實(shí)現(xiàn)這種玩意的呢??
Mapper查詢表的數(shù)據(jù)
?<select id="selectList" parameterType="String" resultMap="sysParamResultMap"> ? ? ? ? ? ?select * from sys_param ?</select> ?<!-- 查詢其它表的數(shù)據(jù),使用${value}格式,允許使用sql語句作為參數(shù)執(zhí)行 --> ?<select id="selectOthreTable" parameterType="string" resultMap="sysParamResultMap"> ? ? ?${value} ?</select>? ? ?select * from sys_param
?</select>
?<!-- 查詢其它表的數(shù)據(jù),使用${value}格式,允許使用sql語句作為參數(shù)執(zhí)行 -->
?<select id="selectOthreTable" parameterType="string" resultMap="sysParamResultMap">
? ? ?${value}
?</select>
Service將數(shù)據(jù)封裝到一個(gè)總的Map中。具體的做法是這樣子的:
package cn.itcast.scm.service.impl;import cn.itcast.scm.entity.SysParam;import cn.itcast.scm.service.SysParamService;import org.springframework.stereotype.Service;import java.util.HashMap;import java.util.List;import java.util.Map;@Service("sysParamService")public class SysParamServiceImpl extends BaseServiceImpl<SysParam> implements SysParamService { ? ?@Override ? ?public Map<String, Object> selectList() { ? ? ? ?//查詢出表中所有所有數(shù)據(jù) ? ? ? ?List<SysParam> sysParams = sysParamMapper.selectList(""); ? ? ? ?//存儲屬性字段具體的值 ? ? ? ?Map<String, Object> fieldMap = null; ? ? ? ?//最終的Map,key是屬性字段,value是一個(gè)map(屬性字段具體的值) ? ? ? ?Map<String, Object> sysParamMap = new HashMap<String, Object>(); ? ? ? ?//遍歷表中的記錄,看是否有類型為1的字段數(shù)據(jù)!也就是SQL數(shù)據(jù) ? ? ? ?for (SysParam sysParam : sysParams) { ? ? ? ? ? ?if ("1".equals(sysParam.getSysParamType())) { ? ? ? ? ? ? ? ?String sql = sysParam.getSysParamValue(); ? ? ? ? ? ? ? ?//執(zhí)行SQL,得到查詢后的記錄 ? ? ? ? ? ? ? ?List<SysParam> otherList = sysParamMapper.selectOthreTable(sql); ? ? ? ? ? ? ? ?fieldMap = new HashMap<>(); ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? * select s.sh_id as sys_param_value,s.sh_name as sys_param_text ?from store_house s ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ?//遍歷查詢后的記錄,并把數(shù)據(jù)存到字段MAP ? ? ? ? ? ? ? ?for (SysParam otherSysParam : otherList) { ? ? ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? ? ? * key = 倉庫的具體Id ? ? ? ? ? ? ? ? ? ? * value = 頁面顯示的倉庫名稱 ? ? ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ? ? ?fieldMap.put(otherSysParam.getSysParamValue(), otherSysParam.getSysParamText()); ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? * key = shId ? ? ? ? ? ? ? ? * value = 存儲具體數(shù)據(jù)的Map集合 ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ?sysParamMap.put(sysParam.getSysParamField(), fieldMap); ? ? ? ? ? ?} else { ? ? ? ? ? ? ? ?//判斷系統(tǒng)參數(shù)的map中是否存在字段的map,如果不存在,就新建一個(gè) ? ? ? ? ? ? ? ?if (sysParamMap.get(sysParam.getSysParamField()) == null) { ? ? ? ? ? ? ? ? ? ?fieldMap = new HashMap<>(); ? ? ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? ? ? * key ?= 1 ? ? ? ? ? ? ? ? ? ? * value = 一級供應(yīng)商 ? ? ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ? ? ?fieldMap.put(sysParam.getSysParamValue(), sysParam.getSysParamText()); ? ? ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? ? ? * key = supType ? ? ? ? ? ? ? ? ? ? * value = 存儲具體數(shù)據(jù)的Map集合 ? ? ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ? ? ?sysParamMap.put(sysParam.getSysParamField(), fieldMap); ? ? ? ? ? ? ? ?} else { ? ? ? ? ? ? ? ? ? ?//如果存在,那么就在原先的Map集合中添加 ? ? ? ? ? ? ? ? ? ?fieldMap = (Map<String, Object>) sysParamMap.get(sysParam.getSysParamField()); ? ? ? ? ? ? ? ? ? ?fieldMap.put(sysParam.getSysParamValue(), sysParam.getSysParamText()); ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?/** ? ? ? ? * key = shId ? ? ? ?value = Map-->(1 ?主倉庫) ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2 ?分倉庫) ? ? ? ? * ? ? ? ? * key = supType ? ?value= Map-->( 1 ? 一級供應(yīng)商) ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?( 2 ?二級供應(yīng)商)... ? ? ? ? * key = goodsColor ?value = Map--> (1 ?紅色).... ? ? ? ? */ ? ? ? ?return sysParamMap; ? ?}}import cn.itcast.scm.entity.SysParam;
import cn.itcast.scm.service.SysParamService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
("sysParamService")
public class SysParamServiceImpl extends BaseServiceImpl<SysParam> implements SysParamService {
? ?
? ?public Map<String, Object> selectList() {
? ? ? ?//查詢出表中所有所有數(shù)據(jù)
? ? ? ?List<SysParam> sysParams = sysParamMapper.selectList("");
? ? ? ?//存儲屬性字段具體的值
? ? ? ?Map<String, Object> fieldMap = null;
? ? ? ?//最終的Map,key是屬性字段,value是一個(gè)map(屬性字段具體的值)
? ? ? ?Map<String, Object> sysParamMap = new HashMap<String, Object>();
? ? ? ?//遍歷表中的記錄,看是否有類型為1的字段數(shù)據(jù)!也就是SQL數(shù)據(jù)
? ? ? ?for (SysParam sysParam : sysParams) {
? ? ? ? ? ?if ("1".equals(sysParam.getSysParamType())) {
? ? ? ? ? ? ? ?String sql = sysParam.getSysParamValue();
? ? ? ? ? ? ? ?//執(zhí)行SQL,得到查詢后的記錄
? ? ? ? ? ? ? ?List<SysParam> otherList = sysParamMapper.selectOthreTable(sql);
? ? ? ? ? ? ? ?fieldMap = new HashMap<>();
? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? * select s.sh_id as sys_param_value,s.sh_name as sys_param_text ?from store_house s
? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ?//遍歷查詢后的記錄,并把數(shù)據(jù)存到字段MAP
? ? ? ? ? ? ? ?for (SysParam otherSysParam : otherList) {
? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? * key = 倉庫的具體Id
? ? ? ? ? ? ? ? ? ? * value = 頁面顯示的倉庫名稱
? ? ? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ? ? ?fieldMap.put(otherSysParam.getSysParamValue(), otherSysParam.getSysParamText());
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? * key = shId
? ? ? ? ? ? ? ? * value = 存儲具體數(shù)據(jù)的Map集合
? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ?sysParamMap.put(sysParam.getSysParamField(), fieldMap);
? ? ? ? ? ?} else {
? ? ? ? ? ? ? ?//判斷系統(tǒng)參數(shù)的map中是否存在字段的map,如果不存在,就新建一個(gè)
? ? ? ? ? ? ? ?if (sysParamMap.get(sysParam.getSysParamField()) == null) {
? ? ? ? ? ? ? ? ? ?fieldMap = new HashMap<>();
? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? * key ?= 1
? ? ? ? ? ? ? ? ? ? * value = 一級供應(yīng)商
? ? ? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ? ? ?fieldMap.put(sysParam.getSysParamValue(), sysParam.getSysParamText());
? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? * key = supType
? ? ? ? ? ? ? ? ? ? * value = 存儲具體數(shù)據(jù)的Map集合
? ? ? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ? ? ?sysParamMap.put(sysParam.getSysParamField(), fieldMap);
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ?//如果存在,那么就在原先的Map集合中添加
? ? ? ? ? ? ? ? ? ?fieldMap = (Map<String, Object>) sysParamMap.get(sysParam.getSysParamField());
? ? ? ? ? ? ? ? ? ?fieldMap.put(sysParam.getSysParamValue(), sysParam.getSysParamText());
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?/**
? ? ? ? * key = shId ? ? ? ?value = Map-->(1 ?主倉庫)
? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2 ?分倉庫)
? ? ? ? *
? ? ? ? * key = supType ? ?value= Map-->( 1 ? 一級供應(yīng)商)
? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?( 2 ?二級供應(yīng)商)...
? ? ? ? * key = goodsColor ?value = Map--> (1 ?紅色)....
? ? ? ? */
? ? ? ?return sysParamMap;
? ?}
}
controller使用@PostConstruct注解,在初始化的時(shí)候就把數(shù)據(jù)加載到application域?qū)ο笾?/p> ? ?//系統(tǒng)啟動時(shí)加載參數(shù) ? ?@PostConstruct ? ?public void initSysParam(){ ? ? ? ?loadSysParam(); ? ?} ? ?//用來加載系統(tǒng)參數(shù) ? ? ?public void loadSysParam(){ ? ? ? ?Map<String, Object> sysParamMap = sysParamService.selectList(); ? ? ? ?application.setAttribute("sysParam", sysParamMap); ? ? ? ?System.out.println("===================系統(tǒng)參數(shù)加載成功2====================="); ? ?}
? ?
? ?public void initSysParam(){
? ? ? ?loadSysParam();
? ?}
? ?//用來加載系統(tǒng)參數(shù) ?
? ?public void loadSysParam(){
? ? ? ?Map<String, Object> sysParamMap = sysParamService.selectList();
? ? ? ?application.setAttribute("sysParam", sysParamMap);
? ? ? ?System.out.println("===================系統(tǒng)參數(shù)加載成功2=====================");
? ?}
采購商品
采購表buy_order:
單號bo_id,供貨商sup_id,倉庫sh_id,收貨日期bo_date,應(yīng)付(實(shí)付+欠款+優(yōu)惠)bo_payable,實(shí)付bo_paid,欠款bo_Arrears,原始單號bo_original_id,備注bo_remark,經(jīng)辦人bo_attn,操作員operator。采購明細(xì)表buy_order_detail:
編號bod_id:商品名稱goods_id,單位goods_unit,數(shù)量 bod_amount,進(jìn)價(jià)bod_buy_price,總金額(可無)bod_total_price, ? ?采購單號bo_id,手機(jī)串號列表(##分隔)bod_IMEI賬務(wù)表account_records:
編號ad_id,供貨商編號sup_id,日期ad_date,單號(不同類型單號不一樣)ad_order_id,類型(業(yè)務(wù)類型)ad_bus_type,應(yīng)付ad_payable, ? ?實(shí)付ad_paid,欠款ad_arrears,優(yōu)惠金額ad_discount,經(jīng)辦人ad_attn,操作員ad_operator。備注ad_remark數(shù)據(jù)在插入的時(shí)候涉及到了這三張的數(shù)據(jù)庫表:
至于我們的財(cái)務(wù)表的數(shù)據(jù)是用于拓展的,屬性的信息基本是在采購表中獲取:
? ?public int insertBuyOrder(BuyOrder buyOrder) throws Exception { ? ? ? ?// TODO Auto-generated method stub ? ? ? ?System.out.println("service.buyOrder:"+buyOrder); ? ? ? ?int i = 0; ? ? ? ? ? ? ?//生成采購單號,bo表示采購業(yè)務(wù) ? ? ? ?//bo --商品采購 ? ? ? ?//ro --商品退貨 ? ? ? ?// ? ? ? ?String boId ="bo"+UUID.randomUUID().toString().replace("-", ""); ? ? ? ?System.out.println("boIduuid:"+boId); ? ? ? ?//設(shè)置采購單號 ? ? ? ?buyOrder.setBoId(boId); ? ? ? ? ? ?i = buyOrderMapper.insert(buyOrder); ? ? ? ?//設(shè)置采購明細(xì)主鍵及與采購單的外鍵值 ? ? ? ?for(BuyOrderDetail bod : buyOrder.getBuyOrderDetails()){ ? ? ? ? ? ?bod.setBodId(UUID.randomUUID().toString().replace("-", "")); ? ? ? ? ? ?bod.setBoId(boId); ? ? ? ?} ? ? ? ?buyOrderDetailMapper.insertList(buyOrder.getBuyOrderDetails()); ? ? ? ?AccountRecords accountRecords = new AccountRecords(); ? ? ? ?// 生成并設(shè)置悵務(wù)記錄的主鍵 ? ? ? ?accountRecords.setArId(String.valueOf("ar"+UUID.randomUUID().toString().replace("-", ""))); ? ? ? ?accountRecords.setArAttn(buyOrder.getBoAttn()); ? ? ? ?accountRecords.setArArrears(buyOrder.getBoArrears()); ? ? ? ?//bo表示商品采購,可以在參數(shù)表中加入相關(guān)內(nèi)容 ? ? ? ?accountRecords.setArBusType("bo"); ? ? ? ?accountRecords.setArDate(buyOrder.getBoDate()); ? ? ? ?//優(yōu)惠金額:用應(yīng)付金額減去實(shí)付金額再減去欠款 ? ? ? ?accountRecords.setArDiscount(buyOrder.getBoPayable().subtract(buyOrder.getBoPaid()).subtract(buyOrder.getBoArrears())); ? ? ? ?accountRecords.setArOperator(buyOrder.getBoOperator()); ? ? ? ?//采購單號 ? ? ? ?accountRecords.setArOrderId(buyOrder.getBoId()); ? ? ? ?accountRecords.setArPaid(buyOrder.getBoPaid()); ? ? ? ?accountRecords.setArPayable(buyOrder.getBoPayable()); ? ? ? ?accountRecords.setArRemark(buyOrder.getBoRemark()); ? ? ? ?accountRecords.setSupId(buyOrder.getSupId()); ? ? ? ?accountRecordsMapper.insert(accountRecords); ? ? ? ?return i; ? ?}? ? ? ?// TODO Auto-generated method stub
? ? ? ?System.out.println("service.buyOrder:"+buyOrder);
? ? ? ?int i = 0; ? ? ?
? ? ? ?//生成采購單號,bo表示采購業(yè)務(wù)
? ? ? ?//bo --商品采購
? ? ? ?//ro --商品退貨
? ? ? ?//
? ? ? ?String boId ="bo"+UUID.randomUUID().toString().replace("-", "");
? ? ? ?System.out.println("boIduuid:"+boId);
? ? ? ?//設(shè)置采購單號
? ? ? ?buyOrder.setBoId(boId); ? ?
? ? ? ?i = buyOrderMapper.insert(buyOrder);
? ? ? ?//設(shè)置采購明細(xì)主鍵及與采購單的外鍵值
? ? ? ?for(BuyOrderDetail bod : buyOrder.getBuyOrderDetails()){
? ? ? ? ? ?bod.setBodId(UUID.randomUUID().toString().replace("-", ""));
? ? ? ? ? ?bod.setBoId(boId);
? ? ? ?}
? ? ? ?buyOrderDetailMapper.insertList(buyOrder.getBuyOrderDetails());
? ? ? ?AccountRecords accountRecords = new AccountRecords();
? ? ? ?// 生成并設(shè)置悵務(wù)記錄的主鍵
? ? ? ?accountRecords.setArId(String.valueOf("ar"+UUID.randomUUID().toString().replace("-", "")));
? ? ? ?accountRecords.setArAttn(buyOrder.getBoAttn());
? ? ? ?accountRecords.setArArrears(buyOrder.getBoArrears());
? ? ? ?//bo表示商品采購,可以在參數(shù)表中加入相關(guān)內(nèi)容
? ? ? ?accountRecords.setArBusType("bo");
? ? ? ?accountRecords.setArDate(buyOrder.getBoDate());
? ? ? ?//優(yōu)惠金額:用應(yīng)付金額減去實(shí)付金額再減去欠款
? ? ? ?accountRecords.setArDiscount(buyOrder.getBoPayable().subtract(buyOrder.getBoPaid()).subtract(buyOrder.getBoArrears()));
? ? ? ?accountRecords.setArOperator(buyOrder.getBoOperator());
? ? ? ?//采購單號
? ? ? ?accountRecords.setArOrderId(buyOrder.getBoId());
? ? ? ?accountRecords.setArPaid(buyOrder.getBoPaid());
? ? ? ?accountRecords.setArPayable(buyOrder.getBoPayable());
? ? ? ?accountRecords.setArRemark(buyOrder.getBoRemark());
? ? ? ?accountRecords.setSupId(buyOrder.getSupId());
? ? ? ?accountRecordsMapper.insert(accountRecords);
? ? ? ?return i;
? ?}
總結(jié)
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y
總結(jié)
以上是生活随笔為你收集整理的阅读SSM项目之scm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为手机怎么使用读卡器_华为G7手机OT
- 下一篇: 四大开源3d游戏引擎探究