Java從零實(shí)現(xiàn)超市會(huì)員管理系統(tǒng)
?
項(xiàng)目需求
為某超市開發(fā)一個(gè)超市會(huì)員管理系統(tǒng),實(shí)現(xiàn)會(huì)員的管理,具體實(shí)現(xiàn)功能如下:
(1)積分累計(jì)
(2)積分兌換
(3)查詢剩余積分
(4)查詢所有會(huì)員信息
(5)修改密碼
(6)開卡(注冊會(huì)員)
覆蓋知識
程序基本概念、數(shù)據(jù)類型、流程控制、順序、選擇 、循環(huán)、跳轉(zhuǎn)語句、變量、類、方法、實(shí)用類等
掌握數(shù)據(jù)庫、JDBC、三層架構(gòu)等相關(guān)知識。
掌握Druid連接池、Apache的DBUtils使用 。
開發(fā)思路
(1)明確需求
(2)編碼順序
- 數(shù)據(jù)初始化,完成數(shù)據(jù)表創(chuàng)建,三層架構(gòu)的搭建
- 循環(huán)完成各種超市會(huì)員管理操作
- 菜單切換
(3)測試
開發(fā)步驟
1)、添加需要的jar包到項(xiàng)目中,將lib文件夾中的jar文件通過鼠標(biāo)右單擊選擇Build Path的方式添加到你設(shè)置的eatJar文件目錄里。

2)、創(chuàng)建database.properties文件,用來配置注冊驅(qū)動(dòng)和數(shù)據(jù)庫連接對象的相關(guān)數(shù)據(jù)。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java221804
username=root
password=huanghuang
initialSize=10
maxActive=30
maxIdle=5
maxWait=3000
3)、添加需要的工具類DBUtils類
package cn.book.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DBUtils {
private static DruidDataSource druidDataSource;
static {
Properties properties = new Properties();
try {
InputStream is = DBUtils.class
.getResourceAsStream("/database.properties");
properties.load(is);
druidDataSource = (DruidDataSource) DruidDataSourceFactory
.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return druidDataSource;
}
}4)、創(chuàng)建數(shù)據(jù)表:member表
CREATE TABLE `member` ( `name` varchar(20) NOT NULL, `cardId` int(11) NOT NULL, `password` varchar(20) NOT NULL, `score` int(11) NOT NULL, `registDate` varchar(20) NOT NULL, UNIQUE KEY `cardId` (`cardId`) );

5)、編寫book類,包含get/set方法、有參/無參構(gòu)造、toString方法
6)、數(shù)據(jù)訪問層DAO層的接口和實(shí)現(xiàn)類的增刪改查方法的編寫
7)、服務(wù)層Service層的接口和實(shí)現(xiàn)類的增刪改查方法的編寫
8)、最后完成視圖層View層測試類的編寫
全部代碼展示
1、Member類
package cn.member.entity;
public class Member {
// 定義屬性
private String name;
private int cardId;
private String password;
private int score;
private String registDate;
public Member() {
super();
}
public Member(String name, int cardId, String password, int score,
String registDate) {
super();
this.name = name;
this.cardId = cardId;
this.password = password;
this.score = score;
this.registDate = registDate;
}
// 定義get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCardId() {
return cardId;
}
public void setCardId(int cardId) {
this.cardId = cardId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getRegistDate() {
return registDate;
}
public void setRegistDate(String registDate) {
this.registDate = registDate;
}
@Override
public String toString() {
return "Member [name=" + name + ", cardId=" + cardId + ", password="
+ password + ", score=" + score + ", registDate=" + registDate
+ "]";
}
}2、DBUtils類
(使用連接池DruidDataSource、Apache的知識)
package cn.member.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DBUtils {
private static DruidDataSource druidDataSource;
static {
Properties properties = new Properties();
try {
InputStream is = DBUtils.class
.getResourceAsStream("/database.properties");
properties.load(is);
druidDataSource = (DruidDataSource) DruidDataSourceFactory
.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return druidDataSource;
}
}3、數(shù)據(jù)訪問層的MemberDao接口
package cn.member.dao;
import java.util.List;
import cn.member.entity.Member;
public interface MemberDao {
// 增
public int insert(Member member);
// 刪
public int delete(int cardId);
// 改
public int update(Member book);
// 查一個(gè)
public Member select(int cardId);
// 查全部
public List<Member> selectAll();
}4、數(shù)據(jù)訪問層的MemberDaoImpl類
package cn.member.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.member.dao.MemberDao;
import cn.member.entity.Member;
import cn.member.utils.DBUtils;
public class MemberDaoImpl implements MemberDao {
private QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
@Override
public int insert(Member member) {
String sql = "insert into member(name,cardId,password,score,registDate) values(?,?,?,?,?);";
Object[] args = { member.getName(), member.getCardId(),
member.getPassword(), member.getScore(), member.getRegistDate() };
try {
return queryRunner.update(sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int delete(int cardId) {
String sql = "delete from member where cardId=?;";
try {
return queryRunner.update(sql, cardId);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public int update(Member member) {
String sql = "update `member` set `name`=?,`password`=?,`score`=?,`registDate`=? where `cardId`=?;";
Object[] args={member.getName(),member.getPassword(),member.getScore(),member.getRegistDate(),member.getCardId()};
try {
return queryRunner.update(sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public Member select(int cardId) {
String sql = "select * from member where cardId=?;";
try {
return queryRunner.query(sql,
new BeanHandler<Member>(Member.class), cardId);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Member> selectAll() {
String sql = "SELECT * FROM member;";
try {
return queryRunner.query(sql, new BeanListHandler<Member>(
Member.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}5、服務(wù)層的MemberService接口
package cn.member.service;
import java.util.List;
import cn.member.entity.Member;
public interface MemberService {
// 增
public int insertMember(Member member);
// 刪
public int deleteMember(int cardId);
// 改
public int updateMember(Member member);
// 查一個(gè)
public Member selectMember(int cardId);
// 查全部
public List<Member> selectAllMembers();
}6、服務(wù)層的MemberServiceImpl類
package cn.member.service.impl;
import java.util.List;
import cn.member.dao.MemberDao;
import cn.member.dao.impl.MemberDaoImpl;
import cn.member.entity.Member;
import cn.member.service.MemberService;
public class MemberServiceImpl implements MemberService {
MemberDao memberDao = new MemberDaoImpl();
@Override
public int insertMember(Member Member) {
if (memberDao.select(Member.getCardId()) == null) {
return memberDao.insert(Member);
}
return 0;
}
@Override
public int deleteMember(int cardId) {
if (memberDao.select(cardId) != null) {
return memberDao.delete(cardId);
}
return 0;
}
@Override
public int updateMember(Member Member) {
if (memberDao.select(Member.getCardId()) != null) {
return memberDao.update(Member);
}
return 0;
}
@Override
public Member selectMember(int cardId) {
memberDao.select(cardId);
return null;
}
@Override
public List<Member> selectAllMembers() {
List<Member> listMembers = memberDao.selectAll();
return listMembers;
}
}7、視圖層MemberMgr測試類
package cn.member.view;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import cn.member.entity.Member;
import cn.member.service.MemberService;
import cn.member.service.impl.MemberServiceImpl;
public class MemberMgr {
// 定義一個(gè)Scanner
Scanner sc = new Scanner(System.in);
// 定義Member對象
Member member = new Member();
MemberService ms=new MemberServiceImpl();
//從數(shù)據(jù)庫中查全部會(huì)員信息
List<Member> listM=null;
// 菜單選擇欄
public void showFirst() {
System.out
.println("****************************************歡迎使用超市會(huì)員管理系統(tǒng)*****************************************");
System.out
.println("1.開卡\t2.修改密碼\t3.積分累計(jì)\t4.積分兌換\t5.剩余積分查詢\t6.查看所有會(huì)員信息\t7.退出");
System.out
.println("*******************************************************************************************************");
}
// 會(huì)員卡號隨機(jī)產(chǎn)生方法
public int cardRandom() {
return (int) (Math.random() * (19999999 - 10000000) + 10000000);
}
// 注冊時(shí)判斷會(huì)員是否存在
public boolean isCardId(int mm) {
boolean isCId = false;
if (listM.size() > 0) {
for (Member memberC : listM) {
if (mm == memberC.getCardId()) {
isCId = true;
return isCId;
}
}
}
return isCId;
}
// 判斷會(huì)員卡和密碼是否正確
public boolean isMember(int mm, String pwd) {
boolean isCId = false;
if (listM.size() > 0) {
for (Member memberC : listM) {
// System.out.println(mm+"/"+pwd+"/"+memberC.getCardId()+"/"+memberC.getPassword());
if (mm == memberC.getCardId()
&& pwd.equals(memberC.getPassword())) {
isCId = true;
member = memberC;
return isCId;
}
}
}
return isCId;
}
// 1、開卡
public void OpenCard() {
// 每次都初始化一條member對象
member = new Member();
do {
member.setCardId(cardRandom());
} while (isCardId(member.getCardId()));
System.out.print("請輸入注冊姓名:");
member.setName(sc.next());
System.out.print("請輸入注冊密碼:");
String password1 = sc.next();
do {
if (password1.length() < 6) {
System.out.print("會(huì)員密碼不能小于6位,請重新輸入注冊密碼:");
password1 = sc.next();
}
} while (password1.length() < 6);
member.setPassword(password1);
member.setScore(100);
Date data = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
member.setRegistDate(sdf.format(data));
// ms.insertMember(member);
if(ms.insertMember(member)>0){
System.out.println("恭喜,開通會(huì)員卡成功!系統(tǒng)贈(zèng)送您" + member.getScore()
+ "積分,您的會(huì)員卡號是:" + member.getCardId());
}else{
System.out.println("會(huì)員開通失?。?);
}
// listM.add(member);
}
// 2、修改密碼
public void changePassword() {
System.out.print("請輸入您的會(huì)員卡號:");
int cardNum = sc.nextInt();
System.out.print("請輸入您的會(huì)員密碼:");
String cardPwd = sc.next();
if (isMember(cardNum, cardPwd)) {
System.out.print("請輸入您的會(huì)員新密碼:");
member.setPassword(sc.next());
if(ms.updateMember(member)>0){
System.out.println("新密碼設(shè)置成功!");
}else{
System.out.println("新密碼設(shè)置失?。?);
}
} else {
System.out.println("您輸入的會(huì)員卡號或密碼錯(cuò)誤,無法修改密碼!");
}
}
// 3、積分累計(jì)
public void scoresAdd() {
System.out.print("請輸入您的會(huì)員卡號:");
int cardNum = sc.nextInt();
System.out.print("請輸入您的會(huì)員密碼:");
String cardPwd = sc.next();
if (isMember(cardNum, cardPwd)) {
System.out.print("請輸入本次消費(fèi)金額(消費(fèi)1元累計(jì)1分):");
int scoreCurrent = sc.nextInt();
member.setScore(scoreCurrent + member.getScore());
if(ms.updateMember(member)>0){
System.out.println("積分累計(jì)成功!你重新累計(jì)的積分為:" + member.getScore() + "分");
}else{
System.out.println("積分累計(jì)失??!");
}
} else {
System.out.println("您輸入的會(huì)員卡號或密碼錯(cuò)誤,無法累計(jì)積分!");
}
}
// 4、積分兌換
public void scoresConver() {
System.out.print("請輸入您的會(huì)員卡號:");
int cardNum = sc.nextInt();
System.out.print("請輸入您的會(huì)員密碼:");
String cardPwd = sc.next();
if (isMember(cardNum, cardPwd)) {
System.out.print("請輸入您要兌換使用的積分(100積分抵用0.1元,不足100的積分不做抵用):");
int scoreCurrent = sc.nextInt();
if (scoreCurrent < member.getScore()&&scoreCurrent>100) {
member.setScore(member.getScore() - scoreCurrent);
ms.updateMember(member);
if(ms.updateMember(member)>0){
System.out.println("您消費(fèi)金額中使用會(huì)員積分抵扣了0."
+ (scoreCurrent /100) + "元");
}else{
System.out.println("積分兌換失敗!");
}
}else if(scoreCurrent<100){
System.out.println("不滿足積分兌換規(guī)則,不足100的積分不做抵用!");
}else {
System.out.println("積分不足!");
}
} else {
System.out.println("您輸入的會(huì)員卡號或密碼錯(cuò)誤,無法進(jìn)行兌換!");
}
}
// 5、剩余積分查詢
public void scoresRemain() {
System.out.print("請輸入您的會(huì)員卡號:");
int cardNum = sc.nextInt();
System.out.print("請輸入您的會(huì)員密碼:");
String cardPwd = sc.next();
if (isMember(cardNum, cardPwd)) {
System.out.println("會(huì)員信息【會(huì)員卡號:" + member.getCardId() + ",姓名:"
+ member.getName() + ",可用積分:" + member.getScore()
+ ",開卡時(shí)間:" + member.getRegistDate() + "】");
} else {
System.out.println("您輸入的會(huì)員卡號或密碼錯(cuò)誤,無法查詢到信息!");
}
}
// 6、查看所有會(huì)員信息
public void LookMembers() {
int i = 0;
for (Member member : listM) {
i++;
System.out.println("會(huì)員" + i + "信息【會(huì)員卡號:" + member.getCardId()
+ ",姓名:" + member.getName() + ",可用積分:" + member.getScore()
+ ",開卡時(shí)間:" + member.getRegistDate() + "】");
}
}
public void MainMethod() {
//從數(shù)據(jù)庫中查全部會(huì)員信息
listM=ms.selectAllMembers();
boolean isIn = true;
do {
showFirst();
System.out.print("請選擇:");
switch (sc.nextInt()) {
case 1:
OpenCard();
break;
case 2:
changePassword();
break;
case 3:
scoresAdd();
break;
case 4:
scoresConver();
break;
case 5:
scoresRemain();
break;
case 6:
LookMembers();
break;
case 7:
isIn = false;
break;
}
} while (isIn);
}
public static void main(String[] args) {
MemberMgr memberMgr=new MemberMgr();
memberMgr.MainMethod();
}
}到此這篇關(guān)于Java從零實(shí)現(xiàn)超市會(huì)員管理系統(tǒng)的文章就介紹到這了,更多相關(guān)Java超市會(huì)員管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何將若干時(shí)間區(qū)間進(jìn)行合并的方法步驟
這篇文章主要介紹了Java如何將若干時(shí)間區(qū)間進(jìn)行合并的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
在spring?boot3中使用native?image的最新方法
這篇文章主要介紹了在spring?boot3中使用native?image?,今天我們用具體的例子來給大家演示一下如何正確的將spring boot3的應(yīng)用編譯成為native image,需要的朋友可以參考下2023-01-01
java8?Stream大數(shù)據(jù)量List分批處理切割方式
這篇文章主要介紹了java8?Stream大數(shù)據(jù)量List分批處理切割方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
java并發(fā)包工具CountDownLatch源碼分析
這篇文章主要為大家介紹了java并發(fā)包工具CountDownLatch源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
java學(xué)習(xí)之JasperReport踩坑
本篇文章介紹的是在JAVA學(xué)習(xí)中JasperReport遇到的坑以及解決辦法,有需要的朋友參考下吧。2018-01-01
Spring Batch讀取txt文件并寫入數(shù)據(jù)庫的方法教程
這篇文章主要給大家介紹了Spring Batch讀取txt文件并寫入數(shù)據(jù)庫的方法,SpringBatch 是一個(gè)輕量級、全面的批處理框架。這里我們用它來實(shí)現(xiàn)文件的讀取并將讀取的結(jié)果作處理,處理之后再寫入數(shù)據(jù)庫中的功能。需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
SpringBoot的@Value注解如何設(shè)置默認(rèn)值
這篇文章主要介紹了SpringBoot的@Value注解如何設(shè)置默認(rèn)值問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

