进阶3——增删改查操作使用文件相互调用版

趁热打铁,继续学习JDBC,今天早上找了个例子
http://outofmemory.cn/code-snippet/16682/control-project-to-data-library-to
把增删改查的操作在一个例子里面调通了,记录下注意事项:

1.在eclipse中新建三个文件

文件1:Test.java(这个是个主文件)
文件2:Handle.java(Test里面会调用Handle)
文件3:TestConnection.java(Handle里面会调用TestConnection)
image.png
注意:类名和文件名必须保持一致!
代码是根据链接代码修改排除package和import之类问题的代码:

Test.java

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
package database_20;

import java.util.Scanner;
/**
* 测试类
* @author Administrator
*
*/
public class Test {
private static Scanner sc;

public static void main(String[] args) {

System.out.println("欢迎光临:");
//输出选项
System.out.println("1:查询 2:更新 3:插入 4:删除 5:退出");
System.out.println("你想干什么? 请选择:");
sc = new Scanner(System.in);
//实例化数据操作类Handle
Handle hd = new Handle();

int type = sc.nextInt();
/**
* 判断用户选择操作的项
*/
switch(type){
case 1:
//调用Handle查询方法
hd.query();
System.out.println("查询完成!");

break;
case 2:
//更新
hd.update();
System.out.println("更新完成!");

break;
case 3:
//插入
hd.insert();
System.out.println("插入完成!");

break;
case 4:
//删除
hd.delete();
System.out.println("删除完成!");
break;
case 5:
//退出
System.out.println("程序退出!");
System.exit(0);
break;
}

}
}

Handle.java

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
package database_20;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* 数据库操作类
* @author Administrator
*
*/
public class Handle {
TestConnection tc = new TestConnection();
Scanner sc = new Scanner(System.in);
/**
* 查询方法
*/
public void query() {
System.out.println("1:查询全部");
System.out.println("2:根据ID查询");
System.out.print("选择你要执行选项:");
// Scanner sc2 = new Scanner(System.in);
int type2 = sc.nextInt();
switch (type2) {

case 1:
String Sql1 = "select ID,Name,Salary,departmentId,email from employee where 1=?"; //表名在这里,这里顺序要和数据库表一致
Object[] array1 = { 1 };
List list = tc.getData(Sql1, array1);
/**
* 取键值 并打印 即为输出的列名 排列
*/
Map map2 = (Map) list.get(0);
// 存键值
Set set2 = map2.keySet();
Iterator it2 = set2.iterator();
while (it2.hasNext()) {
System.out.print("\t" + it2.next());
}

System.out.println();
//循环取出 每个行的数据

for (Object object : list) {
// list里面是map对象
Map map = (Map) object;
// 存键值
Set set = map.keySet();
Iterator it = set.iterator();

while (it.hasNext()) {
// 取键值

Object key = it.next();

// 输出 map里的数据

System.out.print("\t " + map.get(key));

}
System.out.println();
}

break;
case 2:
/**
* 根据用户输入的员工id进行查询
*/
System.out.println("输入ID:");
Object object = sc.nextInt();
Object[] array = { object };
String Sql2 = "select ID,Name,Salary,departmentId,email from employee where ID =? ";

List list2 = tc.getData(Sql2, array);
//输出列名
Map map3 = (Map) list2.get(0);
// 存键值
Set set3 = map3.keySet();
Iterator it3 = set3.iterator();

while (it3.hasNext()) {
System.out.print("\t" + it3.next());
}

System.out.println();
//循环输出数据
for (Object object2 : list2) {
// list里面是map对象
Map map4 = (Map) object2;
// 存键值
Set set4 = map4.keySet();
Iterator it4 = set4.iterator();

while (it4.hasNext()) {
// 取键值

Object key = it4.next();

// 输出 map里的数据

System.out.print("\t " + map4.get(key));
// System.out.print("\\t"+ map.get(key));

}
System.out.println();
}

break;
}
}

/**
* 更新方法
*/
public void update(){
System.out.print("请输入ID:");
Object id = sc.next();
System.out.print("请输入想更新的薪水值:");
Object salary = sc.next();
//根据用户输入的员工号来修改薪水值并判断是否执行成功
String sql = "update employee set Salary = ? where ID = ? " ;
Object [] array = { salary, id };
//使用TestConnection的update方法
int line = tc.update(sql, array);
if(line>0){
System.out.println("信息更新成功!");
}

}
/**
* 插入方法
*/
public void insert(){
System.out.print("请输入ID:");
Object id = sc.next();
System.out.print("请输入Name:");
Object name = sc.next();
System.out.print("请输入email:");
Object email = sc.next();
System.out.print("请输入Salary:");
Object salary = sc.next();
System.out.print("请输入dapartmentId:");
Object dpId = sc.next();
Object[] array = {id,name,salary,dpId,email};
//插入用户输入的数据 并判断是否执行成功
String sql = "insert into employee values(?,?,?,?,?)";
int line = tc.update(sql, array);
if(line>0){
System.out.println("插入成功!");
}
}

/**
* 删除方法
*/
public void delete(){
System.out.print("请输入想删除的员工号:");
Object id = sc.next();
Object [] array = {id};
//删除用户输入 的员工号的数据并判断是否执行成功
String sql = "delete from employee where ID = ? ";
int line = tc.update(sql, array);
if(line>0){
System.out.println("删除成功!");
}
}

}

TestConnection.java

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
package database_20;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestConnection {

/**
* 定义链接需要的字符串
*/
private static final String str1 = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost/test?useSSL=false"; //这里是数据库名
private static final String user = "root";
private static final String password = "12345678";
Connection conn;
PreparedStatement st;
ResultSet rs;

/**
* 加载驱动类
*/
static {

try {
Class.forName(str1);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* 建立链接的方法
*
* @return
*/
private Connection getConnection() {

try {
conn = DriverManager.getConnection(url, user, password);

} catch (Exception e) {
// TODO: handle exception
}
return conn;

}

/**
* 使用prepareStatement来预编译查询语句 然后传参数的值来作为条件查询数据库 返回list
*
* @param id
* @return
*/
public List getData(String sql, Object[] array) {
// SQL语句
List list = new ArrayList();
conn = this.getConnection();
try {
// 预编译
st = conn.prepareStatement(sql);
// 利用方法传入参数
for (int i = 0; i < array.length; i++) {
st.setObject(i + 1, array[i]);
}
// 执行查询
rs = st.executeQuery();
while (rs.next()) {
Map map = new HashMap();

ResultSetMetaData rsmd = rs.getMetaData();
// 以列名为键 存储每一行数据进map
for (int i = 1; i <= rsmd.getColumnCount(); i++) {

map.put(rsmd.getColumnName(i), rs.getObject(i));

}
// 将每一个map加入list 这样list的到就是每一行
list.add(map);

}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭连接
this.close();
}
return list;

}

/**
* 更新数据的方法
*
* @param sql
* @param array
* @return
*/
public int update(String sql, Object array[]) {
conn = this.getConnection();
int line = 0;
try {

st = conn.prepareStatement(sql);
// 传参数
for (int i = 0; i < array.length; i++) {
st.setObject(i + 1, array[i]);
}

line = st.executeUpdate();
// 判断是否修改成功
if (line > 0) {
return line;

} else {

System.out.println("更新失败");
}

} catch (SQLException e) {

e.printStackTrace();
} finally {
// 关闭连接
this.close();
}
return 0;
}

/**
* 关闭连接
*/
private void close() {

try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {

try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {

try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
1
2
3
private static final String url = "jdbc:mysql://localhost/test?useSSL=false";  
private static final String user = "root";
private static final String password = "12345678";

这里test是数据库名, user是用户名,password是密码,都要换成自己的

2.在MYSQL中新建数据库和表,插入数据

1
2
3
4
5
6
show datebases;
create database test;
use test;
show tables;
create table employee(ID int(20) primary key auto_increment,Name varchar(20),Salary int(10),departmentId int(10),email varchar(20));
desc employee;

1.png

注意2:数据库中建表的字段顺序要和java中Handle.java

String Sql1 = "select ID,Name,Salary,departmentId,email from employee where 1=?";
这里面字段顺序要保持一致
然后向表中插入数据,如下,插入一些数据
insert into employee(ID,Name,Salary,departmentId,email) values(3,'jack',300,333,'3333@qq.com');
image.png

3.运行java中主程序

确定程序无误之后,运行Test.java,程序正确的话会发现结果如下

但是会发现这个程序存在一个问题,运行一次就自动停止了,不能持续循环多个操作

4.改进——查询直至外部停止

1
2
3

int index = 0;
do{ 源程序} while(index != 5);

在源程序外面加上个while循环和index一直到输入中止条件

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

package database_20;

import java.util.Scanner;
/**
* 测试类
* @author Administrator
*
*/
public class Test {
private static Scanner sc;

public static void main(String[] args) {
int index = 0; //新增
System.out.println("欢迎光临:");
//输出选项
do{ //新增
System.out.println("1:查询 2:更新 3:插入 4:删除 5:退出");
System.out.println("你想干什么? 请选择:");
sc = new Scanner(System.in);
//实例化数据操作类Handle
Handle hd = new Handle();

int type = sc.nextInt();
/**
* 判断用户选择操作的项
*/
switch(type){
case 1:
//调用Handle查询方法
hd.query();
System.out.println("查询完成!");
index = type; //新增
break;
case 2:
//更新
hd.update();
System.out.println("更新完成!");
index = type;
break;
case 3:
//插入
hd.insert();
System.out.println("插入完成!");
index = type;
break;
case 4:
//删除
hd.delete();
System.out.println("删除完成!");
index = type;
break;
case 5:
//退出
System.out.println("程序退出!");
System.exit(0);
break;
}

}while(index != 5); //新增
}
}
-------------���Ľ�����л�����Ķ�-------------