“做中学”实验一
说在前面:在进行这个实验之前我们只学习了C++一门编程语言,对于java和数据库真就“做中学”,所以整个博文也仅仅只是在分享我自己的学习过程,如果代码有不规范或者不正确的地方还希望大家能给予指正,感谢!
以下这段话为2020.12.2更新
验收实验一的时候老师指出我这样的封装是不对的,正确的应该是把对数据库的连接和基本操作都封装在一个类中,然后分别对users表和persons表建一个类,在这个类中调用对数据库的操作。在实验二中会改正过来。
实验要求
在安装配置好Mysql数据库后,使用Java语言通过JDBC直接连接数据库,在数据库中建表并进行表数据的增删查改。
关键代码:
……
Class.forName(……); //加载数据库驱动名
String url=……; //数据连接的url
String name=……; //数据库访问的用户名
String password=……; //数据库访问的密码
Connection con= DriverManager.getConnection(url, name, password);
……
在安装配置好数据库Mysql后,需要使用Java编程完成如下任务:
(1)创建数据库表users,字段分别为username(主键,varchar(10))、pass(varchar(8));数据库表person,字段按分别为username(varchar(10),对应于users表的username)、name(主键,varchar(20))、age(int,可以为空)、teleno(char(11),可以为空);如表users中username则表person中也不能有相应的username的数据。
(2)在表users中插入4行数据,数据分别是(ly,123456)、(liming,345678)、(test, 11111)、(test1,12345),在表person中插入3行数据,数据分别为(ly,雷力)、(liming,李明,25)、(test,测试用户,20,13388449933);
(3)在person表中插入5行数据,分别为(ly,王五)、(test2,测试用户2)、(test1,测试用户1,33)、(test,张三,23,18877009966)、(admin,admin)。对于表中已有的username,则根据最新的数据修改其相应字段值;如该username不存在,则首先在表users中插入该username,默认的password为888888,然后才能将数据插入至person表。
(4)删除users表中test打头的username,同时按照规则一并删除person表相应的数据。
要求每个处理阶段均要在控制台打印出处理完成后的结果,格式按照制表方式输出,如:
表users
字段名xx 字段名xx ….
xx xx
表person
字段名xx 字段名xx ….
xx xx
(5)类的设计要求:需要将数据库的连接、操作进行封装,以便在后续实验中进行重用。此项为扣分项,没有进行封装的实验分会相应扣减。
自此实验结束,按照要求提交源代码进行验收。
自己的操作和学习流程
1、配置编程环境,包括安装、配置好Java编程环境、数据库环境;
2、学习操作数据库的基本指令:可参考数据库的基本操作;
3、学习进行jdbc连接:可参考JDBC连接mysql数据库;
4、学习java的基本语法:可以找几篇注释详细的博客阅读一下;
5、如果还是比较懵的话就参照着前辈的代码写一下,写着写着语法逻辑就清晰了,知道语法逻辑之后就能用自己的编程逻辑去编写代码了。
实验步骤
安装数据库可视化工具
为了方便观察和操作数据库,我安装了数据库的可视化工具Navicat。
新建了一个库叫Lab1。
JDBC连接mysql数据库
※记得导包 mysql-connector-java-8.0.12.jar
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
36package Net; import java.sql.Connection; import java.sql.DriverManager; public class JdbcCon { private String dbUrl="jdbc:mysql://localhost:3306/Lab1?useSSL=false&useUnicode=true&characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; private String dbUserName="root";//数据库用户名 private String dbPassWord="×××××××××××××";//数据库密码 private String jdbcName="com.mysql.cj.jdbc.Driver";//驱动名称 public Connection getCon()throws Exception{ Class.forName(jdbcName);//加载驱动 Connection con=DriverManager.getConnection(dbUrl, dbUserName, dbPassWord);//建立连接 return con; } public void CloseCon(Connection con)throws Exception{ //关闭数据库连接 if(con!=null) { con.close(); System.out.println("已断开与数据库的连接!"); } } public void connect() { JdbcCon jdncConn=new JdbcCon(); try { jdncConn.getCon(); System.out.println("数据库连接成功!"); } catch (Exception e) { //捕获异常 // TODO Auto-generated catch block e.printStackTrace(); System.out.println("数据库连接失败!"); } } }
创建user、person类
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
28package com.java123.entity; public class Users { private String username; private String pass; public void SetUsername(String username) { this.username=username; } public void SetPass(String pass) { this.pass=pass; } public String getUsername() { return username; } public String getPass() { return pass; } public String getUser() { //方便插入数据时使用 String temp="'"+this.username+"','"+this.pass+"'"; return temp; } }
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
61package com.java123.entity; public class Persons { private String username; private String name; private int age; private String teleno; public void initialize() { this.username=null; this.name=null; this.age=-1; this.teleno=null; } public void SetUsername(String username) { this.username=username; } public void SetName(String name) { this.name=name; } public void SetAge(int age) { this.age=age; } public void SetTeleno(String teleno) { this.teleno=teleno; } public String getUsername() { return username; } public String getName() { return name; } public int getAge() { return age; } public String getTeleno() { return teleno; } public String getPerson() { String temp="'"+this.username+"','"+this.name+"'"; if(this.getAge()!=-1) { temp+=",'"+this.getAge()+"'"; } if(this.getTeleno()!=null) { temp+=",'"+this.getTeleno()+"'"; } return temp; } }
在数据库中创建表
先介绍两个参数:Statement和ResultSet,这两个是jdbc的两个接口,Statement用来接收sql语句,可以操作数据库;ResultSet用来接收操作数据库后的返回信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14String users="create table users(" +"username varchar(10) not null," +"pass varchar(8) not null," +"primary key ( username )" +")"; String persons ="create table persons(" +"username varchar(10) not null," +"name varchar(20) not null," +"age int," +"teleno char(11)," +"primary key ( name )" +")";
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
30package com.java123.modle; import java.sql.SQLException; import java.sql.Statement; public class CreateTables { public void ctUsers(Statement state,String user) { try { state.executeUpdate(user); System.out.println("创建users表成功!"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("创建users表失败!"); e.printStackTrace(); } } public void ctPersons(Statement state,String person) { try { state.executeUpdate(person); System.out.println("创建persons表成功!"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("创建persons表失败!"); e.printStackTrace(); } } }
增加表中的数据
这里需要注意实验要求:插入person的时候,如果该person的username已经存在于person表中,则更新person表中usename一列的数据;若该person的username不存在于user表中,则在user表中新增一列数据,默认密码为“888888”。
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
77package com.java123.modle; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.java123.entity.Persons; import com.java123.entity.Users; public class Addition { public void adUers(Statement state,Users user) { try { //String query = "SELECT * FROM persons where username='"+sql+"'"; String sql="insert into users(username,pass) values ("+user.getUser()+")"; state.executeUpdate(sql); System.out.println("插入user数据成功!"); } catch (SQLException e) { System.out.println("插入user数据失败!"); // TODO Auto-generated catch block e.printStackTrace(); } } public void adPersons(Statement state,ResultSet rs,Persons person) { //需要对某些字段为空的情况进行分类讨论 String sql="insert into persons(username,name"; if(person.getAge()!=-1&&person.getTeleno()!=null) { sql+=",age,teleno)"; } else if(person.getAge()==-1&&person.getTeleno()==null) { sql+=")"; } else if(person.getAge()!=-1&&person.getTeleno()==null) { sql+=",age)"; } else { sql+=",teleno)"; } sql+=" values ("+person.getPerson()+")"; //根据username在person表里面查一下是否已存在这个名字 String query ="select * from persons where username='"+person.getUsername()+"';"; try { rs=state.executeQuery(query); if(!rs.next()) {//若不存在,则直接新增数据 state.executeUpdate(sql); System.out.println("插入person数据成功!"); }else { //username存在时,先删除原数据,再插入一条新数据 Delete del=new Delete(); del.delete_detail(state, "persons", "username",person.getUsername()); state.executeUpdate(sql); System.out.println("插入person数据成功,并更新数据!"); } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } 根据username在user表里面查一下是否已存在这个名字 String temp ="select * from users where username='"+person.getUsername()+"';"; try { rs=state.executeQuery(temp); rs.last(); if(rs.getRow()==0) {//若不存在该username,则新增一条数据 state.execute("insert into users(username,pass) values ('"+person.getUsername()+"','888888')"); System.out.println("插入person数据成功,并更新users表的数据!"); } } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("插入person数据时遇到阻碍!"); e.printStackTrace(); } } }
删除数据
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
44package com.java123.modle; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Delete { //根据字段名删除 public void delete(Statement state,ResultSet rs,String flag) { String query = "delete from users where username like '"+flag+"%'";//删除 try { state.executeUpdate(query); System.out.println("删除uses表中与"+flag+"开头的数据成功!"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("删除uses表中与"+flag+"开头的数据失败!"); e.printStackTrace(); } query = "delete from persons where username like '"+flag+"%'";//删除 try { state.executeUpdate(query); System.out.println("删除persons表中与"+flag+"开头的数据成功!"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("删除persons表中与"+flag+"开头的数据失败!"); e.printStackTrace(); } } //这个方法是根据具体的字段值删除 public void delete_detail(Statement state,String table,String atrribute,String value) { String query="delete from "+table+" where "+atrribute+" = '"+value+"'"; try { state.executeUpdate(query); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
显示数据
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
65package com.java123.modle; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Display { private String users_head="*****************表users***************"; private String users_title="|username pass|"; private String persons_head="*****************表persons***************"; private String persons_title="|username name age teleno |"; public void show_user(Statement state,ResultSet rs) { System.out.println(users_head); System.out.println(users_title); String query="select * from users"; try { rs=state.executeQuery(query); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { while(rs.next()) { String s1=rs.getString(1); String s2=rs.getString(2); System.out.println("| "+s1+" "+s2+" |"); // System.out.println(" "); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void show_persons(Statement state,ResultSet rs) { System.out.println(persons_head); System.out.println(persons_title); String query="select * from persons"; try { rs=state.executeQuery(query); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { while(rs.next()) { String s1=rs.getString(1); String s2=rs.getString(2); String s3=rs.getString(3); String s4=rs.getString(4); System.out.println("| "+s1+" "+s2+" "+s3+" "+s4+" |"); // System.out.println(" "); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
释放接口
一定要记的关闭接口和数据库的连接!!!
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
32package Net; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Release { public void release(Statement state,ResultSet rs) { if(rs!=null) { try { rs.close(); System.out.println("已释放ResultSet!"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(state!=null) { try { state.close(); System.out.println("已释放Statement!"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
主要操作
所有对数据库的操作我都放在了一个类里面:
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
117package Net; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.java123.entity.Persons; import com.java123.entity.Users; import com.java123.modle.Addition; import com.java123.modle.CreateTables; import com.java123.modle.Delete; import com.java123.modle.Display; public class MainOP { public void mainop(){ String users="create table users(" +"username varchar(10) not null," +"pass varchar(8) not null," +"primary key ( username )" +")"; String persons ="create table persons(" +"username varchar(10) not null," +"name varchar(20) not null," +"age int," +"teleno char(11)," +"primary key ( name )" +")"; String [][]Users={ {"ly","123456"}, {"liming","345678"}, {"test","11111"}, {"test1","12345"}}; String[][]Persons= {{"ly","雷力",null,null}, {"liming","李明","25",null}, {"test","测试用户","20","13388449933"}, {"ly","王五",null,null}, {"test2","测试用户2",null,null}, {"test1","测试用户1","33",null}, {"test","张三","23","18877009966"}, {"admin","admin",null,null}}; //连接数据库 JdbcCon JC=new JdbcCon(); JC.connect(); //创建person和user实体 Persons person=new Persons(); Users user=new Users(); Statement state; try { state = JC.getCon().createStatement(); ResultSet rs=state.getResultSet(); CreateTables ct=new CreateTables(); //创建新的表 ct.ctUsers(state, users); ct.ctPersons(state, persons); Display dis=new Display(); //展示表的细节 dis.show_user(state, rs); dis.show_persons(state, rs); Addition add=new Addition(); //添加users和persons的信息 for(int i=0;i<4;i++) { user.SetUsername(Users[i][0]); user.SetPass(Users[i][1]); add.adUers(state, user); } dis.show_user(state, rs); for(int i=0;i<8;i++) { person.initialize(); person.SetUsername(Persons[i][0]); person.SetName(Persons[i][1]); if(Persons[i][2]==null) { person.SetAge(-1); }else { person.SetAge(Integer.valueOf(Persons[i][2]).intValue()); } person.SetTeleno(Persons[i][3]); add.adPersons(state,rs,person); } dis.show_user(state, rs); dis.show_persons(state, rs); Delete del=new Delete(); del.delete(state, rs,"test"); dis.show_user(state, rs); dis.show_persons(state, rs); Release rel=new Release(); rel.release(state, rs); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { JC.CloseCon(JC.getCon()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
最后在主函数里面调用:
1
2
3
4
5
6
7
8
9
10
11package Net; public class MainClass { public static void main(String[] args) { MainOP mop =new MainOP(); mop.mainop(); } }
运行结果
心得
虽然按照实验要求做完了,做完之后也对相关知识有了一点了解,但是自己感觉代码中还是有很多可优化的地方的,不过不重要了,先把实验验收了最快乐!然后开启实验二的学习!
另外另外,java好有趣,感觉编程又开始快乐了!
最后
以上就是爱笑蜗牛最近收集整理的关于Java语言编程:使用Java语言通过JDBC连接数据库,并建表进行表数据的增删查改“做中学”实验一的全部内容,更多相关Java语言编程:使用Java语言通过JDBC连接数据库,并建表进行表数据内容请搜索靠谱客的其他文章。
发表评论 取消回复