Java教程

编程新技术实务实验一

本文主要是介绍编程新技术实务实验一,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

实验目的:

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

这篇关于编程新技术实务实验一的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!