已知如下两个表:
publisher:id、name(唯一)、address
book:id、isbn、name(唯一)、publisher_id
实现如下功能:
欢迎进入书籍管理系统
1、出版社管理:增、删(name)、改(name)、查(name)
2、书籍管理:增、删(name)、改(name)、查(name)
3、退出
//创建publisher表
CREATE TABLE `publisher` (
`id` char(36) NOT NULL,
`name` varchar(16) NOT NULL,
`address` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//创建book表
CREATE TABLE `book` (
`id` char(36) NOT NULL,
`name` varchar(16) NOT NULL,
`isbn` char(11) NOT NULL,
`publisher_id` char(36) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
UNIQUE KEY `isbn` (`isbn`),
KEY `publisher_id` (`publisher_id`),
CONSTRAINT `book_ibfk_1` FOREIGN KEY (`publisher_id`) REFERENCES `publisher` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
因为在控制台打印的信息有限,所以需要把相关的日志文件保存在一个日志文件中,便于查找问题。导入log4j的jar包并配置log4j.properties。
# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,Console,RollingFile
#将日志信息输出到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= [%-5p]-[%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n
#将日志信息输出到操作系统D盘根目录下的log.log文件中
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=D://log.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
使用JDBC连接数据库的时候有时候需要修改连接的配置信息,如果每次修改都更改源代码不利于项目的维护,所以这里是使用db.properties文件把JDBC的配置信息保存在其中。
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=0314
上面已经把数据库的相关配置信息保存在了db.properties文件中。然后再使用一个PropertiesUtil类读取db.properties文件。
/**
* 获取db.properties文件的工具类
*
* @author Administrator
*/
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();
}
}
/**
* 依据key获取value值
*
* @author Administrator
*/
public String getValue(String key) {
return properties.getProperty(key);
}
}
在上面已经获得了数据库连接的配置信息,创建一个DBUtil类来对数据库进行增删改查。
/**
* 数据库工具类
*
* @author Administrator
*/
public class DBUtil {
private static Logger logger = Logger.getLogger(DBUtil.class);
static Connection connection = null;
static Statement statement = null;
static ResultSet result = null;
static PreparedStatement pStatement = null;
/**
* 加载驱动
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
logger.debug(e.getMessage(), e);
}
}
/**
* 获取连接
*
* @author Administrator
*/
private static Connection getConnection() {
try {
PropertiesUtil pUtil = new PropertiesUtil();
String url = pUtil.getValue("jdbc.url");
String username = pUtil.getValue("jdbc.username");
String password = pUtil.getValue("jdbc.password");
return DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
logger.debug(e.getMessage(), e);
}
return null;
}
/**
* 数据查询(无法防止SQL注入)
*
* @author Administrator
*/
public static void select(String sql, IRowMapper rowMapper) {
try {
connection = getConnection();
statement = connection.createStatement();
result = statement.executeQuery(sql);
rowMapper.rowMapper(result);
} catch (Exception e) {
logger.debug(e.getMessage(), e);
}finally {
close(result, statement, connection);
}
}
/**
* 数据查询(防止 SQL注入)
*
* @author Administrator
*/
public static void select(String sql, IRowMapper rowMapper, Object ... params) {
try {
connection = getConnection();
pStatement = connection.prepareStatement(sql);
for (int i = 1; i <= params.length; i++) {
pStatement.setObject(i, params[i-1]);
}
result = pStatement.executeQuery();
rowMapper.rowMapper(result);
} catch (Exception e) {
logger.debug(e.getMessage(), e);
}finally {
close(result, pStatement, connection);
}
}
/**
* 数据修改(无法防止SQL注入)
*
* @author Administrator
*/
public static boolean update(String sql) {
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;
}
/**
* 数据查询(可以防止SQL注入)
*
* @author Administrator
*/
public static boolean update(String sql,Object ... params) {
try {
connection = getConnection();
pStatement = connection.prepareStatement(sql);
for (int i = 1; i <= params.length; i++) {
pStatement.setObject(i, params[i-1]);
}
return pStatement.executeUpdate() > 0;
} catch (Exception e) {
logger.debug(e.getMessage(), e);
}finally {
close(pStatement, connection);
}
return false;
}
/**
* JDBC实现事务处理
*
* @author Administrator
*/
public static void transaction(String ...strings ) {
try {
connection = getConnection();
connection.setAutoCommit(false);
statement = connection.createStatement();
for (String string : strings) {
statement.addBatch(string);
}
statement.executeBatch();
connection.commit();
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
close(statement, connection);
}
}
/**
* 关闭资源
*
* @author Administrator
*/
private static void close(Statement statement, Connection connection) {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
logger.debug(e.getMessage(), e);
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
logger.debug(e.getMessage(), e);
}
}
/**
* 关闭资源
*
* @author Administrator
*/
private static void close(ResultSet result, Statement statement, Connection connection) {
try {
if (result != null) {
result.close();
result = null;
}
} catch (SQLException e) {
logger.debug(e.getMessage(), e);
}
close(statement, connection);
}
}
/**
* 实现JDBC查询数据库的接口
*
* @author Administrator
*/
public interface IRowMapper{
void rowMapper(ResultSet res);
}
出版社管理模块具体代码实现:
/**
* 出版社管理模块
*
* @author Administrator
*/
public class PublisherManage {
public static void menu() {
System.out.println("1、添加出版社信息");
System.out.println("2、删除出版社信息");
System.out.println("3、修改出版社信息");
System.out.println("4、查询出版社信息");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int option = scanner.nextInt();
switch (option) {
case 1:{
addPulisher();
break;
}
case 2:{
deletePublisher();
break;
}
case 3:{
updatePublisher();
break;
}
case 4:{
queryPublisher();
break;
}
default:
System.out.println("对不起,没有该选项,请重新输入......");
break;
}
}
/**
* 添加出版社信息
*
* @author Administrator
*/
public static void addPulisher() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入出版社名字:");
String name = scanner.next();
String sql = "select id from publisher where name=?";
if (ClientManage.exist(sql,name)) {
System.out.println("系统中已经有该出版社");
return;
} else {
System.out.println("请输入出版社地址:");
String address = scanner.next();
String id = UUID.randomUUID().toString();
sql = "insert into publisher(id,name,address) values(?,?,?)";
if (DBUtil.update(sql,id,name,address)) {
System.out.println("添加成功!");
return;
}
}
System.out.println("添加失败!");
}
/**
* 根据name删除出版社信息
*
* @author Administrator
*/
public static void deletePublisher() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的出版社名字:");
String name = scanner.next();
String sql = "select id from publisher where name=?";
if (!ClientManage.exist(sql,name)) {
System.out.println("系统中没有该出版社");
return;
}else {
sql = "delete from publisher where name=?";
if (DBUtil.update(sql,name)) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}
}
/**
* 根据name修改出版社信息
*
* @author Administrator
*/
public static void updatePublisher() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要修改出版社的名字:");
String name = scanner.next();
String sql = "select * from publisher where name=?";
if (ClientManage.getId(sql,name)==null) {
System.out.println("系统中没有该出版社");
return;
} else {
String id = ClientManage.getId(sql,name);
System.out.println("请输入新名字:");
name = scanner.next();
System.out.println("请输入新地址:");
String address = scanner.next();
sql = "update publisher set name=?,address=? where id=?";
if (DBUtil.update(sql,name,address,id)) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
}
}
/**
* 查询出版社信息
*
* @author Administrator
*/
public static void queryPublisher() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的出版社的名字:");
String name = scanner.next();
String sql = "select * from publisher where name=?";
class RowMapper implements IRowMapper{
@Override
public void rowMapper(ResultSet res) {
try {
if (res.next()) {
String id = res.getString("id");
String name = res.getString("name");
String address = res.getString("address");
Publisher publisher = new Publisher(id,name,address);
System.out.println(publisher);
}else {
System.out.println("系统中没有该出版社!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
DBUtil.select(sql, rowMapper,name);
}
}
书籍管理模块具体代码实现:
/**
* 书籍管理模块
*
* @author Administrator
*/
public class BookManage {
public static void menu() {
System.out.println("1、添加书籍信息");
System.out.println("2、删除书籍信息");
System.out.println("3、修改书籍信息");
System.out.println("4、查询书籍信息");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int option2 = scanner.nextInt();
switch (option2) {
case 1:{
addBook();
break;
}
case 2:{
deleteBook();
break;
}
case 3:{
updateBook();
break;
}
case 4:{
queryBook();
break;
}
default:
System.out.println("对不起,没有该选项,请重新输入......");
break;
}
}
/**
* 添加书籍信息
*
* @author Administrator
*/
public static void addBook() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书籍名字:");
String name = scanner.next();
String sql = "select id from book where name=?";
if (ClientManage.getId(sql, name)!=null) {
System.out.println("系统中已经有该书籍");
} else {
String publisherId;
String id = UUID.randomUUID().toString();
System.out.println("请输入ISBN:");
String isbn = scanner.next();
System.out.println("请输入书籍所属的出版社:");
String publisherName = scanner.next();
sql = "select * from publisher where name=?";
if (ClientManage.getId(sql, publisherName)!=null) {
publisherId = ClientManage.getId(sql, publisherName);
} else {
System.out.println("系统中没有该出版社,请先添加");
return;
}
sql = "insert into book(id,name,isbn,publisher_id) values(?,?,?,?)";
if (DBUtil.update(sql,id,name,isbn,publisherId)) {
System.out.println("添加成功!");
}else {
System.out.println("添加失败");
}
}
}
/**
* 根据name删除书籍信息
*
* @author Administrator
*/
public static void deleteBook() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的书籍名字:");
String name = scanner.next();
String sql = "select * from book where name=?";
if (!ClientManage.exist(sql, name)) {
System.out.println("系统中没有该书籍");
} else {
sql = "delete from book where name=?";
if (DBUtil.update(sql,name)) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}
}
/**
* 根据name修改书籍信息
*
* @author Administrator
*/
public static void updateBook() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要修改书籍的名字:");
String name = scanner.next();
String sql = "select id from book where name=?";
if (ClientManage.getId(sql, name)==null) {
System.out.println("系统中没有该书籍");
return;
} else {
String id = ClientManage.getId(sql, name);
String publisherId = null;
System.out.println("请输入新名字:");
name = scanner.next();
System.out.println("请输入新ISBN:");
String isbn = scanner.next();
System.out.println("请输入新的出版社名字:");
String publisherName = scanner.next();
sql = "select * from publisher where name=?";
if (ClientManage.getId(sql, publisherName)!=null) {
publisherId = ClientManage.getId(sql, publisherName);
} else {
System.out.println("系统中没有该出版社,请先添加");
return;
}
sql = "update book set name=?,isbn=?,publisher_id=? where id=?";
if (DBUtil.update(sql,name,isbn,publisherId,id)) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
}
}
/**
* 查询书籍信息
*
* @author Administrator
*/
public static void queryBook() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的书籍的名字:");
String name = scanner.next();
String sql = "select * from book where name=?";
class RowMapper implements IRowMapper{
List list = new ArrayList<>();
@Override
public void rowMapper(ResultSet res) {
try {
if(res.next()) {
String id = res.getString("id");
String name = res.getString("name");
String isbn = res.getString("isbn");
String publisherId = res.getString("publisher_id");
Book book = new Book(id, name, isbn, publisherId);
list.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
DBUtil.select(sql, rowMapper, name);
List list = rowMapper.list;
for (Book book : list) {
String id = book.getId();
String isbn = book.getIsbn();
String publisherId = book.getPublisherId();
sql = "select name from publisher where id=?";
String publisherName = ClientManage.getName(sql, publisherId);
System.out.println(id+" ,"+name+" ,"+isbn+" ,"+publisherName);
return;
}
System.out.println("系统中没有该书籍!");
}
}
简单的管理界面
public class ClientManage {
public static void main(String[] args) {
print();
while (true) {
menu();
}
}
private static void print() {
System.out.println("*********************************");
System.out.println("*\t\t\t\t\t\t*");
System.out.println("*\t欢迎进入书籍管理系统\t\t*");
System.out.println("*\t\t\t\t\t\t*");
System.out.println("*********************************");
}
private static void menu() {
System.out.println("1、出版社管理");
System.out.println("2、书籍管理");
System.out.println("3、退出");
System.out.println("请输入操作,按Enter键结束...");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int option = scanner.nextInt();
switch (option) {
case 1:
PublisherManage.menu();
break;
case 2:
BookManage.menu();
break;
case 3:
System.exit(0);
break;
default:
System.out.println("对不起,没有该选项,请重新输入......");
}
}
/**
* 根据name判断出版社(书籍)是否存在
*
* @author Administrator
*/
public static boolean exist(String sql, String name) {
return getId(sql, name)!=null;
}
/**
* 根据name查询id
*
* @author Administrator
*/
public static String getId(String sql, String name) {
class RowMapper implements IRowMapper{
String id = null;
@Override
public void rowMapper(ResultSet res) {
try {
if (res.next()) {
id = res.getString("id");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
DBUtil.select(sql, rowMapper,name);
return rowMapper.id;
}
/**
* 根据id查询name
*
* @author Administrator
*/
public static String getName(String sql, String id) {
class RowMapper implements IRowMapper{
String name = null;
@Override
public void rowMapper(ResultSet res) {
try {
if (res.next()) {
name = res.getString("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
DBUtil.select(sql, rowMapper,id);
return rowMapper.name;
}
}