Java连接数据库实现图书馆管理系统(详细教程)

小星星o 2024-07-06 17:35:01 阅读 77

该功能用到的软件为 IDEA 、Navicat 、云服务器(非必须)

源码下载

https://www.aliyundrive.com/s/UTz8pNxobGK

一、建立数据库

在自己的服务器或者电脑本机安装数据库系统,本次系统演示的数据库版本为5.6。

1.创建图书管理数据库library 字符集为:utf8 -utf8_general_ci

<code>

/*

Navicat Premium Data Transfer

Source Server : local

Source Server Type : MySQL

Source Server Version : 50739

Source Host : 121.37.205.242:3306

Source Schema : library

Target Server Type : MySQL

Target Server Version : 50739

File Encoding : 65001

Date: 31/01/2023 11:23:05

*/

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for amerce

-- ----------------------------

DROP TABLE IF EXISTS `amerce`;

CREATE TABLE `amerce` (

`rnumber` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '读者编号',

`rname` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '读者名字',

`bnumber` int(11) DEFAULT NULL COMMENT '图书编号',

`bname` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图书名称',

`quantity` int(11) DEFAULT 0 COMMENT '数量',

`bstime` datetime(0) DEFAULT NULL COMMENT '还书和借书时间',

`money` int(11) DEFAULT NULL COMMENT '罚款金额'

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '罚款信息表' ROW_FORMAT = Compact;

-- ----------------------------

-- Table structure for books

-- ----------------------------

DROP TABLE IF EXISTS `books`;

CREATE TABLE `books` (

`number` int(11) NOT NULL AUTO_INCREMENT COMMENT '图书编号',

`name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图书名称',

`category` int(11) DEFAULT NULL COMMENT '图书类别',

`author` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '作者',

`press` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '出版社',

`pdate` date DEFAULT NULL COMMENT '出版日期',

`wdate` datetime(0) DEFAULT NULL COMMENT '入库日期',

`books` int(11) DEFAULT NULL COMMENT '库存总数量',

`extant` int(11) DEFAULT 0 COMMENT '现存数量',

PRIMARY KEY (`number`) USING BTREE,

UNIQUE INDEX `books_name`(`name`) USING BTREE,

INDEX `books_category`(`category`) USING BTREE,

CONSTRAINT `books_category` FOREIGN KEY (`category`) REFERENCES `category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

) ENGINE = InnoDB AUTO_INCREMENT = 214 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '图书信息表' ROW_FORMAT = Compact;

-- ----------------------------

-- Table structure for borrow

-- ----------------------------

DROP TABLE IF EXISTS `borrow`;

CREATE TABLE `borrow` (

`rnumber` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '读者编号',

`bnumber` int(11) DEFAULT NULL COMMENT '图书编号',

`quantity` int(11) DEFAULT 1 COMMENT '数量',

`btime` datetime(0) DEFAULT NULL COMMENT '借书时间'

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '借书信息表' ROW_FORMAT = Compact;

-- ----------------------------

-- Table structure for category

-- ----------------------------

DROP TABLE IF EXISTS `category`;

CREATE TABLE `category` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类别ID',

`name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类别名称',

PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '图书类别表' ROW_FORMAT = Compact;

-- ----------------------------

-- Table structure for reader

-- ----------------------------

DROP TABLE IF EXISTS `reader`;

CREATE TABLE `reader` (

`number` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号',

`name` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '读者名字',

`sex` varchar(4) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,

`kind` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '读者种类',

`rdate` datetime(0) DEFAULT NULL COMMENT '登记时间',

`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,

PRIMARY KEY (`number`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '读者信息表' ROW_FORMAT = Compact;

-- ----------------------------

-- Table structure for still

-- ----------------------------

DROP TABLE IF EXISTS `still`;

CREATE TABLE `still` (

`rnumber` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '读者编号',

`bnumber` int(11) NOT NULL COMMENT '图书编号',

`quantity` int(11) DEFAULT 1 COMMENT '数量',

`stime` datetime(0) DEFAULT NULL COMMENT '还书时间'

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '还书信息表' ROW_FORMAT = Compact;

-- ----------------------------

-- View structure for view_aa

-- ----------------------------

DROP VIEW IF EXISTS `view_aa`;

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_aa` AS select `b`.`rnumber` AS `rnumber`,`r`.`name` AS `rname`,`b`.`bnumber` AS `bnumber`,`bs`.`name` AS `bname`,`b`.`btime` AS `bstime` from ((`borrow` `b` join `books` `bs`) join `reader` `r`) where ((`b`.`rnumber` = `r`.`number`) and (`b`.`bnumber` = `bs`.`number`));

-- ----------------------------

-- Procedure structure for Bookreturn

-- ----------------------------

DROP PROCEDURE IF EXISTS `Bookreturn`;

delimiter ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE `Bookreturn`(in Borrowid char(20),in bookid int ,quant int)

begin

declare cone int default 0;

set cone =(select quantity from borrow

where rnumber =Borrowid and bnumber=bookid and quantity>0

ORDER BY btime limit 1)-quant;

-- 向还书表插入信息

INSERT INTO still(rnumber,bnumber,quantity,stime)

VALUES(Borrowid,bookid,quant,now());

-- 图书表数量+还书的数量

update books set extant=extant+quant

where number=bookid ;

-- 还书后减去对应的数量

update borrow set quantity=quantity-quant

where rnumber =Borrowid and bnumber=bookid

ORDER BY btime limit 1;

-- while循环,如果借书表数值为负数,则循环减去正数的数值

WHILE cone<0 DO

set cone=cone+1;

update borrow set quantity =quantity-1

where quantity>0 and rnumber =Borrowid and bnumber=bookid

ORDER BY btime limit 1;

update borrow set quantity=quantity+1

WHERE quantity<0 and rnumber =Borrowid and bnumber=bookid

ORDER BY btime limit 1;

END WHILE;

-- 把等于0的数值删除

delete from borrow

where quantity=0;

end

;;

delimiter ;

-- ----------------------------

-- Procedure structure for Borrowbooks

-- ----------------------------

DROP PROCEDURE IF EXISTS `Borrowbooks`;

delimiter ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE `Borrowbooks`(Borrowid char(20),bookid int ,quant int)

begin

INSERT INTO borrow(rnumber,bnumber,quantity,btime)

VALUES(Borrowid,bookid,quant,now());

-- update borrow set quantity=quantity+quant WHERE Borrowid=rnumber and bookid=bnumber;

update books set extant=extant-quant

where number=bookid;

end

;;

delimiter ;

-- ----------------------------

-- Procedure structure for Insertbooks

-- ----------------------------

DROP PROCEDURE IF EXISTS `Insertbooks`;

delimiter ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE `Insertbooks`(b varchar(40),c int ,d varchar(35),e varchar(40),f date,h int)

begin

INSERT INTO books (number,`name`,category,author,press,pdate,wdate,books)

VALUES (null,b,c,d,e,f,now(),h) ON DUPLICATE KEY UPDATE books=books+h;

update books set extant = extant+h where `name`= b;

end

;;

delimiter ;

-- ----------------------------

-- Procedure structure for proc_2

-- ----------------------------

DROP PROCEDURE IF EXISTS `proc_2`;

delimiter ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_2`()

BEGIN

drop view if exists view_aa;

create view view_aa as

select b.rnumber,r.`name` rname,b.bnumber,bs.`name` bname,b.btime as bstime from borrow b,books bs,reader r

where b.rnumber=r.number and b.bnumber=bs.number;

insert into amerce(rnumber,rname,bnumber,bname,money,bstime)

select rnumber,rname,bnumber,bname,count(*) as money,bstime from view_aa;

end

;;

delimiter ;

-- ----------------------------

-- Procedure structure for repayment

-- ----------------------------

DROP PROCEDURE IF EXISTS `repayment`;

delimiter ;;

CREATE DEFINER=`root`@`%` PROCEDURE `repayment`(rnum char(20),bnum int ,quant int)

begin

declare cone int default 0;

-- 减去对应的数量

update amerce set quantity=quantity-quant

where rnumber = rnum and bnumber = bnum

ORDER BY bstime limit 1;

-- 把负数赋值给cone

select quantity into cone from amerce where quantity<0;

-- while循环,如果cone为负数,则循环减去正数的数值

WHILE cone<0 DO

set cone=cone+1;

-- 钱数 money-(money/quantity)

update amerce set money=money-(money/quantity)

where quantity>0 and rnumber = rnum and bnumber = bnum

ORDER BY bstime limit 1;

-- 正数 -1

update amerce set quantity =quantity-1

where quantity>0 and rnumber = rnum and bnumber = bnum

ORDER BY bstime limit 1;

-- 负数 +1

update amerce set quantity=quantity+1

WHERE quantity<0 and rnumber = rnum and bnumber = bnum

ORDER BY bstime limit 1;

END WHILE;

-- 把等于0的数值删除

delete from amerce where quantity=0;

end

;;

delimiter ;

-- ----------------------------

-- Procedure structure for updateMyTest

-- ----------------------------

DROP PROCEDURE IF EXISTS `updateMyTest`;

delimiter ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE `updateMyTest`(quant int)

BEGIN

declare cone int default 0;

set cone =(select quantity from borrow

where quantity>0

ORDER BY btime limit 1)-quant;

SELECT * from borrow where quantity=cone;

-- WHILE cone<0 DO

-- set cone=cone+1;

-- update borrow set quantity =quantity-1

-- where quantity>0

-- ORDER BY btime limit 1;

-- update borrow set quantity=quantity+1

-- WHERE quantity<0

-- ORDER BY btime limit 1;

-- END WHILE;

end

;;

delimiter ;

-- ----------------------------

-- Triggers structure for table still

-- ----------------------------

DROP TRIGGER IF EXISTS `trigger_still_amerce`;

delimiter ;;

CREATE DEFINER = `root`@`localhost` TRIGGER `trigger_still_amerce` BEFORE INSERT ON `still` FOR EACH ROW -- 行级触发器

BEGIN

replace into amerce(rnumber,rname,bnumber,bname,quantity,bstime,money)

select borrow.rnumber rnumber,reader.name rname,

borrow.bnumber bnumber,books.name bname,

borrow.quantity quantity,reader.rdate bstime,

0.1*datediff(now(),borrow.btime)-30 money

from borrow,reader,books

where borrow.rnumber=reader.number and borrow.bnumber=books.number

and datediff(now(),borrow.btime)>=30

and books.number=borrow.bnumber;

END

;;

delimiter ;

SET FOREIGN_KEY_CHECKS = 1;

2.设计好将要使用的sql语句

视图、存储过程和触发器,在上面创建数据库的时候建好了,下面是一下视图、存储过程和触发器的创建语句。

-- 1、添加图书表书籍 -- 完成

CREATE UNIQUE index books_name on books(name);

delimiter //

create procedure Insertbooks(b varchar(40),c int ,d varchar(35),e varchar(40),f date,h int)

begin

INSERT INTO books (number,`name`,category,author,press,pdate,wdate,books)

VALUES (null,b,c,d,e,f,now(),h) ON DUPLICATE KEY UPDATE books=books+h;

update books set extant = extant+h where `name`= b;

end; //

delimiter ;

call Insertbooks('白鹿原','1','张三','人民出版社','2022-1-9','7');

-- 2、添加图书类别信息 -- 完成

INSERT INTO category()

VALUES(1,'话剧');

-- 3、添加读者信息 -- 完成

INSERT INTO reader(number,name,sex,kind,rdate)

VALUES('20215101020051','翠花','女','学生',now());

-- 4、读者借书 -- 完成

delimiter //

create procedure Borrowbooks(Borrowid char(20),bookid int ,quant int)

begin

INSERT INTO borrow(rnumber,bnumber,quantity,btime)

VALUES(Borrowid,bookid,quant,now());

-- update borrow set quantity=quantity+quant WHERE Borrowid=rnumber and bookid=bnumber;

update books set extant=extant-quant

where number=bookid;

end ; //

delimiter ;

Call Borrowbooks('20215101020051','203','50');

-- 5、读者还书 -- 完成

delimiter //

create procedure Bookreturn(in Borrowid char(20),in bookid int ,quant int)

begin

declare cone int default 0;

set cone =(select quantity from borrow

where rnumber =Borrowid and bnumber=bookid and quantity>0

ORDER BY btime limit 1)-quant;

-- 向还书表插入信息

INSERT INTO still(rnumber,bnumber,quantity,stime)

VALUES(Borrowid,bookid,quant,now());

-- 图书表数量+还书的数量

update books set extant=extant+quant

where number=bookid ;

-- 还书后减去对应的数量

update borrow set quantity=quantity-quant

where rnumber =Borrowid and bnumber=bookid

ORDER BY btime limit 1;

-- while循环,如果借书表数值为负数,则循环减去正数的数值

WHILE cone<0 DO

set cone=cone+1;

update borrow set quantity =quantity-1

where quantity>0 and rnumber =Borrowid and bnumber=bookid

ORDER BY btime limit 1;

update borrow set quantity=quantity+1

WHERE quantity<0 and rnumber =Borrowid and bnumber=bookid

ORDER BY btime limit 1;

END WHILE;

-- 把等于0的数值删除

delete from borrow

where quantity=0;

end ; //

delimiter ;

Call Bookreturn('20215101020051','203','5');

drop procedure Borrowbooks;

drop TRIGGER trigger_still_amerce;

-- 6、读者还书时超过30天罚款 -- 完成

-- 设置还书的时候触发,往罚款表插入数据

delimiter //

CREATE TRIGGER trigger_still_amerce

BEFORE INSERT ON still FOR EACH ROW -- 行级触发器

BEGIN

replace into amerce(rnumber,rname,bnumber,bname,quantity,bstime,money)

select borrow.rnumber rnumber,reader.name rname,

borrow.bnumber bnumber,books.name bname,

borrow.quantity quantity,reader.rdate bstime,

0.1*datediff(now(),borrow.btime)-30 money

from borrow,reader,books

where borrow.rnumber=reader.number and borrow.bnumber=books.number

and datediff(now(),borrow.btime)>=30

and books.number=borrow.bnumber;

END; //

delimiter ;

show TRIGGERS;

-- 7、图书废弃 -- 完成

update books set books=books-1,extant=extant-1 where number='202';code>

-- 8、图书下架 -- 完成

delete from books where number='202';code>

3.创建项目

在IEDA中新建一个空项目 library

创建软件包 Module

创建三个类, JavaOK、JavaTest、JDBCUtils 。JavaOK=>运行语句 , JavaTest=> 存放方法 , JOBCUtils =>存放方法

4.导入mysql包(必要)

下载包:mysql网站:MySQL :: Download Connector/J

下拉选择Platform Independent

下载mysql-connector-j-8.0.32.tar.gz

点击Download下载

点击No thanks, just start my download.//不登陆下载

解压后就可以看到mysql-connector-j-8.0.32.jar,只有3m大小

或者可以在阿里云盘下载

Java连接数据库实现图书馆...系统(详细教程)阿里云盘分享


在IEDA中导入刚刚下载的包:

文件-项目结构-模块-点击加号-1.JAR或目录-上传刚刚下载的jar包

导包工作完成,接下来可以正式编写代码了

5.测试连接数据库

先来一个简单的测试,看是否能成功连接

package com.moyida.linkage;

import java.sql.Connection;

import java.sql.DriverManager;

public class test {

public static void main(String[] args) {

Connection con;

//

String url = "jdbc:mysql://localhost:3306/library";

String user = "root";

String password = "root";

try {

//连接数据库,获得连接对象

con = DriverManager.getConnection(url, user, password);

if (!con.isClosed())

System.out.println("成功连接数据库");

} catch (Exception e) {

e.printStackTrace();

System.out.println("连接失败");

}

}

}

运行栏显示”成功连接数据库“则表示连接成功了

如果显示”连接失败“,则没有连接成功,检查上述的步骤是否遗漏

测试完后可以将代码删除

6.JOBCUtili 页面

里边存入释放资源的方法

//释放资源

public static void close(Connection connection, Statement statement, ResultSet resultSet) {

try {

if (resultSet != null) {

resultSet.close();

resultSet = null;

}

if (statement != null) {

statement.close();

statement = null;

}

if (connection != null) {

connection.close();

connection = null;

}

} catch (SQLException e) {

e.printStackTrace();

}

}

7.JavaTest 页面

这里先写好数据库连接方法,修改的时候数据库的时候只要修改一处就好了

ip地址修改成自己的

static final String DB_URL = "jdbc:mysql://localhost:3306/library";

static final String USER = "root"; //账号

static final String PASS = "root"; //密码

这里为了省事儿,我把JavaTest页面的所有代码都放到这里

把IP地址和账号密码给成自己的就可以用了,根据方法可以看出连接数据库和执行sql语句的原理,用上面的main方法可以测试这些方法的可行性。

package com.moyida.linkage;

import java.lang.constant.Constable;

import java.sql.*;

public class JavaTest {

public static void main(String[] args) {

//查询用户信息

// query_data("20215154515454", "456");

//查询登录信息

// System.out.println(UserType("20215154515454", "456"));

//插入书籍到图书信息表

// System.out.println("书名,类别,作者,出版社,出版日期,数量");

// AddBooks("高原", "1", "小儿", "中华出版社", "2022-1-9", "5");

//添加类别

// AddCategories(5, "神话类");

//3、添加读者信息

// AddReaders("20544545446546", "劳务", "女", "2", "1112222");

//4、读者借书

// Call Borrowbooks('20215101020051','203','3');

// BorrowBooks("20215101020051","203","3");

//5、读者还书

// AlsoBook("20215101020051","203","2");

//-- 7、图书废弃

//update books set books=books-1,extant=extant-1 where number='202';code>

// BooksAbandoned("203");

//-- 8、图书下架

//delete from books where number='202';code>

// Undercarriage("203");

//查询图书信息

// System.out.println(BookInformation("205"));

// AllBookInformation();

//欠费查询

// System.out.println(ArrearageTable("20215101020051", "203"));

//删除罚款账单

// repayment("20215154515454","210");

//查询读者信息表有无该账号

// System.out.println(ReaderTable("2021510102005"));

// 打印读者信息

// PrintReader("20215101024620");

}

static final String DB_URL = "jdbc:mysql://localhost:3306/library";

static final String USER = "root";

static final String PASS = "root";

/**

* 图书下架

*

* @param number

* @return

*/

public static boolean Undercarriage(String number) {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "delete from books where number='" + number + "'";code>

System.out.println(sql);

int resultSet = stmt.executeUpdate(sql);

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(conn, stmt, null);

}

return false;

}

/**

* 图书废弃

*

* @param number

* @return

*/

public static String BooksAbandoned(String number) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "update books set books=books-1,extant=extant-1 where number='" + number + "'";code>

int resultSet = statement.executeUpdate(sql);

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, null);

}

return number;

}

/**

* 读者还书

*

* @param rnumber 读者编号

* @param bnumber 图书编号

* @param quantity 数量

*/

static void AlsoBook(String rnumber, String bnumber, String quantity) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "Call Bookreturn(" + "'" + rnumber + "'" + "," + "'" + bnumber + "'" + "," + "'" + quantity + "'" + ")";

System.out.println(sql);

int resultSet = statement.executeUpdate(sql);

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, null);

}

}

/**

* 欠费罚款查询

*

* @param rnumber

* @param bnumber

* @return

*/

public static String ArrearageTable(String rnumber, String bnumber) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "SELECT sum(money) as arrearage FROM amerce WHERE rnumber =" + rnumber + " and bnumber= " + bnumber + " ORDER BY quantity";

ResultSet resultSet = statement.executeQuery(sql);

while (resultSet.next()) {

String a = resultSet.getString("arrearage");

return a;

}

// 完成后关闭

resultSet.close();

statement.close();

connection.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (statement != null) statement.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (connection != null) connection.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

return null;

}

/**

* 通过学号打印借书信息表

*

* @param rnumber 读者编号

*/

public static void NumberBookTable(String rnumber) {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "SELECT * FROM borrow WHERE rnumber =" + rnumber;

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

System.out.print(rs.getString("rnumber"));

System.out.print("\t ,");

System.out.print(rs.getString("bnumber"));

System.out.print("\t ,");

System.out.print(rs.getString("quantity"));

System.out.print("\t ,");

System.out.println(rs.getString("btime"));

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

/**

* 打印借书信息表

*

* @param rnumber 读者编号

* @param bnumber 书籍编号

*/

public static void BookTable(String rnumber, String bnumber) {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "SELECT * FROM borrow WHERE rnumber =" + rnumber + " and bnumber= " + bnumber;

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

System.out.print(rs.getString("rnumber"));

System.out.print("\t ,");

System.out.print(rs.getString("bnumber"));

System.out.print("\t ,");

System.out.print(rs.getString("quantity"));

System.out.print("\t ,");

System.out.println(rs.getString("btime"));

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

/**

* 删除罚款账单

*

* @param rnumber

* @param bnumber

*/

//delete amerce WHERE rnumber='20215154515454' and bnumber='210'code>

public static void repayment(String rnumber, String bnumber) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "delete from amerce WHERE rnumber=" + rnumber + " and bnumber=" + bnumber;

int resultSet = statement.executeUpdate(sql);

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, null);

}

}

/**

* 读者借书

*

* @param rnumber 读者编号

*/

public static void BorrowBooks(String rnumber, String bnumber, String quantity) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "Call Borrowbooks(" + "'" + rnumber + "'" + "," + "'" + bnumber + "'" + "," + "'" + quantity + "'" + ")";code>

System.out.println(sql);

int resultSet = statement.executeUpdate(sql);

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, null);

}

}

/**

* 添加读者信息(注册)

*

* @param number

* @param name

* @param sex

* @param kind

* @param password

*/

public static void AddReaders(String number, String name, String sex, String kind, String password) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

// // INSERT INTO reader(number,name,sex,kind,rdate) VALUES('20215101020051','翠花','女','学生',now(),password);

String sql = "INSERT INTO reader VALUES(" + "'" + number + "'" + "," + "'" + name + "'" + "," + "'" + sex + "'" + "," + "'" + kind + "'" + "," + "now()" + "," + "'" + password + "'" + ")";

int resultSet = statement.executeUpdate(sql);

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, null);

}

}

/**

* 2、添加图书类别信息

*

* @param id

* @param name

* @return

*/

public static String AddCategories(int id, String name) {

Connection connection = null;

Statement statement = null;

ResultSet resultSet = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "INSERT INTO category() VALUES(" + id + "," + "'" + name + "'" + ")";

resultSet = statement.executeQuery(sql);

// int resultSet = statement.executeUpdate(sql);

// 完成后关闭

resultSet.close();

statement.close();

connection.close();

} catch (Exception e) {

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, resultSet);

}

return name;

}

/**

* 添加书籍到图书信息表

*

* @param name 图书名称

* @param category 图书类别

* @param author 作者

* @param press 出版社

* @param pdate 出版日期

* @param quantity 要存的数量

* @return

*/

public static String AddBooks(String name, String category, String author, String press, String pdate, String quantity) {

Connection connection = null;

ResultSet resultSet = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "call Insertbooks(" + "'" + name + "'" + "," + "'" + category + "'" + "," + "'" + author + "'" + "," + "'" + press + "'" + "," + "'" + pdate + "'" + "," + "'" + quantity + "'" + ")";

resultSet = statement.executeQuery(sql);

// 完成后关闭

resultSet.close();

statement.close();

connection.close();

} catch (Exception e) {

//错误处理

e.printStackTrace();

}//释放资源

finally {

JDBCUtils.close(connection, statement, resultSet);

}

return name;

}

/**

* 查询所有图书信息

*

* @return 返回值

*/

public static void AllBookInformation() {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "SELECT * FROM books";

ResultSet rs = stmt.executeQuery(sql);

System.out.println("图书编号 图书名称 图书类别 作者 出版社 出版日期 入库日期 库存总数量 现存数量");

while (rs.next()) {

System.out.print(rs.getString("number") + "\t");

System.out.print(rs.getString("name") + "\t");

System.out.print(rs.getString("category") + "\t");

System.out.print(rs.getString("author") + "\t");

System.out.print(rs.getString("press") + "\t");

System.out.print(rs.getString("pdate") + "\t");

System.out.print(rs.getString("wdate") + "\t");

System.out.print(rs.getString("books") + "\t");

System.out.println(rs.getString("extant"));

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

/**

* 打印读者信息

*/

public static void PrintReader(String number){

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "SELECT * FROM reader WHERE number =" + number;

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

System.out.print(rs.getString("number")+"\t");

System.out.print(rs.getString("name")+"\t");

System.out.print(rs.getString("sex")+"\t");

System.out.print(rs.getString("kind")+"\t");

System.out.print(rs.getString("rdate")+"\t");

System.out.println(rs.getString("password"));

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

/**

* 查询读者信息表有无该账号

*

* @return

*/

public static Constable ReaderTable(String number) {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "select number from reader where number=" + number;

ResultSet rs = stmt.executeQuery(sql);

if (rs.next()) {

return false;

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

return null;

}

/**

* 查询图书信息

*

* @param number 输入的密码

* @return 返回值

*/

public static String BookInformation(String number) {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "SELECT * FROM books WHERE number =" + number;code>

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

String a = rs.getString("number");

String a1 = ("\t");

String b = rs.getString("name");

String b1 = ("\t");

String c = rs.getString("category");

String c1 = ("\t");

String d = rs.getString("author");

String d1 = ("\t");

String e = rs.getString("press");

String e1 = ("\t");

String f = rs.getString("pdate");

String f1 = ("\t");

String g = rs.getString("wdate");

String g1 = ("\t");

String h = rs.getString("books");

String h1 = ("\t");

String i = rs.getString("extant");

return a + a1 + b + b1 + c + c1 + d + d1 + e + e1 + f + f1 + g + g1 + h + h1 + i;

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

return null;

}

/**

* 查询学生表信息

*

* @param number 输入的账号

* @param password 输入的密码

* @return 返回值

*/

public static void query_data(String number, String password) {

Connection conn = null;

Statement stmt = null;

try {

//连接数据库,获得连接对象

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

stmt = conn.createStatement();

String sql = "select * from reader where number= " + "'" + number + "'" + " and password=" + "'" + password + "'";code>

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

String a = rs.getString("number");

String a1 = ("\t");

String b = rs.getString("name");

String b1 = ("\t");

String c = rs.getString("sex");

String c1 = ("\t");

String d = rs.getString("kind");

String d1 = ("\t");

String e = rs.getString("rdate");

String e1 = ("\t");

String f = rs.getString("password");

System.out.println(a + a1 + b + b1 + c + c1 + d + e + d1 + f);

}

// 完成后关闭

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

/**

* 判断用户类型,登录账号,返回1表示老师,返回2表示学生,返回null表示查无此人

*

* @param number 输入的学号

* @return 返回值

*/

public static String UserType(String number, String password) {

Connection connection = null;

Statement statement = null;

try {

//连接数据库,获得连接对象

connection = DriverManager.getConnection(DB_URL, USER, PASS);

//创建执行环境

statement = connection.createStatement();

//执行sql语句,得到结果集 resultSet

String sql = "select kind from reader where number= " + "'" + number + "'" + " and password=" + "'" + password + "'";code>

ResultSet resultSet = statement.executeQuery(sql);

while (resultSet.next()) {

String a = resultSet.getString("kind");

return a;

}

// 完成后关闭

resultSet.close();

statement.close();

connection.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (statement != null) statement.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (connection != null) connection.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

return null;//这样可以使得调用方无需检查结果是否为null

}

}

8.JavaOK 页面

JavaOK是运行调用JavaTest和JOBCUtili方法的主页面,在这个类运行可以实现系统的管理,这个系统仍有不少的bug没修复,但是可以正常跑起来了,可以根据自己的理解,把代码经行完善和修复

下面是JavaOK页面的代码

package com.moyida.linkage;

import java.lang.constant.Constable;

import java.util.Scanner;

public class JavaOk {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

while (true) {

System.out.println("=============首页==============");

System.out.println("1、登录");

System.out.println("2、注册");

int reg = sc.nextInt();

switch (reg) {

case 1:

//登录

while (true) {

System.out.println("=============登陆页面==============");

System.out.println("请您输入账号");

String acc = sc.next();

System.out.println("请您输入密码");

String pass = sc.next();

String sum = JavaTest.UserType(acc, pass);

if (sum == null) {

System.out.println("对不起,查无此人,请重新输入");

break;

}

// int a = Integer.parseInt(sum);

// String a=sum;

//判断用户类型,登录账号,返回1表示老师,返回2表示学生,返回null表示查无此人

System.out.println("返回的数据是" + sum);

switch (sum) {

case "1":

System.out.println("欢迎管理员登录");

conservator(sc);

break;

case "2":

System.out.println("欢迎学生登录");

operate(sc, acc);

break;

default:

System.out.println("对不起,查无此人");

break;

}

break;

}

case 2:

//注册

Register(sc);

break;

default:

System.out.println("您输入的命令错误,请重新输入!");

break;

}

}

}

/**

* 注册

*

* @param sc

*/

private static void Register(Scanner sc) {

System.out.println("=============注册页面==============");

System.out.println("请输入要注册的账号(学号)");

String number = sc.next();

//查询数据库中有无该账号

Constable aaa = JavaTest.ReaderTable(number);

if (aaa == null) {

//没有账号,可以进行

System.out.println("请输入您的名字");

String name = sc.next();

System.out.println("请输入您的性别");

String sex = sc.next();

System.out.println("请输入您的类型 学生 2/管理员 1");

int kind = sc.nextInt();

System.out.println("请输入您的登录密码:");

String pass = sc.next();

//调用注册方法

JavaTest.AddReaders(number, name, sex, String.valueOf(kind), pass);

System.out.println("注册成功!");

//打印注册信息

System.out.println("您的注册信息如下:");

JavaTest.PrintReader(number);

}else {

System.out.println("该账号已注册!");

}

}

/**

* 管理员操作页面

*

* @param sc

*/

private static void conservator(Scanner sc) {

while (true) {

System.out.println("=============操作页面==============");

System.out.println("0、退出");

System.out.println("1、添加图书表书籍");

System.out.println("2、添加图书类别信息");

System.out.println("3、图书废弃");

System.out.println("4、图书下架");

System.out.println("5、查询全部图书信息");

int i = sc.nextInt();

switch (i) {

case 0:

System.out.println("已退出账号,欢迎再次登录!");

return;

case 1:

System.out.println("=============添加书籍页面==============");

System.out.println("图书名称");

String name = sc.next();

System.out.println("图书类别");

String category = sc.next();

System.out.println("作者");

String author = sc.next();

System.out.println("出版社");

String press = sc.next();

System.out.println("出版日期");

String pdate = sc.next();

System.out.println("要存的数量");

String quantity = sc.next();

String charu = JavaTest.AddBooks(name, category, author, press, pdate, quantity);

System.out.println("添加成功");

break;

case 2:

System.out.println("=============添加图书类别页面==============");

System.out.println("输入类别编号");

int leibie = sc.nextInt();

System.out.println("输入类别名称");

String name1 = sc.next();

JavaTest.AddCategories(leibie, name1);

System.out.println("添加成功");

break;

case 3:

System.out.println("=============图书废弃页面==============");

System.out.println("请输入要废弃图书的图书编号");

String reduce = sc.next();

System.out.println("您要废除的书籍是:");

System.out.println(JavaTest.BookInformation(reduce));

System.out.println("是否确认废除y/n");

String rs = sc.next();

switch (rs) {

case "y":

//可以废除

String ff = JavaTest.BooksAbandoned(reduce);

System.out.println(JavaTest.BookInformation(reduce));

System.out.println("废弃成功,该图书减一");

break;

default:

System.out.println("您取消废除,当前书籍继续保留~");

}

break;

case 4:

System.out.println("=============图书下架页面==============");

System.out.println("请输入要下架图书的图书编号");

String reduce1 = sc.next();

System.out.println("您要下架的书籍是:");

System.out.println(JavaTest.BookInformation(reduce1));

System.out.println("是否确认把该图书下架y/n");

String rs1 = sc.next();

switch (rs1) {

case "y":

//可以废除

String ff = JavaTest.BooksAbandoned(reduce1);

System.out.println(JavaTest.Undercarriage(reduce1));

System.out.println("下架成功,图书已从图书系统中去除");

break;

default:

System.out.println("您取消废除,当前书籍继续保留~");

}

break;

case 5:

//查看所有书籍

JavaTest.AllBookInformation();

break;

default:

System.out.println("输入错误!");

break;

}

}

}

/**

* 学生操作页面

*

* @param sc

*/

private static void operate(Scanner sc, String acc) {

while (true) {

System.out.println("=============学生操作页面==============");

System.out.println("0、退出");

System.out.println("1、查看所有书籍");

System.out.println("2、借书");

System.out.println("3、还书");

String student = sc.next();

switch (student) {

case "0":

System.out.println("已退出账号,欢迎再次登录!");

return;

case "1":

//查看所有书籍

JavaTest.AllBookInformation();

break;

case "2":

//借书

// public static boolean BorrowBooks(String rnumber, String bnumber, String quantity) {

System.out.println("请输入要借的书籍编号");

String Borrow = sc.next();

System.out.println("您要借的书籍是:");

System.out.println(JavaTest.BookInformation(Borrow));

System.out.println("是否借该图书?y/n");

String rs1 = sc.next();

switch (rs1) {

case "y":

//可以借书

System.out.println("您要借几本书?");

String books = sc.next();

JavaTest.BorrowBooks(acc, Borrow, books);

System.out.println("借书完成,您的借书信息如下");

//打印借书信息

JavaTest.BookTable(acc, Borrow);

System.out.println("");

break;

default:

System.out.println("您取消借书操作,欢迎再次使用!");

}

break;

case "3":

//还书

System.out.println("您可以还的书籍如下");

JavaTest.NumberBookTable(acc);

System.out.println("");

System.out.println("请输入要还的书籍编号");

String AlsoBook = sc.next();

System.out.println("您要还的书籍是:");

//打印借书信息

JavaTest.BookTable(acc, AlsoBook);

//再次确定归还

System.out.println("是否还该图书?y/n");

String rs2 = sc.next();

switch (rs2) {

case "y":

//可以还书

System.out.println("您要还此编号的几本书?");

String books = sc.next();

// 还书

JavaTest.AlsoBook(acc, AlsoBook, books);

//查询欠费账单有没有欠费

String bill = JavaTest.ArrearageTable(acc, AlsoBook);

if (bill == null) {

//可以了

System.out.println("还书完成,您还有此类书籍尚为归还");

//打印借书信息

JavaTest.BookTable(acc, AlsoBook);

break;

} else {

//钱没还

while (true) {

System.out.println("您欠费的金额是" + bill);

System.out.println("如已支付,请输入内容:支付完成");

String ff = sc.next();

String dd = "支付完成";

if (ff.equals(dd)) {

//删除欠费账单

JavaTest.repayment(acc, AlsoBook);

//打印借书信息

System.out.println("还书完成,您还有此类书籍尚为归还");

//打印借书信息

JavaTest.BookTable(acc, AlsoBook);

break;

} else {

System.out.println("支付失败,请完成支付");

}

}

}

}

}

}

}

}

9.运行

在IEDA的JavaOK页面,右键点击运行,就可以使用了。

10.资料

我在阿里云盘中存有该系统程序的源代码,可提供下载学习使用。

阿里网盘 链接

Java连接数据库实现图书馆...系统(详细教程)阿里云盘分享



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。