1.需求

已知如下两个表:

create table publisher(
       id char(36) primary key,
       name varchar(24) unique,
       address varchar(120)
)  
create table book(
       id char(36) primary key,
       isbn varchar(12) unique,
       name varchar(24),
       publisher_id char(36),
       foreign key(publisher_id) references publisher(id)
)

完成下面功能:

欢迎进入书籍管理系统
    1、出版社管理:增、删、改、查
    2、书籍管理:增、删、改、查
    3、退出

2. 使用log4j.properties 文件


# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,RollingFile#每天产生一个日志文件(RollingFile)
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender#当天的日志文件全路径
log4j.appender.RollingFile.File=d:/logs/sirius.log#服务器启动日志是追加,false:服务器启动后会生成日志文件把老的覆盖掉
log4j.appender.RollingFile.Append=true#日志文件格式
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
log4j.appender.RollingFile.Threshold=DEBUG#设置每天生成一个文件名后添加的名称,备份名称:sirius.log.年月日时分.log
log4j.appender.RollingFile.DatePattern='.'yyyy-MM-dd-HH-mm'.log'

通过使用Log4j,可以控制日志信息格式及其输送目的地(控制台、文件、数据库等),方便的对项目中的日志进行处理,方便后期查找系统运行期间出现的问题,进而便于维护系统。

3. 使用db.properties  文件

url=jdbc:mysql://127.0.0.1:3306/test
user_name=root
password=root

通常情况下,我们的项目完成后上线然后通过域名访问。在上线过程中项目组长通常是创建var包打包交给运维处理。为了后期便于配置管理软件,常将诸如数据库连接配置(url、用户名和密码)、上传文件保存路径等配置信息写在Properties文件(拓展名为properties)中。最好不要将用户名、密码等信息写死在一个类中,无法修改数据库信息。将其写入properties文件中可以防止上述情况。

4. PropertiesUtil类

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class PropertiesUtil {private static Properties properties = new Properties();static {InputStream inputStream = PropertiesUtil.class.getClassLoader().getResourceAsStream("db.properties");try {properties.load(inputStream);} catch (IOException e) {e.printStackTrace();}}public String getValue(String key) {return properties.getProperty(key);          }
}

开发中不止一个Java类需要将某些日志信息写入指定位置,此时每个类中都会重复性地写入如下代码,为了提高代码的重用性,可以将其写入一个PropertiesUtil类中。

5. DBUtil 类

package com.zzu.util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import org.apache.log4j.Logger;/*** 数据库工具类** @author 刘莹*/
public class DButil {private static Logger logger=Logger.getLogger(DButil.class);/*** 使用静态代码块加载数据驱动* * @刘莹*/static {try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {logger.debug(e.getMessage(),e);}}/*** 获取数据库连接* * @刘莹*/private static Connection getConnection() {try {PropertiesUtil pu = new PropertiesUtil();String url = pu.getValue("url");String user_name = pu.getValue("user_name");String password = pu.getValue("password");return DriverManager.getConnection(url, user_name, password);} catch (Exception e) {logger.debug(e.getMessage(),e);}return null;}/*** 数据库更新操作---增删改** @author 刘莹*/public static boolean update(String sql) {Connection connection = null;Statement statement = null;try {connection = getConnection();statement = connection.createStatement();return statement.executeUpdate(sql) > 0;} catch (Exception e) {logger.debug(e.getMessage(),e);} finally {close(statement, connection);}return false;}/*** 数据库查询操作** @author 刘莹*/public static void query(String sql, IRowMapper rowMapper) {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {connection = getConnection();statement = connection.createStatement();resultSet = statement.executeQuery(sql);rowMapper.rowMapper(resultSet);} catch (Exception e) {logger.debug(e.getMessage(),e);} finally {close(resultSet, statement, connection);}}/*** 数据库更新操作--方法重载,防止SQL注入** @author 刘莹*/public static boolean update(String sql, Object... params) {Connection connection = null;PreparedStatement preparedStatement = null;try {connection = getConnection();preparedStatement = connection.prepareStatement(sql);// 传入参数是一个数组,for循环--params[i - 1]这里遍历一个params数组得到所有的参数for (int i = 1; i <= params.length; i++) {preparedStatement.setObject(i, params[i - 1]);System.out.println(params[i - 1]);}return preparedStatement.executeUpdate() > 0;} catch (Exception e) {logger.debug(e.getMessage(),e);} finally {close(preparedStatement, connection);}return false;}/*** 数据库查询操作--方法重载,防止SQL注入** @author 刘莹*/public static void query(String sql, IRowMapper rowMapper, Object... params) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {connection = getConnection();preparedStatement = connection.prepareStatement(sql);for (int i = 1; i <= params.length; i++) {preparedStatement.setObject(i, params[i - 1]);}resultSet = preparedStatement.executeQuery();rowMapper.rowMapper(resultSet);} catch (Exception e) {logger.debug(e.getMessage(),e);} finally {close(resultSet, preparedStatement, connection);}}/*** 释放资源** @author 刘莹*/private static void close(Statement statement, Connection connection) {try {if (statement != null) {statement.close();}} catch (SQLException e1) {e1.printStackTrace();}try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 释放资源 方法的重载** @author 刘莹*/private static void close(ResultSet resultSet, Statement statement, Connection connection) {try {if (resultSet != null) {resultSet.close();}} catch (SQLException e) {logger.debug(e.getMessage(),e);}close(statement, connection);}}

为了更加便于使用,将之前封装jdbc增删改(update)查(query)的普通方法和防注入方法抽取到一个工具类DButil中,如果想要使用增删改查的功能,就可以直接通过DBUtil这个工具类来调用。提高代码的复用性。

6.IRowMapper 接口

import java.sql.ResultSet;public interface IRowMapper {void rowMapper(ResultSet rs);
}

定义一个接口,利用Java多态的特征------使用内部类和接口回调的方式在ResultSet对象关闭之前调用他的next方法并对数据库执行查询操作

7.PublisherManager类

import java.sql.ResultSet;
import java.util.Scanner;
import com.jd.util.DButil;
import com.jd.util.IRowMapper;
import com.jd.util.StringUtil;public class PublisherManager {static Scanner scan = new Scanner(System.in);static Publisher pub = new Publisher();/*** 出版社管理** @author 刘莹*/public static void pManager() {System.out.println("请输入出版社管理操作:");System.out.println("1.添加出版社信息");System.out.println("2.删除出版社信息");System.out.println("3.修改出版社信息");System.out.println("4.查询出版社信息");System.out.println("请输入操作,按enter键结束");int option = scan.nextInt();switch (option) {case 1:pInsert();break;case 2:pDelete();break;case 3:pUpdate();break;case 4:pSelect();break;default:System.out.println("Sorry,there is not the " + option + " option,请重新输入选择:");break;}}/*** 添加出版社信息** @author 刘莹*/public static void pInsert() {String id = StringUtil.getId();System.out.println("请输入要添加的出版社的名字");String name = scan.next();if (new PublisherManager().exit(name)) { // 判断出版社是否存在System.out.println("出版社名字不允许重复,无法添加,操作停止");return;}System.out.println("请输入要添加的出版社的地址");String address = scan.next();String sql = "insert into publisher (id,name,address) values (?,?,?)";if (DButil.update(sql, id, name, address)) {System.out.println("添加信息成功");return;}System.out.println("系统错误,添加信息失败");}/*** 删除出版社信息** @author 刘莹*/public static void pDelete() {System.out.println("请输入要删除的出版社的名字");String name = scan.next();if (!new PublisherManager().exit(name)) { // 判断出版社是否存在,不存在没办法删除System.out.println("出版社名字不存在,无法删除,操作停止");return;}String sql = "delete from publisher where name=?";if (DButil.update(sql, name)) {System.out.println("删除信息成功");return;} else {System.out.println("系统错误,删除信息失败");}}/*** 修改出版社信息** @author 刘莹*/public static void pUpdate() {System.out.println("请输入要修改的出版社的名字:");String name = scan.next();if (!new PublisherManager().exit(name)) { // 判断出版社是否存在,不存在没办法修改System.out.println("出版社名字不存在,无法修改,操作停止");return;}System.out.println("请输入修改后出版社的名字:");String rename = scan.next();System.out.println("请输入修改后出版社的地址");String address = scan.next();String sql = "update publisher set name=?,address=? where name=?";if (DButil.update(sql, rename, address, name)) {System.out.println("修改信息成功");return;} else {System.out.println("系统错误,修改信息失败");}System.out.println(sql);}/*** 查找出版社信息** @author 刘莹*/public static void pSelect() {System.out.println("请输入要查找的出版社的名字:");String name = scan.next();String sql = "select * from publisher where name=?";// RowMapper类实现IRowMapper接口class RowMapper implements IRowMapper {// 重写IRowMapper接口中的rowMapper方法@Overridepublic void rowMapper(ResultSet rs) {try {// 对数据库中的数据逐条查询if (rs.next()) { // 因为出版社名字具有唯一性// 根据不同的表的列名可以在getString// 对于不同的表可以在getString方法中传入不同的参数String id = rs.getString("id");String name = rs.getString("name");String address = rs.getString("address");System.out.println("查询信息成功,信息为:");System.out.println("出版社id为:" + id + ",出版社名字为:" + name + ",出版社地址为:" + address);return;} else {System.out.println("出版社不存在");}} catch (Exception e) {e.printStackTrace();}}}// 创建RowMapper对象RowMapper rowMapper = new RowMapper();DButil.query(sql, rowMapper, name);}/*** 根据名字判断出版社是否存在** @author 刘莹*/public boolean exit(String name) {return getId(name) != null;}/*** 获取出版社id** @author 刘莹*/public String getId(String name) {String sql = "select id from publisher where name=?";class RowMapper implements IRowMapper {String id;@Overridepublic void rowMapper(ResultSet rs) {try {if (rs.next()) {id = rs.getString("id");}} catch (Exception e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();DButil.query(sql, rowMapper, name); // 防注入,回调return rowMapper.id;}/*** 展示出出版社所有的信息** @author 刘莹*/public static void show() {System.out.println("展示出版社所有的信息:");String sql = "select * from publisher";class RowMapper implements IRowMapper {@Overridepublic void rowMapper(ResultSet rs) {try {while (rs.next()) {String id = rs.getString("id");String name = rs.getString("name");String address = rs.getString("address");System.out.println(id + "," + name + "," + address);}} catch (Exception e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();DButil.query(sql, rowMapper);}}

定义一个PublisherManager类,完成出版社管理的具体功能:对出版社信息的增删改查,获取出版社id、判断出版社是否存在、展示出出版社所有的信息这几个方法进行封装,便于调用,提高代码的复用性和可读性

8.BookManager类

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import com.jd.util.DButil;
import com.jd.util.IRowMapper;
import com.jd.util.StringUtil;public class BookManager {static Scanner scan = new Scanner(System.in);static Book book = new Book();/*** 书籍管理功能界面** @author 刘莹*/public static void bManager() {System.out.println("请输入图书管理操作:");System.out.println("1、添加书籍信息");System.out.println("2、删除书籍信息");System.out.println("3、修改书籍信息");System.out.println("4、查询书籍信息");int option = scan.nextInt();switch (option) {case 1:bInsert();break;case 2:bDelete();break;case 3:bUpdate();break;case 4:{System.out.println("请选择查询方式:");System.out.println("1.根据书名罗列查询");System.out.println("2.根据ISBN唯一查询");option = scan.nextInt();switch (option) {case 1:bSelect();break;case 2:bQuery();break;default:System.out.println("Sorry,there is not the" + option + "option,请重新输入选择查询方式:");break;}break;}default:System.out.println("Sorry,there is not the" + option + "option,请重新输入选择操作:");break;}}/*** 添加书籍信息** @author 刘莹*/public static void bInsert() {System.out.println("请输入要添加的书籍的条形编码:");String isbn = scan.next();// 判断ISBN是否存在if (exit(isbn)) {System.out.println("ISBN不允许重复,无法添加,操作停止");return;}System.out.println("请输入要添加的书籍的名字:");String name = scan.next();// 调用util工具类中的StringUtil类获取36位系统自动生成的UUID组成的id号String id = StringUtil.getId();// 将出版社的所有信息展示出来PublisherManager.show();System.out.println("请选择书籍所属的出版社名字:");String pName = scan.next();if (!new PublisherManager().exit(pName)) {System.out.println("您输入的出版社名字错误,停止操作");return;}// 如果选择的出版社存在,根据出版社名字获取出版社idString pId = new PublisherManager().getId(pName);// 添加book数据库表信息String sql = "insert into book (id,isbn,name,publisher_id) values (?,?,?,?)";if (DButil.update(sql, id, isbn, name, pId)) {System.out.println("添加信息成功");return;} else {System.out.println("系统错误,添加信息失败");}}/*** 删除书籍信息** @author 刘莹*/public static void bDelete() {System.out.println("请输入要删除书籍ISBN:");String isbn = scan.next();// 判断ISBN是否存在if (!exit(isbn)) {System.out.println("ISBN不存在,无法删除,操作停止");return;}String sql = "delete from book where isbn=?";if (DButil.update(sql, isbn)) {System.out.println("删除成功!");} else {System.out.println("系统错误,删除失败!");}}/*** 修改书籍信息** @author 刘莹*/public static void bUpdate() {System.out.println("请输入要修改书籍的ISBN:");String isbn = scan.next();// 判断ISBN是否存在if (!exit(isbn)) {System.out.println("ISBN不存在,无法修改,操作停止");return;}System.out.println("请输入修改后的书籍的名字:");String rename = scan.next();System.out.println("请输入修改后的书籍的条形编码:");String reIsbn = scan.next();if (exit(reIsbn)) {System.out.println("ISBN已经存在,因为不允许重复所有无法修改,操作停止");return;}// 将出版社的所有信息展示出来PublisherManager.show();System.out.println("请输入修改后书籍所属的出版社名字:");String pName = scan.next();// 判断手动输入的出版社是否存在if (!new PublisherManager().exit(pName)) {System.out.println("您输入的出版社名字错误,停止操作");return;}// 如果选择的出版社存在,根据出版社名字获取出版社idString pId = new PublisherManager().getId(pName);String sql = "update book set name=?,isbn=?,publisher_id=? where isbn=?";if (DButil.update(sql, rename, reIsbn, pId, isbn)) {System.out.println("修改成功!");return;} else {System.out.println("系统错误,修改失败!");}}/*** 查找书籍信息  可以查多个** @author 刘莹*/public static void bSelect() {System.out.println("请输入要查询的书籍的名字:");String name = scan.next();String sql = "select b.id,b.isbn,b.name book_name,p.name publisher_name,p.address " + " from book b "+ " inner join publisher p on p.id=b.publisher_id " + " where b.name like '%"+name +"%'";System.out.println(sql);class RowMapper implements IRowMapper {@Overridepublic void rowMapper(ResultSet rs) {try {while (rs.next()) {String id = rs.getString("id");String isbn = rs.getString("isbn");String bookName = rs.getString("book_name");String publisherName = rs.getString("publisher_name");System.out.println("查询信息成功,信息为:");System.out.println("书籍id为:" + id + "书籍编码" + isbn + ",书籍名字为:" + bookName + ",出版社名字为:" + publisherName);                     }} catch (SQLException e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();DButil.query(sql, rowMapper);}/*** 根据ISBN查询 唯一性** @author 刘莹*/public static void bQuery() {System.out.println("请输入要查询的书籍的ISBN:");String ISBN= scan.next();String sql = "select * from book where isbn=?";class RowMapper implements IRowMapper {            @Overridepublic void rowMapper(ResultSet rs) {try {if (rs.next()) {String id = rs.getString("id");String isbn = rs.getString("isbn");String bookName = rs.getString("name");System.out.println("查询信息成功,信息为:");System.out.println("书籍id为:" + id + "书籍编码" + isbn + ",书籍名字为:" + bookName );return;} } catch (SQLException e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();DButil.query(sql, rowMapper,ISBN);      }/*** 根据ISBN的唯一性判断图书是否存在** @author 刘莹*/public static boolean exit(String isbn) {String sql = "select id from book where isbn= ? ";class RowMapper implements IRowMapper {boolean state;@Overridepublic void rowMapper(ResultSet rs) {try {if (rs.next()) {state = true;}} catch (Exception e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();DButil.query(sql, rowMapper, isbn);return rowMapper.state;}
}

定义一个BookManager类,完成书籍管理的具体功能:对书籍信息的增删改查,封装查找书籍信息(可以查多个,使用内连接)、根据ISBN查询(唯一性)、根据ISBN的唯一性判断图书是否存在-这几个方法进行封装,便于调用,提高代码的复用性和可读性。

9.StringUtil类

import java.util.UUID;public class StringUtil {//36位系统自动生成的UUID组成的id号public static String getId() {return UUID.randomUUID().toString();}
}

由于出版社id和书籍id都是通过UUID获取到的36位字符串,所以可以将其封装成一个StringUtil工具类,供给出版社管理和书籍管理使用,提高代码的复用性和可读性。

10.Client类

import java.util.Scanner;public class Client {static Scanner scan = new Scanner(System.in);static Publisher pub = new Publisher();static Book book = new Book();public static void menu() {while (true) {System.out.println("欢迎进入书籍管理系统");System.out.println("1.出版社管理");System.out.println("2.书籍管理");System.out.println("否则,退出系统");System.out.println("请输入操作,按enter键结束");int option = scan.nextInt();switch (option) {case 1:PublisherManager.pManager();break;case 2:BookManager.bManager();break;default:System.out.println("Sorry,there is not the" + option + "option");System.exit(0);// 退出系统}}}public static void main(String[] args) {menu();}
}

完成整体的客户端功能页面。

出版社--图书管理系统相关推荐

  1. java出版社系统_图书管理系统java版

    本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出版日期.书号.价格字段. ...

  2. c语言课程设计北京电子工业出版社,c语言图书管理系统课程设计报告

    c语言图书管理系统课程设计报告 五.小节: 在这一个星期的实践中,通过编写这个图书管理系统,我体会到了c语言学习的实用性.将理论和实践结合在一起,用先进的计算机工具方便人们的生活.C语言程序的编写首先 ...

  3. s1考试 图书管理系统 结构体版

    #include <iostream> #include <string> #include <cstdio> #include <cstdlib> # ...

  4. 图书管理系统之外键的增删改查

    ---恢复内容开始--- 1,图书管理系统的表结构设计 1.1>id,titlev,出版社_id 1.2>ORM外键:press = models.ForignKey(to="P ...

  5. Django(part39)--制作图书管理系统

    学习笔记,仅供参考,有错必究 文章目录 制作图书管理系统 第一步 第二步 第三步 制作图书管理系统 我们基于上一个博客Django(part38)–制作登录界面的mywebsite_bookstore ...

  6. 计算机教务管理系统ER图,图书管理系统er图 [2].doc

    实验项目三:MIS的数据组织与管理 *****系统组 实验课程:管理信息系统实验 实验项目:MIS的数据组织与管理 项目组名: 所在学院:***学院 所在班级:**** 指导老师:李红霞 小组成员: ...

  7. Java—简单的图书管理系统

    简单的图书管理系统 通过数据源和DAO对象访问数据库.其中JavaBeans实现模型,访问数据库,Servlet实现控制器,JSP页面实现视图. • 模型包括2个JavaBean:BookBean用于 ...

  8. c语言小项目-使用mysql数据库的图书管理系统

    VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装 ...

  9. 基于python的图书管理系统测试步骤_Django admin实现图书管理系统菜鸟级教程完整实例...

    Django 有着强大而又及其易用的admin后台,在这里,你可以轻松实现复杂代码实现的功能,如搜索,筛选,分页,题目可编辑,多选框. 简单到,一行代码就可以实现一个功能,而且模块之间耦合得相当完美. ...

最新文章

  1. NameNode任务线程之FSNamesystem$ReplicationMonitor
  2. Sql语句里的递归查询
  3. 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
  4. Hadoop 05_MapReduce1.0
  5. 牛客挑战赛48C-铬合金之声【Prufer序列】
  6. 领域应用 | NLP 和知识图谱:金融科技领域的“双子星”
  7. DirectX9:总结篇 异常错误检测
  8. python爬取学校题库_Python爬虫面试题
  9. 【weka】Use weka in your java code
  10. Facebook股价周四大涨15.5% 市值超亚马逊
  11. error: ‘PRIO_PROCESS’ undeclared
  12. php获取客户端IP
  13. E php短信平台接口
  14. 医院时钟系统(网络授时设备)设计方案
  15. 80老翁谈人生(38):火星存在两万城市遗迹纯属杜撰!
  16. linux 常用文本处理工具
  17. 如果你狂按F2,F12,DEL也进不了BIOS怎么办?
  18. 第一章 kotlin基础知识
  19. 关于IOS的学习(wxhl)曾海明
  20. 这样做框架结构图,让你的PPT更有创意!

热门文章

  1. 头寸是什么意思之如何建立自己的头寸?
  2. 艾司博讯:拼多多拼单不想要了怎么退
  3. linux下u盘病毒msdos,手杀U盘中ms-dos.com病毒
  4. 中山大学计算机考研专业课考什么,2017年中山大学0812计算机科学与技术考研专业目录及考试科目...
  5. 穷爸爸富爸爸 读后感
  6. java初级工程师面试需要什么_初级Java工程师面试指导
  7. Android怎么自定义充电铃声,充电提示音怎么设置
  8. 小车自动往返工作原理_小车自动往返.ppt
  9. 架构 对话架构师:亿级短视频社交美拍架构实战
  10. Android子系统