实验目的:
配置java编程环境,熟悉java编程,java操作数据库
实验任务:
- JDK的安装,eclipse安装
- MYSQL数据库的安装
- 使用eclipse连接数据库
- 使用java语言在数据库中建立表格users和persons
- 实现表格中增加,删除,打印功能
实验过程:
任务一: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;
}
}