说在前面:在进行这个实验之前我们只学习了C++一门编程语言,对于java和数据库真就“做中学”,所以整个博文也仅仅只是在分享我自己的学习过程,如果代码有不规范或者不正确的地方还希望大家能给予指正,感谢!
验收实验一的时候老师指出我这样的封装是不对的,正确的应该是把对数据库的连接和基本操作都封装在一个类中,然后分别对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。
※记得导包 mysql-connector-java-8.0.12.jar
package 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("数据库连接失败!");
}
}
}
package 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;
}
}
package 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用来接收操作数据库后的返回信息。
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 )"
+")";
package 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”。
package 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();
}
}
}
package 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();
}
}
}
package 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();
}
}
}
一定要记的关闭接口和数据库的连接!!!
package 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();
}
}
}
}
所有对数据库的操作我都放在了一个类里面:
package 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();
}
}
}
最后在主函数里面调用:
package Net;
public class MainClass {
public static void main(String[] args) {
MainOP mop =new MainOP();
mop.mainop();
}
}
虽然按照实验要求做完了,做完之后也对相关知识有了一点了解,但是自己感觉代码中还是有很多可优化的地方的,不过不重要了,先把实验验收了最快乐!然后开启实验二的学习!
另外另外,java好有趣,感觉编程又开始快乐了!