配置java编程环境,熟悉java编程,java操作数据库
给出的实验说明中的JDK,eclipse版本都不是最新的,本人建议安装最新的版本的。此处给出网页教程:JDK和eclipse安装
安装这个数据库整整花了我一个下午加半个晚上,主要是实验说明中的安装教程与版本不一致,网页上有直接安装版本的,但是似乎只有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建好工程,在源文件目录下建好一些类,这些类是功能实现封装,我的功能基本如下:
(类的排序按照字典序排序的,默认是这样)第一个是创建表格功能,第二个是链接数据库功能,第三个是主函数,第四歌是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,字段分别为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; } }