Java语言编程:使用Java语言通过JDBC连接数据库,并建表进行表数据的增删查改

“做中学”实验一

说在前面:在进行这个实验之前我们只学习了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。
Java语言编程:使用Java语言通过JDBC连接数据库,并建表进行表数据的增删查改_第1张图片

JDBC连接mysql数据库

※记得导包 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("数据库连接失败!");
		}
	}
}

创建user、person类

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语言编程:使用Java语言通过JDBC连接数据库,并建表进行表数据的增删查改_第2张图片

心得

虽然按照实验要求做完了,做完之后也对相关知识有了一点了解,但是自己感觉代码中还是有很多可优化的地方的,不过不重要了,先把实验验收了最快乐!然后开启实验二的学习!
另外另外,java好有趣,感觉编程又开始快乐了!

你可能感兴趣的:(编程新技术务实实验,mysql,数据库,eclipse,java)