1.需求

已知如下两个表:
publisher id name(唯一) address
book id isbn name publisher_id
欢迎进入书籍管理系统
1.出版社管理:增、删(name)、改(name)、查(name)
2.书籍管理:增、删(name)、改(name)、查(name)
3.退出
1
2
3
4
5
6
7
2.log4j.properties 为什么
3.db.properties 为什么
4.PropertiesUtil
5.DBUtil
6.IRowMapper
7.PublisherManager
8.BookManager
9.Client
一.首先在mysql数据库软件中建立如下两个表

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
4
5
6
7
8
9
10
11
12
关于SQL语句中约束的知识在下面博客中提及过
https://blog.csdn.net/qq_44724446/article/details/90027794
https://blog.csdn.net/qq_44724446/article/details/90031272
log4j为什么用如何配置,查看
https://blog.csdn.net/qq_44724446/article/details/90044781
properties为什么用,如何配置,java代码的实现-封装的工具类PropertiesUtil查看
https://blog.csdn.net/qq_44724446/article/details/90048065
DBUtil和IRowMapper查看
https://blog.csdn.net/qq_44724446/article/details/89918464
当时未考虑到SQL注入的情况,所以补充代码,引入PreparedStatement接口的概念,

//关于防止sql注入的步骤参考如下
http://www.cnblogs.com/flei/p/6727520.html
1
2
创建36位UUID的工具类

import java.util.UUID;
public class StringUtil {
public static String getId() {
return UUID.randomUUID().toString();
}
}

1
2
3
4
5
6
7
创建用于出版社系统实现增删改查的封装类

import java.sql.ResultSet;
import java.util.Scanner;
public class PublisherManager {
static Scanner sc= new Scanner(System.in);
/**
* 出版社管理
*/
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 = sc.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;
}
}

/**
* 添加出版社信息
*/
public static void pInsert() {

String id = StringUtil.getId();
System.out.println("请输入要添加的出版社的名字");
String name = sc.next();
if (new PublisherManager().exit(name)) { // 判断出版社是否存在
System.out.println("出版社名字不允许重复,无法添加,操作停止");
return;
}
System.out.println("请输入要添加的出版社的地址");
String address = sc.next();
String sql = "insert into publisher (id,name,address) values (?,?,?)";
if (DButil.upDate(sql, id, name, address)) {
System.out.println("添加信息成功");
return;
}
System.out.println("系统错误,添加信息失败");

}

/**
* 删除出版社信息
*/
public static void pDelete() {
System.out.println("请输入要删除的出版社的名字");
String name = sc.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("系统错误,删除信息失败");
}
}
/**
* 修改出版社信息
*/
public static void pUpdate() {
System.out.println("请输入要修改的出版社的名字:");
String name = sc.next();
if (!new PublisherManager().exit(name)) { // 判断出版社是否存在,不存在没办法修改
System.out.println("出版社名字不存在,无法修改,操作停止");
return;
}
System.out.println("请输入修改后出版社的名字:");
String rename = sc.next();
System.out.println("请输入修改后出版社的地址");
String address = sc.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);
}

/**
* 查找出版社信息
*/
public static void pSelect() {
System.out.println("请输入要查找的出版社的名字:");
String name = sc.next();
String sql = "select * from publisher where name=?";
// RowMapper类实现IRowMapper接口
class RowMapper implements IRowMapper {
// 重写IRowMapper接口中的rowMapper方法
@Override
public 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.sel(rowMapper,sql , name);
}

/**
* 根据名字判断出版社是否存在
*/
public boolean exit(String name) {
return getId(name) != null;
}

/**
* 获取出版社id
*/
public String getId(String name) {
String sql = "select id from publisher where name=?";
class RowMapper implements IRowMapper {
String id;
@Override
public void rowMapper(ResultSet rs) {
try {
if (rs.next()) {
id = rs.getString("id");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
DButil.sel(rowMapper, sql, name); // 防注入,回调
return rowMapper.id;
}
/**
* 展示出出版社所有的信息
*/
public static void show() {
System.out.println("展示出版社所有的信息:");
String sql = "select * from publisher";
class RowMapper implements IRowMapper {
@Override
public 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.sel(rowMapper, sql);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
创建用于书籍系统实现增删改查的封装类
注意外键约束

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class BookManager {

static Scanner sc = new Scanner(System.in);
/**
* 书籍管理功能界面
*/
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 = sc.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 = sc.nextInt();
switch (option) {
case 1:
bSelect();
break;
case 2:
bQuery();
break;
default:
System.out.println("无效操作,请重新输入选择查询方式:");
break;
}
break;
}
default:
System.out.println("无效操作");
break;
}
}

/**
* 添加书籍信息
*/
public static void bInsert() {
System.out.println("请输入要添加的书籍的条形编码:");
String isbn = sc.next();
// 判断ISBN是否存在
if (exit(isbn)) {
System.out.println("ISBN不允许重复,无法添加,操作停止");
return;
}
System.out.println("请输入要添加的书籍的名字:");
String name = sc.next();
// 调用util工具类中的StringUtil类获取36位系统自动生成的UUID组成的id号
String id = StringUtil.getId();
// 将出版社的所有信息展示出来
PublisherManager.show();
System.out.println("请选择书籍所属的出版社名字:");
String pName = sc.next();
if (!new PublisherManager().exit(pName)) {
System.out.println("您输入的出版社名字错误,停止操作");
return;
}
// 如果选择的出版社存在,根据出版社名字获取出版社id
String 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("系统错误,添加信息失败");
}
}
/**
* 删除书籍信息
*/
public static void bDelete() {
System.out.println("请输入要删除书籍ISBN:");
String isbn = sc.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("系统错误,删除失败!");
}
}
/**
* 修改书籍信息
*/
public static void bUpdate() {
System.out.println("请输入要修改书籍的ISBN:");
String isbn = sc.next();
// 判断ISBN是否存在
if (!exit(isbn)) {
System.out.println("ISBN不存在,无法修改,操作停止");
return;
}
System.out.println("请输入修改后的书籍的名字:");
String rename = sc.next();
System.out.println("请输入修改后的书籍的条形编码:");
String reIsbn = sc.next();
if (exit(reIsbn)) {
System.out.println("ISBN已经存在,因为不允许重复所有无法修改,操作停止");
return;
}
// 将出版社的所有信息展示出来
PublisherManager.show();
System.out.println("请输入修改后书籍所属的出版社名字:");
String pName = sc.next();
// 判断手动输入的出版社是否存在
if (!new PublisherManager().exit(pName)) {
System.out.println("您输入的出版社名字错误,停止操作");
return;
}
// 如果选择的出版社存在,根据出版社名字获取出版社id
String 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("系统错误,修改失败!");
}
}
/**
* 查找书籍信息 可以查多个
*/
public static void bSelect() {
System.out.println("请输入要查询的书籍的名字:");
String name = sc.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 {
@Override
public 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.sel(rowMapper,sql );
}
/**
* 根据ISBN查询 唯一性
*/
public static void bQuery() {
System.out.println("请输入要查询的书籍的ISBN:");
String ISBN= sc.next();
String sql = "select * from book where isbn=?";
class RowMapper implements IRowMapper {
@Override
public 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.sel(rowMapper, sql,ISBN);
}
/**
* 根据ISBN的唯一性判断图书是否存在
*/
public static boolean exit(String isbn) {
String sql = "select id from book where isbn= ? ";
class RowMapper implements IRowMapper {
boolean state;
@Override
public void rowMapper(ResultSet rs) {
try {
if (rs.next()) {
state = true;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
DButil.sel(rowMapper,sql , isbn);
return rowMapper.state;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
创建系统的主方法

import java.util.Scanner;
public class Client {
static Scanner sc = new Scanner(System.in);
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 = sc.nextInt();
switch (option) {
case 1:
PublisherManager.pManager();
break;
case 2:
BookManager.bManager();
break;
default:
System.out.println("系统结束");
System.exit(0);// 退出系统
}
}
}
public static void main(String[] args) {
menu();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

05-11 20:07