日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阅读SSM项目之scm

發布時間:2024/8/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阅读SSM项目之scm 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


導入項目

項目是由eclipse來編寫的,我使用的開發環境是Idea,那么就需要將eclipse項目導入進去Idea中。要想項目能夠啟動起來。是這樣干的:

導入eclipse的項目

添加對應的Web Model,添加完畢之后,默認會提示要我們創建對應的Facts的。

接著修改Facets中標出的值,因為我們手動創建的話,指向的是Idea中的web目錄的。可是項目是用eclipse編寫的,因此要改成是WebRoot對應的文件!

接著配置Tomcat,就基本可以讓eclipse中的項目在Idea環境下運行了。

主菜單跳轉JSP頁面

在主菜單頁面上有很多的URL跳轉到不同的JSP頁面。

這些超鏈接是不同的模塊下的。但是我們可以使用BaseAction對他們進行統一管理起來

? ? ? ?//方法參數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"; ? ? ? ?}

? ? ? ?@RequestMapping("/goURL/{folder}/{file}")
? ? ? ?public String goURL(@PathVariable String folder,@PathVariable String file) {
? ? ? ? ? ?return "forward:/WEB-INF/"+folder+"/"+file+".jsp";
? ? ? ?}

我們常常在跳轉頁面之前都要查詢數據庫的數據的,那如果是這樣設計的話,我們可以將常用數據放在application域對象中,或者使用ajax來進行獲取數據!

分頁對象設計

之前我們做的分頁對象就僅僅把我們分頁所用到的基本屬性封裝起來。如果頁面上有查詢條件的話,我們另外創建了一個查詢對象

當時候創建出來的查詢對象的屬性是根據頁面上的條件來編寫的。這樣做得不夠好,沒有通用性!

這次看見這個項目的Page設計就非常通用了,雖然把查詢條件都放在了Page對象中,但我感覺比之前那個好!

public class Page<T> implements Serializable { ? ?private static final long serialVersionUID = 337297181251071639L; ? ?private Integer page;//當前頁 ? ?private Integer rows;//頁大小 ? ?private Integer totalRecord;// 總記錄 數 ? ?private List<T> list;//頁面數據列表 ? ?private String keyWord;//查詢關鍵字 ? ?private T paramEntity;//多條件查詢 ? ?private Integer start;//需要這里處理 ? ?//因為它用的是easyUI,所以沒有設置總頁數的屬性,使用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;//當前頁
? ?private Integer rows;//頁大小
? ?private Integer totalRecord;// 總記錄 數

? ?private List<T> list;//頁面數據列表

? ?private String keyWord;//查詢關鍵字

? ?private T paramEntity;//多條件查詢

? ?private Integer start;//需要這里處理

? ?//因為它用的是easyUI,所以沒有設置總頁數的屬性,使用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 + "]";
? ?}
}

抽取Service層

之前我們也抽取過Service層的代碼,當時候也覺得用得十分巧妙:

然而,這次看到的baseService就用得更加巧妙了,并且設計得更加好!

如下代碼:

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//在構造方法后,初化前執行 ? ?private void initBaseMapper() throws Exception{ ? ? ? ?//完成以下邏輯,需要對研發本身進行命名與使用規范 ? ? ? ?//this關鍵字指對象本身,這里指的是調用此方法的實現類(子類) ? ? ? ?System.out.println("=======this :"+this); ? ? ? ?System.out.println("=======父類基本信息:"+this.getClass().getSuperclass()); ? ? ? ?System.out.println("=======父類和泛型的信息:"+this.getClass().getGenericSuperclass()); ? ? ? ?ParameterizedType type =(ParameterizedType) this.getClass().getGenericSuperclass(); ? ? ? ?//獲取第一個參數的class ? ? ? ?Class clazz = (Class)type.getActualTypeArguments()[0]; ? ? ? ?System.out.println("=======class:"+clazz); ? ? ? ?//轉化為屬性名(相關的Mapper子類的引用名)Supplier ?supplierMapper ? ? ? ?String localField = clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"Mapper"; ? ? ? ?System.out.println("=======localField:"+localField); ? ? ? ?//getDeclaredField:可以使用于包括私有、默認、受保護、公共字段,但不包括繼承的字段 ? ? ? ?Field field=this.getClass().getSuperclass().getDeclaredField(localField); ? ? ? ?System.out.println("=======field:"+field); ? ? ? ?System.out.println("=======field對應的對象:"+field.get(this)); ? ? ? ?Field baseField = this.getClass().getSuperclass().getDeclaredField("baseMapper"); ? ? ? ?System.out.println("=======baseField:"+baseField); ? ? ? ?System.out.println("=======baseField對應的對象:"+baseField.get(this)); ? ? ? ?//field.get(this)獲取當前this的field字段的值。例如:Supplier對象中,baseMapper所指向的對象為其子類型SupplierMapper對象,子類型對象已被spring實例化于容器中 ? ? ? ?baseField.set(this, field.get(this)); ? ? ? ?System.out.println("========baseField對應的對象:"+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;

? ?@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//在構造方法后,初化前執行
? ?private void initBaseMapper() throws Exception{

? ? ? ?//完成以下邏輯,需要對研發本身進行命名與使用規范
? ? ? ?//this關鍵字指對象本身,這里指的是調用此方法的實現類(子類)
? ? ? ?System.out.println("=======this :"+this);
? ? ? ?System.out.println("=======父類基本信息:"+this.getClass().getSuperclass());
? ? ? ?System.out.println("=======父類和泛型的信息:"+this.getClass().getGenericSuperclass());

? ? ? ?ParameterizedType type =(ParameterizedType) this.getClass().getGenericSuperclass();
? ? ? ?//獲取第一個參數的class
? ? ? ?Class clazz = (Class)type.getActualTypeArguments()[0];
? ? ? ?System.out.println("=======class:"+clazz);
? ? ? ?//轉化為屬性名(相關的Mapper子類的引用名)Supplier ?supplierMapper
? ? ? ?String localField = clazz.getSimpleName().substring(0,1).toLowerCase()+clazz.getSimpleName().substring(1)+"Mapper";
? ? ? ?System.out.println("=======localField:"+localField);

? ? ? ?//getDeclaredField:可以使用于包括私有、默認、受保護、公共字段,但不包括繼承的字段
? ? ? ?Field field=this.getClass().getSuperclass().getDeclaredField(localField);
? ? ? ?System.out.println("=======field:"+field);
? ? ? ?System.out.println("=======field對應的對象:"+field.get(this));


? ? ? ?Field baseField = this.getClass().getSuperclass().getDeclaredField("baseMapper");
? ? ? ?System.out.println("=======baseField:"+baseField);
? ? ? ?System.out.println("=======baseField對應的對象:"+baseField.get(this));
? ? ? ?//field.get(this)獲取當前this的field字段的值。例如:Supplier對象中,baseMapper所指向的對象為其子類型SupplierMapper對象,子類型對象已被spring實例化于容器中
? ? ? ?baseField.set(this, field.get(this));
? ? ? ?System.out.println("========baseField對應的對象:"+baseMapper);

? ?} ?

}

這個baseService并沒有給出對應的setDao的方法,那它是怎么將BaseDao實例化的呢???關鍵就在于initBaseMapper()這個方法!

我們來看一下方法內部打印數據的內容吧:

=======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對應的對象:org.apache.ibatis.binding.MapperProxy@7cc946=======baseField:protected cn.itcast.scm.dao.BaseMapper cn.itcast.scm.service.impl.BaseServiceImpl.baseMapper=======baseField對應的對象:null========baseField對應的對象: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對應的對象:org.apache.ibatis.binding.MapperProxy@7cc946
=======baseField:protected cn.itcast.scm.dao.BaseMapper cn.itcast.scm.service.impl.BaseServiceImpl.baseMapper
=======baseField對應的對象:null
========baseField對應的對象:org.apache.ibatis.binding.MapperProxy@7cc946

這個方法被@PostConstruct注解給修飾著

通過我一陣的梳理,BaseDao的實例化過程是這樣的:

其實上面也是通過具體的serviceImpl來對baseDao來進行初始化,不過它這樣子做的話就顯得更加優雅了。并不需要在每個具體的serviceImpl使用setDao()的方式來進行實例化。

通過上面的解釋、我們把注釋寫上,就很容易理解了。

? ?/** ? ? * 每當service實例化的時候,這個方法都會被調用 ? ? * @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來進行實例化 ? ? ? ?baseField.set(this, field.get(this)); ? ?}
? ?@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來進行實例化
? ? ? ?baseField.set(this, field.get(this));
? ?}

分析項目的業務

本項目主要用EASY-UI來作為前段的頁面構建。這里就不一一去探究EASY-UI的用法的,當用到這個前段UI的時候再回頭看吧。下面就直接分析它的具體邏輯體悟了。

用戶登陸

首先,程序的入口是用戶登錄的界面。用戶設計得比較簡單,因為只用來做登錄。

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)
);

對于用戶登陸而言,我們已經是非常熟悉這個業務了。只是在數據庫中對比一下數據、如果存在這個數據,那么在session域中保存即可!

基本數據的數據庫表

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的操作。

那么這個項目是這樣處理的,將經常用到的數據用一張表保存起來

drop table if exists sys_param;/*====================================系統參數表==============================*//*==============================================================*//* 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','一級供應商');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','2','二級供應商');insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','3','普通供應商');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','藍色');select * from sys_param;table if exists sys_param;
/*====================================系統參數表==============================*/
/*==============================================================*/
/* 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','一級供應商');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','2','二級供應商');
insert into sys_param(sys_param_field,sys_param_value,sys_param_text) values('supType','3','普通供應商');
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','藍色');
select * from sys_param;

上面我們可以看到,除了單單保存了一些的基本屬性之外,我們來存儲了SQL語句,那么我們怎么將SQL語句轉成是我們的數據呢???

那它是怎么實現這種玩意的呢??

Mapper查詢表的數據

?<select id="selectList" parameterType="String" resultMap="sysParamResultMap"> ? ? ? ? ? ?select * from sys_param ?</select> ?<!-- 查詢其它表的數據,使用${value}格式,允許使用sql語句作為參數執行 --> ?<select id="selectOthreTable" parameterType="string" resultMap="sysParamResultMap"> ? ? ?${value} ?</select>
? ? ?select * from sys_param
?</select>

?<!-- 查詢其它表的數據,使用${value}格式,允許使用sql語句作為參數執行 -->
?<select id="selectOthreTable" parameterType="string" resultMap="sysParamResultMap">
? ? ?${value}
?</select>

Service將數據封裝到一個總的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() { ? ? ? ?//查詢出表中所有所有數據 ? ? ? ?List<SysParam> sysParams = sysParamMapper.selectList(""); ? ? ? ?//存儲屬性字段具體的值 ? ? ? ?Map<String, Object> fieldMap = null; ? ? ? ?//最終的Map,key是屬性字段,value是一個map(屬性字段具體的值) ? ? ? ?Map<String, Object> sysParamMap = new HashMap<String, Object>(); ? ? ? ?//遍歷表中的記錄,看是否有類型為1的字段數據!也就是SQL數據 ? ? ? ?for (SysParam sysParam : sysParams) { ? ? ? ? ? ?if ("1".equals(sysParam.getSysParamType())) { ? ? ? ? ? ? ? ?String sql = sysParam.getSysParamValue(); ? ? ? ? ? ? ? ?//執行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 ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ?//遍歷查詢后的記錄,并把數據存到字段MAP ? ? ? ? ? ? ? ?for (SysParam otherSysParam : otherList) { ? ? ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? ? ? * key = 倉庫的具體Id ? ? ? ? ? ? ? ? ? ? * value = 頁面顯示的倉庫名稱 ? ? ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ? ? ?fieldMap.put(otherSysParam.getSysParamValue(), otherSysParam.getSysParamText()); ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? * key = shId ? ? ? ? ? ? ? ? * value = 存儲具體數據的Map集合 ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ?sysParamMap.put(sysParam.getSysParamField(), fieldMap); ? ? ? ? ? ?} else { ? ? ? ? ? ? ? ?//判斷系統參數的map中是否存在字段的map,如果不存在,就新建一個 ? ? ? ? ? ? ? ?if (sysParamMap.get(sysParam.getSysParamField()) == null) { ? ? ? ? ? ? ? ? ? ?fieldMap = new HashMap<>(); ? ? ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? ? ? * key ?= 1 ? ? ? ? ? ? ? ? ? ? * value = 一級供應商 ? ? ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? ? ? ? ?fieldMap.put(sysParam.getSysParamValue(), sysParam.getSysParamText()); ? ? ? ? ? ? ? ? ? ?/** ? ? ? ? ? ? ? ? ? ? * key = supType ? ? ? ? ? ? ? ? ? ? * value = 存儲具體數據的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 ? 一級供應商) ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?( 2 ?二級供應商)... ? ? ? ? * 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;

@Service("sysParamService")
public class SysParamServiceImpl extends BaseServiceImpl<SysParam> implements SysParamService {

? ?@Override
? ?public Map<String, Object> selectList() {

? ? ? ?//查詢出表中所有所有數據
? ? ? ?List<SysParam> sysParams = sysParamMapper.selectList("");

? ? ? ?//存儲屬性字段具體的值
? ? ? ?Map<String, Object> fieldMap = null;

? ? ? ?//最終的Map,key是屬性字段,value是一個map(屬性字段具體的值)
? ? ? ?Map<String, Object> sysParamMap = new HashMap<String, Object>();


? ? ? ?//遍歷表中的記錄,看是否有類型為1的字段數據!也就是SQL數據
? ? ? ?for (SysParam sysParam : sysParams) {
? ? ? ? ? ?if ("1".equals(sysParam.getSysParamType())) {
? ? ? ? ? ? ? ?String sql = sysParam.getSysParamValue();
? ? ? ? ? ? ? ?//執行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
? ? ? ? ? ? ? ? */

? ? ? ? ? ? ? ?//遍歷查詢后的記錄,并把數據存到字段MAP
? ? ? ? ? ? ? ?for (SysParam otherSysParam : otherList) {
? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? * key = 倉庫的具體Id
? ? ? ? ? ? ? ? ? ? * value = 頁面顯示的倉庫名稱
? ? ? ? ? ? ? ? ? ? */

? ? ? ? ? ? ? ? ? ?fieldMap.put(otherSysParam.getSysParamValue(), otherSysParam.getSysParamText());
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? * key = shId
? ? ? ? ? ? ? ? * value = 存儲具體數據的Map集合
? ? ? ? ? ? ? ? */

? ? ? ? ? ? ? ?sysParamMap.put(sysParam.getSysParamField(), fieldMap);

? ? ? ? ? ?} else {
? ? ? ? ? ? ? ?//判斷系統參數的map中是否存在字段的map,如果不存在,就新建一個
? ? ? ? ? ? ? ?if (sysParamMap.get(sysParam.getSysParamField()) == null) {
? ? ? ? ? ? ? ? ? ?fieldMap = new HashMap<>();
? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? * key ?= 1
? ? ? ? ? ? ? ? ? ? * value = 一級供應商
? ? ? ? ? ? ? ? ? ? */

? ? ? ? ? ? ? ? ? ?fieldMap.put(sysParam.getSysParamValue(), sysParam.getSysParamText());

? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? * key = supType
? ? ? ? ? ? ? ? ? ? * value = 存儲具體數據的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 ? 一級供應商)
? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?( 2 ?二級供應商)...
? ? ? ? * key = goodsColor ?value = Map--> (1 ?紅色)....
? ? ? ? */

? ? ? ?return sysParamMap;
? ?}
}

controller使用@PostConstruct注解,在初始化的時候就把數據加載到application域對象中

? ?//系統啟動時加載參數 ? ?@PostConstruct ? ?public void initSysParam(){ ? ? ? ?loadSysParam(); ? ?} ? ?//用來加載系統參數 ? ? ?public void loadSysParam(){ ? ? ? ?Map<String, Object> sysParamMap = sysParamService.selectList(); ? ? ? ?application.setAttribute("sysParam", sysParamMap); ? ? ? ?System.out.println("===================系統參數加載成功2====================="); ? ?}
? ?@PostConstruct
? ?public void initSysParam(){
? ? ? ?loadSysParam();
? ?}

? ?//用來加載系統參數 ?
? ?public void loadSysParam(){
? ? ? ?Map<String, Object> sysParamMap = sysParamService.selectList();
? ? ? ?application.setAttribute("sysParam", sysParamMap);
? ? ? ?System.out.println("===================系統參數加載成功2=====================");
? ?}

采購商品

采購表buy_order:

單號bo_id,供貨商sup_id,倉庫sh_id,收貨日期bo_date,應付(實付+欠款+優惠)bo_payable,實付bo_paid,欠款bo_Arrears,原始單號bo_original_id,備注bo_remark,經辦人bo_attn,操作員operator。

采購明細表buy_order_detail:

編號bod_id:商品名稱goods_id,單位goods_unit,數量 bod_amount,進價bod_buy_price,總金額(可無)bod_total_price, ? ?采購單號bo_id,手機串號列表(##分隔)bod_IMEI

賬務表account_records:

編號ad_id,供貨商編號sup_id,日期ad_date,單號(不同類型單號不一樣)ad_order_id,類型(業務類型)ad_bus_type,應付ad_payable, ? ?實付ad_paid,欠款ad_arrears,優惠金額ad_discount,經辦人ad_attn,操作員ad_operator。備注ad_remark

數據在插入的時候涉及到了這三張的數據庫表:

至于我們的財務表的數據是用于拓展的,屬性的信息基本是在采購表中獲取:

? ?public int insertBuyOrder(BuyOrder buyOrder) throws Exception { ? ? ? ?// TODO Auto-generated method stub ? ? ? ?System.out.println("service.buyOrder:"+buyOrder); ? ? ? ?int i = 0; ? ? ? ? ? ? ?//生成采購單號,bo表示采購業務 ? ? ? ?//bo --商品采購 ? ? ? ?//ro --商品退貨 ? ? ? ?// ? ? ? ?String boId ="bo"+UUID.randomUUID().toString().replace("-", ""); ? ? ? ?System.out.println("boIduuid:"+boId); ? ? ? ?//設置采購單號 ? ? ? ?buyOrder.setBoId(boId); ? ? ? ? ? ?i = buyOrderMapper.insert(buyOrder); ? ? ? ?//設置采購明細主鍵及與采購單的外鍵值 ? ? ? ?for(BuyOrderDetail bod : buyOrder.getBuyOrderDetails()){ ? ? ? ? ? ?bod.setBodId(UUID.randomUUID().toString().replace("-", "")); ? ? ? ? ? ?bod.setBoId(boId); ? ? ? ?} ? ? ? ?buyOrderDetailMapper.insertList(buyOrder.getBuyOrderDetails()); ? ? ? ?AccountRecords accountRecords = new AccountRecords(); ? ? ? ?// 生成并設置悵務記錄的主鍵 ? ? ? ?accountRecords.setArId(String.valueOf("ar"+UUID.randomUUID().toString().replace("-", ""))); ? ? ? ?accountRecords.setArAttn(buyOrder.getBoAttn()); ? ? ? ?accountRecords.setArArrears(buyOrder.getBoArrears()); ? ? ? ?//bo表示商品采購,可以在參數表中加入相關內容 ? ? ? ?accountRecords.setArBusType("bo"); ? ? ? ?accountRecords.setArDate(buyOrder.getBoDate()); ? ? ? ?//優惠金額:用應付金額減去實付金額再減去欠款 ? ? ? ?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表示采購業務

? ? ? ?//bo --商品采購
? ? ? ?//ro --商品退貨
? ? ? ?//
? ? ? ?String boId ="bo"+UUID.randomUUID().toString().replace("-", "");
? ? ? ?System.out.println("boIduuid:"+boId);
? ? ? ?//設置采購單號
? ? ? ?buyOrder.setBoId(boId); ? ?
? ? ? ?i = buyOrderMapper.insert(buyOrder);

? ? ? ?//設置采購明細主鍵及與采購單的外鍵值
? ? ? ?for(BuyOrderDetail bod : buyOrder.getBuyOrderDetails()){
? ? ? ? ? ?bod.setBodId(UUID.randomUUID().toString().replace("-", ""));
? ? ? ? ? ?bod.setBoId(boId);
? ? ? ?}
? ? ? ?buyOrderDetailMapper.insertList(buyOrder.getBuyOrderDetails());

? ? ? ?AccountRecords accountRecords = new AccountRecords();
? ? ? ?// 生成并設置悵務記錄的主鍵
? ? ? ?accountRecords.setArId(String.valueOf("ar"+UUID.randomUUID().toString().replace("-", "")));
? ? ? ?accountRecords.setArAttn(buyOrder.getBoAttn());
? ? ? ?accountRecords.setArArrears(buyOrder.getBoArrears());
? ? ? ?//bo表示商品采購,可以在參數表中加入相關內容
? ? ? ?accountRecords.setArBusType("bo");
? ? ? ?accountRecords.setArDate(buyOrder.getBoDate());
? ? ? ?//優惠金額:用應付金額減去實付金額再減去欠款
? ? ? ?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;
? ?}

總結

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y


總結

以上是生活随笔為你收集整理的阅读SSM项目之scm的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九一国产视频 | 午夜视频在线观看一区 | 中文字幕在线观看第二页 | 区一区二视频 | 成人免费激情视频 | 色老头在线一区二区三区 | 国产亚洲综合在线 | 国产一级大片在线观看 | 亚洲性av| 久久久久久av无码免费看大片 | 久久久久久久久久一级 | 91午夜影院 | 亚洲乱码国产一区三区 | 白嫩情侣偷拍呻吟刺激 | 午夜少妇av| 五月天爱爱 | 91在线免费看片 | 奇米影视狠狠干 | 国产日韩欧美高清 | 国产毛片欧美毛片久久久 | 亚洲色成人www永久在线观看 | n0659极腔濑亚美莉在线播放播放 | 精品国产av 无码一区二区三区 | 国产又大又黄的视频 | 国产日韩成人 | 婷婷亚洲精品 | 最近的中文字幕 | 色吧av| 男人吃奶视频 | 91蜜桃传媒精品久久久一区二区 | 日韩欧美一区二区三区四区五区 | 亚洲日日夜夜 | 欧美激情影院 | 超碰在线观看免费版 | 综合亚洲色图 | 九九热在线免费视频 | 男人和女人在床的app | 亚洲成人日韩 | 麻豆传媒在线播放 | 99re视频在线播放 | 日韩在线视频免费播放 | 久久久999 | 全部孕妇毛片丰满孕妇孕交 | 五月天伊人网 | 国产高潮在线观看 | www.av在线视频 | 日韩一区二区免费在线观看 | 成年人免费视频网站 | 国产黄av| 午夜成人免费影院 | 就去干成人网 | 色小姐综合网 | 超碰在线免费播放 | 日本免费网| 精品黑人一区二区三区久久 | 亚洲精品无码久久久久久久 | 日韩v片| 女人又爽又黄免费女仆 | 国产综合婷婷 | 日韩αv| xxxxav| 91久久精品在线 | 亚洲社区在线观看 | 手机在线观看免费av | 日本三级吃奶头添泬无码苍井空 | 欧美日韩小说 | av超碰在线观看 | 色妞综合 | 91精品久久香蕉国产线看观看 | 自拍超碰 | 中文字幕一区二区三区四区视频 | 强videoshd酒醉 | 久久久久女人精品毛片九一 | 国产亚洲无码精品 | 色婷婷精品视频 | 波多野结衣毛片 | 国产乱女淫av麻豆国产 | 成人午夜影院在线观看 | 在线观看黄色片 | 美女少妇直播 | 30一40一50老女人毛片 | 欧美成人黑人xx视频免费观看 | www.天天操.com | 亚洲成人精品在线播放 | 美女擦边视频 | 国产中出视频 | 无码人妻少妇色欲av一区二区 | 国产一卡二卡在线播放 | 国产精品亚洲精品 | 久久99久久99精品中文字幕 | 麻豆久久久久久久 | 国产精品乱码久久久久 | 国产精品视频在线免费观看 | 91av视频网 | 黄色在线观看视频网站 | 中文字幕永久在线播放 | 日本在线视频一区二区三区 | 欧美黄色小视频 | 国产精品99一区二区三区 |