ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

编程新技术实务实验一

2021-09-29 17:58:51  阅读:176  来源: 互联网

标签:username String 编程 state 实验 catch 实务 null public


实验目的:

配置java编程环境,熟悉java编程,java操作数据库

实验任务:

  1. JDK的安装,eclipse安装
  2. MYSQL数据库的安装
  3. 使用eclipse连接数据库
  4. 使用java语言在数据库中建立表格users和persons
  5. 实现表格中增加,删除,打印功能

实验过程:

任务一:JDK的安装,eclipse安装

给出的实验说明中的JDK,eclipse版本都不是最新的,本人建议安装最新的版本的。此处给出网页教程:JDK和eclipse安装

任务二:MYSQL的安装

安装这个数据库整整花了我一个下午加半个晚上,主要是实验说明中的安装教程与版本不一致,网页上有直接安装版本的,但是似乎只有32位机器的,老师说无关紧要,但是我觉得还有有关紧要的,故还是下载了64位压缩版本,需要windows指令形式安装,以下为64位压缩版本安装教程。
下载网站:https://dev.mysql.com/downloads/mysql/

1.下载完成后解压到某一个文件夹(记住这个路径,一会要用到)

2.在根目录下创建一个txt文件,名字叫my,文件后缀为ini
之后复制下面这个代码放在文件下(新解压的文件没有my.ini文件,需自行创建)
以下代码除安装目录和数据的存放目录需修改,其余不用修改。(注意!!注意!!)
修改的路径就是你解压的路径!

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录   ----------是你的文件路径-------------
basedir=D:\mysql\mysql-8.0.26-winx64
# 设置mysql数据库的数据的存放目录  ---------是你的文件路径data文件夹自行创建
datadir=D:\mysql\mysql-8.0.26-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4


3.配置好文件后,使用管理员身份运行CMD,记住是管理员
在这里插入图片描述

进入mysql的bin目录
在这里插入图片描述

4.在MySQL目录下的bin目录下执行命令:

mysqld --initialize –console

复制root@localhost:之后的密码到本地文件夹,保存好( : 后有一个空格,不复制)
在这里插入图片描述

5.安装mysql服务

mysqld --install mysql

在这里插入图片描述
6.启动mysql服务
在这里插入图片描述
7.连接mysql

mysql -uroot -p

输入之后去复制一下刚刚保存下来的密码,并粘贴到命令台
在这里插入图片描述
8.输入以下命令修改密码(把新的密码修改成你想要的密码)

ALTER USER 'root'@'localhost' IDENTIFIED BY '新的密码';

在这里插入图片描述
9.配置环境变量
点击-控制面板->系统和安全->高级系统设置->高级->环境变量
路径是你自己安装的位置,记得修改
在这里插入图片描述

10.在path中加入以下代码
在这里插入图片描述

11.至此安装mysql结束,如果需要删除执行mysqld --install mysql如果提示该服务已存在
在这里插入图片描述

以下代码删除:

sc delete mysql

任务三:使用eclipse连接数据库

首先使用eclipse建好工程,在源文件目录下建好一些类,这些类是功能实现封装,我的功能基本如下:
在这里插入图片描述

(类的排序按照字典序排序的,默认是这样)第一个是创建表格功能,第二个是链接数据库功能,第三个是主函数,第四歌是persons表格模板,第五个是最后释放数据库内存,第六个是表格一些操作的实现,第七个是users模板。

下面使用eclipse链接数据库,直接上函数说明;(代码自己读懂就行)

package Net;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;

public class JdbcCon {
	private String dbUrl;
	private String dbUserName;//数据库用户名
	private String dbPassWord;//数据库密码
	private String jdbcName;//驱动名称
//构造函数初始化
    public JdbcCon()
	{
		String bu=null;
		 String []name=null;
			//依次读取一个字符,读到最后没有了就返回-1。有分隔符号
	        BufferedReader br = null;
			try {
				br = new BufferedReader(new FileReader("text.txt"));
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
				try {
					bu=br.readLine();
					name=bu.split(" ");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		 dbUrl=name[0];
		 dbUserName=name[1];//数据库用户名
	     dbPassWord=name[2];;//数据库密码
		 jdbcName=name[3];;//驱动名称
	}
	
	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("数据库连接失败!");
		}
	}
}

注意:本实验没有要求用文件流,但是老师说最好使用文件流方式,因为我们具体使用软件的时候不可能去修改源代码,最多修改的是文件中的数据。所以注意代码中的文件要在工程目录下建好,不然会报错,文件中写好以下内容:在这里插入图片描述
在这里插入图片描述

任务四:建立users和persons表格

任务描述:创建数据库表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的数据。

首先我们要知道如何通过代码来操控数据库。这其中我们需要建立与数据库的连接,上面已经完成,然后就是要明白一些数据库的指令,明白这些指令之后,我们就可以通过statement类来实现把字符串形式的指令传到数据库,让数据库执行相应的指令。

例如我们建立users表格的指令如下:
在这里插入图片描述

上面两个字符串就是建立users和persons两个表格的指令,只要把指令传送给数据库,让数据库执行即可。
以下是传送指令的语句:
在这里插入图片描述

字符串table就是上面的指令,这里使用的是函数传参形式。

任务五:实现表格中增加,删除,打印功能

首先要完成这些功能的实现,就要先学会一些数据库指令,只要向数据库传达这些指令就可以把相应的功能实现。
增加指令:
在这里插入图片描述

删除指令:
在这里插入图片描述

这个指令是删除关键字段的,实验要求中需要删除test开头的用户,所以使用这个指令;
在这里插入图片描述

这个指令是删除指定数值的,table是表名,atrribute是列名,value是列值,将数据删除。
写好指令之后,还是使用statement类的对象传入数据库执行就好。
在这里插入图片描述

打印功能:
在这里插入图片描述

执行该指令之后,使用ResultSet类对象获得结果集:
在这里插入图片描述

使用以下代码打印表格:
在这里插入图片描述

实验感想:

第一次用java写工程,从一个小白基本入门。
本次实验的封装性还不是很好,例如不能让用户调用函数获取数据库状态,获取结果集等。

实验源代码

所有类上面是所有类

package Net;

import java.sql.SQLException;
import java.sql.Statement;

public class CreateTables {

	public void cttable(Statement state,String table) {
		String[] tablename = null;
		tablename=table.split(" ");//找出表的名字
		try {
			state.executeUpdate(table);
			System.out.println("创建"+tablename[2]+"表成功!");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("创建"+tablename[2]+"表失败!");
			e.printStackTrace();
		}
	}
}


package Net;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;

public class JdbcCon {
	private String dbUrl;
	private String dbUserName;//数据库用户名
	private String dbPassWord;//数据库密码
	private String jdbcName;//驱动名称
//构造函数初始化
    public JdbcCon()
	{
		String bu=null;
		 String []name=null;
			//依次读取一个字符,读到最后没有了就返回-1。有分隔符号
	        BufferedReader br = null;
			try {
				br = new BufferedReader(new FileReader("text.txt"));
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
				try {
					bu=br.readLine();
					name=bu.split(" ");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		 dbUrl=name[0];
		 dbUserName=name[1];//数据库用户名
	     dbPassWord=name[2];;//数据库密码
		 jdbcName=name[3];;//驱动名称
	}
	
	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 Net;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;



public class Mainop {
	public static void main(String[] args){
		
		String userstabletemp="create table users ("
				+"username varchar(10) not null,"
				+"pass varchar(8) not null,"
				+"primary key ( username )"
				+")";
		
		String personstabletemp="create table persons ("
				+"username varchar(10) not null,"
				+"name varchar(20) not null,"
				+"age int,"
				+"teleph char(11),"
				+"primary key ( name )"
				+")";
		
		String [][]Userstemp={ {"ly","123456"},
				{"liming","345678"},
				{"test","11111"},
				{"test1","12345"}};
		
		String[][]Personstemp= {{"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.cttable(state, userstabletemp);
			ct.cttable(state, personstabletemp);
//展示表的细节
			table_func func=new table_func(); 
			func.show_table(state, rs,"users");
			func.show_table(state, rs,"persons");
			
//添加users
			
			for(int i=0;i<4;i++) {
				user.SetUsername(Userstemp[i][0]);
				user.SetPass(Userstemp[i][1]);	
				func.adUers(state, user);
			}
			func.show_table(state, rs,"users");
//添加persons	
			for(int i=0;i<8;i++) {
				person.initialize();
				person.SetUsername(Personstemp[i][0]);
				person.SetName(Personstemp[i][1]);
				if(Personstemp[i][2]==null) {
					person.SetAge(-1);
				}else {
					person.SetAge(Integer.valueOf(Personstemp[i][2]).intValue());
				}
				person.SetTeleno(Personstemp[i][3]);
				func.adPersons(state,rs,person);
				
			}
			func.show_table(state, rs,"users");
			func.show_table(state, rs,"persons");
			func.delete(state, rs,"test");
			func.show_table(state, rs,"users");
			func.show_table(state, rs,"persons");
			System.out.print("-------------数据库初始化成功--------------------\n\n");
/*------------------------------附加功能---------------------------*/			
			

/*------------------------------释放内存---------------------------*/	
			ReleaseStatement rel=new ReleaseStatement();
			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 Persons {
	private String username;
	private String name;
	private int age;
	private String teleph;
	
	public void initialize() {
		this.username=null;
		this.name=null;
		this.age=-1;
		this.teleph=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.teleph=teleno;
	}
	
	public String getUsername() {
		return username;
	}
	
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
	public String getTeleph() {
		return teleph;
	}
	
	public String getPerson() {
		String temp="'"+this.username+"','"+this.name+"'";
		if(this.getAge()!=-1) {
			temp+=",'"+this.getAge()+"'";
		}
		if(this.getTeleph()!=null) {
			temp+=",'"+this.getTeleph()+"'";
		}
		return temp;
	}
	
}


package Net;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ReleaseStatement {
	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;

public class table_func {
//增加users
	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();
		}

}
//增加persons
	public void adPersons(Statement state,ResultSet rs,Persons person) {
    //需要对某些字段为空的情况进行分类讨论
		String sql="insert into persons(username,name";
		if(person.getAge()!=-1&&person.getTeleph()!=null) {
			sql+=",age,teleph)";
		}
		else if(person.getAge()==-1&&person.getTeleph()==null) {
			sql+=")";
		}
		else if(person.getAge()!=-1&&person.getTeleph()==null) {
			sql+=",age)";
		}
		else {
			sql+=",teleph)";
		}
		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存在时,先删除原数据,再插入一条新数据
			table_func func=new table_func(); 
			func.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.next()) {//若不存在该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();
	}
}
//删除表中数据
	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();
	}
}
//打印表格
	public void show_table(Statement state,ResultSet rs,String tablename) {
	String query="select * from "+tablename;
	String datatemp=null;
	try {
		String tablename_head="*****************表"+tablename+"***************";
		System.out.println(tablename_head);
		rs=state.executeQuery(query);//查找结果集
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		System.out.print("|");//打印表头
		for(int i=1;i<=rs.getMetaData().getColumnCount();i++) {
			System.out.print(String.format("%-12s", rs.getMetaData().getColumnLabel(i)));
		}
		System.out.print("|\n");
	} catch (SQLException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
	try {
		while(rs.next()) {//打印表内容
			int i=1;
			System.out.print("|");
			while(i<=rs.getMetaData().getColumnCount()) {//获取表的列数
			if(rs.getString(i)==null) datatemp="-";
			else datatemp=rs.getString(i);
			System.out.print( String.format("%-12s", datatemp));
			i++;
			}
			System.out.print("|\n");
		}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
	

}

package Net;

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;
		
	}
}

标签:username,String,编程,state,实验,catch,实务,null,public
来源: https://blog.csdn.net/S0609/article/details/120552701

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有