当我看到你的第一眼,就把人生里浪漫的是想了个遍。世人的喜欢只会停留在新鲜的第一面,有了爱的牵绊那就会有一生的纠缠…一生只此一回的爱,等多少年都不晚。
前言
这次想写一个图书管理系统,主要包含用户和管理员模块,用户可以实现登录,注册,查询个人信息,借书和还书等操作。管理员可以实现对用户的添加,修改,删除和对书籍的入库、借出、查询等操作。
相关知识了解
三层架构:通常意义上的三层架构就是将整个业务应用划分为:界面层(UI)、业务逻辑层(Service)、数据 访问层(Dao)再加上实体类库(entity)。
1、Dao层 主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作
2、Service层 将UI表示层与DAL数据访问层之间联系起来。所要负责的,就是处理涉及业务逻辑相关的问题,比如在调用访问数据库之前,先处理数据、判断数据
3、UI层 用户表现层(UIL),就是用户看到的主界面。
具体设计
目前完成的有(4日):用户的实体部分(entity层),部分功能实现:用户的添加,修改和删除。 用户的实体部分代码:
private Integer id;
private String name;
private String password;
private String brrow;
private String back;
private String tel;
Dao层
完成了对用户的添加,修改,删除,查找全部用户和按用户名查找。 UserDao接口:
public interface Dao {
void add(User user);
User findUserbyname(String name);
void Update(User user);
List<User> Findall();
void delete(User user);
}
//用户添加
public void add(User user) {
user.setId(users.size()+1);
users.add(user);}
//按用户名修改个人信息
public void Update(User user) {
for(User u:users){
if(u.getName().equals(user.getName())) {
u.setPassword(user.getPassword());
u.setTel(user.getTel());
break;
}
}
}
//按用户id删除用户
public void delete(User user) {
users.remove(user.getId()-1);
}
//查找全部用户
public List<User> Findall() {
List<User> list=new ArrayList();
users.forEach(item ->{
list.add(item);
});
return list;
}
//按用户名查找
public User findUserbyname(String name) {
for( User u :users){
if (u.getName().equals(name)){
return u;
}
}
return null;
}
Service层
调用上述方法。 UserService接口:
boolean addUser(User u);
void delete(User u);
List<User>Findall();
void brrow();
void back();
User findUserbyname(String name);
void update(User user)
//service层调用dao层方法为ui面板提供服务
@Override
public void delete(User u) {userDao.delete(u);}
@Override
public List<User>Findall() { return userDao.Findall();}
@Override
public void brrow() {
}
@Override
public void back() {
}
@Override
public User findUserbyname(String name) {
return userDao.findUserbyname(name);
}
@Override
public void update(User user) {
userDao.Update(user);
}
UI面板
测试(4):对目前功能的测试板块
public class Ui {
UserService userService = new UserServiceImpl();
public static void show(){
System.out.println("1、添加用户");
System.out.println("2、删除用户");
System.out.println("3、查询用户");
System.out.println("4、修改信息");
System.out.println("5、退出");
}
public void choice() {
boolean keep = true;
while (keep) {
show();
Scanner sc = new Scanner(System.in);
System.out.println("请输入选择:");
switch (sc.nextInt()) {
case 1:
System.out.println("请输入用户名:");
String name = sc.next();
User user = new User(name);
boolean y = userService.addUser(user);
if (y) {
System.out.println("添加成功!");
} else {
System.out.println("名字重复了!");
}
break;
case 2:
System.out.println("请输入用户id:");
int id = sc.nextInt();
User u1 = new User();
u1.setId(id);
userService.delete(u1);
System.out.println("删除成功。");
case 3:
List<User> list = userService.Findall();
for (User users:list){
System.out.println(users.toString());
}
break;
case 4:
System.out.println("请输入用户名:");
name = sc.next();
System.out.println("请输入修改后的密码:");
String psd =sc.next();
System.out.println("请输入修改后的电话:");
String tel = sc.next();
User u3 = new User(name,psd,tel);
userService.update(u3);
break;
case 5:
keep = false;
break;
}
}
}
public static void main(String[] args) {
Ui ui = new Ui();
ui.choice();
}
功能测试截图:
3.5更新..
管理员实体类设定为:id,姓名,密码,电话等。
private Integer id;
private String name;
private String password;
private Integer tel;
管理员Dao层部分
与用户功能基本相同:包含对管理员自身的注册、删除、信息修改、全部查找及单个查找。
for (Admin a:admins){
if(a.getName().equals(admin.getName())){
a.setPassword(admin.getPassword());
a.setTel(admin.getTel());
}
}
管理员Service层
完成对管理员信息的各项操作,联系Dao层与ui界面。
public void AdminUpdate(Admin admin) {
adminDao.AdminUpdate(admin);
}
@Override
public void Admindelete(Admin admin) {
}
@Override
public List<Admin> FindAll() {
return adminDao.FindAll();
}
@Override
public Admin findAdminByName(String name) {
return adminDao.findAdminByName(name);
}
登录
用户及管理员的登录问题(暂时放在ui界面中),在Ui界面中写入布尔方法,根据返回值判断是否登录成功,继续进行下面的操作。
public boolean Userlogin() {
List<User> list = userService.Findall();
System.out.println("请输入用户名:");
String name3 = sc.next();
System.out.println("请输入密码:");
String psd2 = sc.next();
User u = new User(name3);
u = userService.findUserbyname(name3);
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getPassword().equals(u.getPassword())) {
return true;
}
}
return false;
}
执行Ui测试
public static void ui() {
System.out.println("*********欢迎来到图书管理系统***********");
System.out.println(" 请选择您要登录的身份 ");
System.out.println("1、用户登录");
System.out.println("2、管理员登录");
System.out.println("3、用户注册");
System.out.println("4、管理员注册");
System.out.println("5、退出");
相关截图
3.6…..有点小困难(没有连数据库,导致每次测试的数据无法生效,整了好多遍。。。)
书籍类
书籍实体
为书籍设计了序号、名称、出版社、作者、数量等变量
private Integer id;
private String bookname;
private String press;
private String author;
private Integer num;
想把ui中的方法写到各自的文件夹中,但是两个类之间的变量并不互通,暂时还没找到好的方法,等数据库连好以后应该就可以了。
对书籍的操作有添加、删除、修改、查找全部书籍与按名查找。。。
BookDao层
部分代码
public class BookDaoImpl implements BookDao {
private List< Book > books = new ArrayList<>();
@Override
public Book findBookByName(String name) {
for (int i=0;i< books.size();i++){
if(books.get(i).getBookname().equals(name)){
return books.get(i);
}
}
return null;
}
@Override
public void add(Book book) {
book.setId(books.size()+1);
books.add(book);
}
public void Update(Book book) {
for(Book book1:books){
if(book1.getBookname().equals(book.getBookname())) {
book1.setNum(book.getNum()+1);
break;
}
}
}
@Override
public void delete(Book book) {
books.remove(book.getId()-1);
}
@Override
public List<Book> FindAllBook() {
List<Book> list =new ArrayList<>();
books.forEach(item->{
list.add(item);
});
return list;
}
BookService层
采用布尔函数来添加书籍,但是后面用户的书籍还书等操作需要直接进行添加操作,所以还需要一个直接添加的函数。
部分代码
public class BookServiceImpl implements BookService {
BookDao bookDao = new BookDaoImpl();
@Override
public Book FindBookByName(String name) {
return bookDao.findBookByName(name);
}
@Override
public boolean BookAdd(Book book) {
List<Book> list= bookDao.FindAllBook();
for(int i=0;i<list.size();i++){
if(list.get(i).getBookname().equals(book.getBookname())){
return false;
}
}
bookDao.add(book);
return true;
}
@Override
public void Bookdelete(Book book) {
bookDao.delete(book);
}
@Override
public List<Book> FindAllBook() {
return bookDao.FindAllBook();
}
@Override
public void Update(Book book) {
bookDao.Update(book);
}
执行Ui测试
用户的书籍借书还书操作基本成功,但具体还需要连接数据库以实验
而管理员的书籍操作可以实现,查询的数据也能显示出来
代码:
case 4:
System.out.println("请选择您要进行的服务:");
Brrow.bookUi();
Brrow.bookChoice();
break;
case 5:
System.out.println("请输入您要还的书名:");
String name3 = sc.next();
Book book = new Book();
Book book1 = new Book(name3,0);
book = bookService.FindBookByName(name3);
if(book!=null){
bookService.Update(book);
}else {
boolean k = bookService.BookAdd(book1);
if (k) {
bookService.Update(book1);
}
}
System.out.println("还书成功!");
Usershow();
Userchoice();
break;
public class Books {
static BookService b=new BookServiceImpl();
public static void bookui(){
System.out.println("1、添加书籍");
System.out.println("2、删除书籍");
System.out.println("3、查询全部书籍");
System.out.println("4、按名查询书籍");
}
public static void bookcho() {
System.out.println("请输入选择:");
Scanner scanner = new Scanner(System.in);
switch (scanner.nextInt()) {
case 1:
System.out.println("请输入书籍名称:");
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("请输入书籍出版社:");
String press = sc.next();
System.out.println("请输入书籍作者:");
String author = sc.next();
System.out.println("请输入书籍数目:");
int num = sc.nextInt();
Book book = new Book(name, press, author, num);
boolean k = b.BookAdd(book);
if (k) {
System.out.println("添加成功");
} else {
System.out.println("重复添加书籍!!");
}
bookui();
bookcho();etc...
测试截图
3.7…. 数据库文件
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `admin`;
CREATE TABLE IF NOT EXISTS `admin` (
`a_id` INT UNSIGNED AUTO_INCREMENT,//设立自增
`a_name` VARCHAR(20) NOT NULL,
`a_psd` VARCHAR(20) NOT NULL,
`a_tel` DOUBLE NOT NULL,
PRIMARY KEY (`a_id`)
)ENGINE=InnoDB DEFAULT CHARSET =utf8;
INSERT INTO `admin` VALUES ('1','测试管理员1', '1','12345');
INSERT INTO `admin` VALUES ('2','测试管理员2', '1','23456');
INSERT INTO `admin` VALUES ('3','测试管理员3', '1','34567');
INSERT INTO `admin` VALUES ('4','测试管理员4', '1','1234');
INSERT INTO `admin` VALUES ('5','测试管理员5', '1','12345');
INSERT INTO `admin` VALUES ('6','测试管理员6', '1','123456');
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`u_ID` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号(主键)',
`u_Name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户姓名',
`u_PSWD` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户密码',
`u_tel` DOUBLE NOT NULL,
PRIMARY KEY (`u_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of customer
INSERT INTO `admin` VALUES ('1','测试用户1', '1','12345');
INSERT INTO `admin` VALUES ('2','测试用户2', '1','23456');
INSERT INTO `admin` VALUES ('3','测试用户3', '1','34567');
INSERT INTO `admin` VALUES ('4','测试用户4', '1','1234');
INSERT INTO `admin` VALUES ('5','测试用户5', '1','12345');
INSERT INTO `admin` VALUES ('6','测试用户6', '1','123456');
CREATE TABLE `book`(
`b_id` varchar (20) NOT NULL COMMIT ,
`b_name` varchar (20) NOT NULL,
`b_p` varchar (20) NOT NULL ,
`b_a` varchar (20) NOT NULL ,
PRIMARY KEY (`b_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
数据库连不上,应该在开始的时候就直接连上数据库来写的,现在我直接将程序写完,导致现在所有方法都要改变,一直出问题,直接连不上了。
3.8-3.9…
数据库连接成功了..问题是我导的mysq-connect包是5.08版本的,但我的要素语法采用的是6.0版本,所以一直报错。
完整版
Dao层
Admin Dao
User Dao
Book Dao
展示Admin dao部分代码:
public int Adminadd(Admin admin) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
int flag = 0;
try {
conn = JDBCUtil.getConnection();
// Integer a_id = admin.getId();
String a_name=admin.getName();
String a_psd = admin.getPassword();
Integer a_tel = admin.getTel();
String sql = "insert into admin values(null , ?, ?, ? )";
ps = conn.prepareStatement(sql);
//ps.setInt(1,a_id);
ps.setString(1,a_name);
ps.setString(2, a_psd);
ps.setInt(3,a_tel);
//System.out.println("insertAdmin(Admin admin)" + sql);
flag = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(conn, ps, rs);
return flag ;
}
}
@Override
public int Admindelete(Admin admin) {
Connection con =null;
PreparedStatement ps=null;
ResultSet rs = null;
int flag=0;
try {
con = JDBCUtil.getConnection();
String a_name = admin.getName();
String sql = "delete from admin where a_name = ?";
ps = con.prepareStatement(sql);
ps.setString(1,a_name);
flag = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.closeResource(con,ps,rs);
return flag;
}
}
@Override
public int AdminUpdate(Admin admin) {
Connection con =null;
PreparedStatement ps =null;
ResultSet rs =null;
int flag=0;
Admin a=null;
try {
con =JDBCUtil.getConnection();
String psd =admin.getPassword();
Integer tel = admin.getTel();
String sql = "UPDATE admin set a_psd = ? , a_tel = ? where a_name = ?";
ps =con.prepareStatement(sql);
ps.setString(1,psd);
ps.setInt(2,tel);
ps.setString(3,admin.getName());
flag = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.closeResource(con,ps,rs);
return flag;
}
}
@Override
public List<Admin> FindAll() {
List<Admin> list = new ArrayList<>();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = JDBCUtil.getConnection();
String sql = "select * from admin";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Admin admin = new Admin();
admin.setId(rs.getInt("A_id"));
admin.setName(rs.getString("A_name"));
admin.setPassword(rs.getString("A_psd"));
admin.setTel(rs.getInt("A_tel"));
list.add(admin);
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
JDBCUtil.closeResource(con, ps, rs);
return list;
}
}
@Override
public Admin findAdminByName(String name) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Admin admin1 = null;
try {
conn = JDBCUtil.getConnection();
String a_name = name;
String sql = "select * from admin where a_name = ?";
ps = conn.prepareStatement(sql);
//System.out.println("selectAdmin(Admin admin)" + sql);
ps.setString(1, a_name);
rs = ps.executeQuery();
while (rs.next()) {
admin1 = new Admin(name);
admin1.setId(rs.getInt("A_ID"));
admin1.setPassword(rs.getString("A_psd"));
admin1.setTel(rs.getInt("A_tel"));
}
} catch (
SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(conn, ps, rs);
return admin1;
}
}
@Override
public Admin findAdminByNamewithpsd(Admin admin) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
Admin admin1 = null;
try {
con = JDBCUtil.getConnection();
String a_name = admin.getName();
String a_psd = admin.getPassword();
String sql = "Select * from admin where a_name= ? And a_psd = ? ";
ps = con.prepareStatement(sql);
ps.setString(1, a_name);
ps.setString(2, a_psd);
rs = ps.executeQuery();
while (rs.next()) {
admin1 = new Admin(a_name, a_psd);
admin1.setId(rs.getInt("a_id"));
admin1.setTel(rs.getInt("a_tel"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.closeResource(con,ps,rs);
return admin1;
}
}
Service
与前面差距不大,主要是调用Dao层的方法。
Ui界面
将各个实体的功能分开,使结构更加清晰,整洁。
long()
choice()
Ui()
测试截图:
管理员界面实现书籍添加功能并向数据库中存入信息:
数据库中写入:
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付
