不靠谱教程的受害者决定还是自己写一下...
毕竟短学期还要做大作业...
~ 下载与安装MySQL ~
2. 下载完成后,点开.msi,加载一段时间后会出现如下窗口:
3. 选择accept之后点击next,会进入下一个窗口:
我安装的那个版本在右下方还有两个选项。其实只需要最基本的功能就行了,不需要将所有功能全部安装。
4. 接着,会开始检查一些软件的配置情况:
在这张图片中,status没有显示Mannual的可以由软件帮忙自动安装。只有Visual Studio和Python是需要自己安装的。我自己出现的情况是,即使安装了Visual Studio,在检查的时候仍然显示failing。然后我直接点了next,也能继续安装。
5. 之后可以一路next,直到遇到这个界面:
其实这个密码完全可以不设置,因为我们只是随便玩玩。这个设置的密码是user为root的密码。
之后继续一路next,即可完成安装。
~ 在MySQL中新建Table ~
1. 安装完成后,应该可以在注册表中找到Command Line Client的快捷方式了:
2. 点开快捷方式,先输入密码,然后创建database(也可用已有的)。几条可用的指令如下:
create database test; (创建名为test的database)
show databases; (显示已有的database)
use test; (进入名为test的database)
3. 新建一个Table。在这时,需要定义Table中的元素信息。以学生信息为例,需要学号和姓名,两个元素均为字符串。
可以在控制台中如下操作:
create tableStudent(
idvarchar(10) COMMENT '学号',
namevarchar(100) COMMENT '姓名',primary key(id)
)DEFAULT CHARSET=utf8;
其中,primary key表示主键,要求所有元素的主键值互不相同。类似的,也可以设置唯一索引,也有类似的效果。
还有一些可能用到的指令:
show tables; (显示所有的table)
desc Student; (显示名为Student的table的元素信息)
drop table Student; (删除名为Student的table)
这样一来,在MySQL中的设置就基本完成了。
~ 用JDBC连接MySQL并实现各操作 ~
1. 在eclipse里面新建一个Java Project。
之后在Build Path > Configure Build Path中导入mysql connector。下载链接见:https://dev.mysql.com/downloads/connector/j/,我选的是Platform Independent的.zip类型。
在Libraries > Add External JARs中选中下载后的.jar文件
点击Apply后,Project中就会出现Referenced Libraries了。
2. 接着在这个Project里面新建一个Package。
所有需要我们写的代码都放在这个Package里面就行了。
3. 我们在Package中新建$4$个文件:Util.java,Student.java,Operation.java,Main.java。每个文件的作用如下:
Util.java:处理与MySQL的连接。
Student.java:实现Student类的定义,里面有各种可供使用的成员函数。跟C++中的类差不多。
Operation.java:利用JDBC实现Java与MySQL的交互。也是最重要的部分。
Main.java:用于测试。
4. 简单说一下我对JDBC的理解。
JDBC实际上是实现了一种Java与MySQL的交互:我们可以在MySQL的Command Line Client中通过指令进行处理,不过在很多情况下有点太过繁琐了。比如,如果我们想要重复地在table中插入元素,每次就要写除了赋值外基本相同的指令。
而JDBC做的事情,其实就是帮忙补全指令。比如我们想在table中插入一个新的Student对象,只需要分别输入学号与姓名,我们的Java程序就可以通过函数将指令补全为"insert ...",再将其传给MySQL,从而实现插入。
类似的,如果我们想实现查询,也是由函数将指令补全为"select ...",然后传给MySQL,再MySQL进行处理,最后将结果返回给Java,这样我们就能获得查询的结果了。
而我们实现一个操作(插入、删除、查询),往往需要分为三个步骤:连接数据库(在Util.java中),补全指令(在Operation.java中实现),返回结果(对于插入、删除没有这个步骤;也在Operation.java中实现)。Main.java用于串联,也就是主函数的所在的位置。补全指令中会需要传入Student对象。
5. 连接数据库(Util.java)的实现。
先把该import的东西都整好。相当于C++的include。
package test; //这里的test请自行调换
importjava.sql.Connection;importjava.sql.DriverManager;import java.sql.SQLException;
接着是一个很重要的成员函数getConnection()。这个函数将会返回一个Connection类型,用于处理与MySQL的交互。在Operation.java中,所有的补全好的指令都是向这里获得的Connection中传入的。
getConnection()其实很简单,就是预先存好账号、密码、要访问的database,然后每次都进行登录、进入database。注意需要catch所有可能出现的异常。
publicConnection getConnection()
{try{
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8"; //这里的test请自行调换
String user="root";
String password="........."; //这里的账号密码请自行调换
returnDriverManager.getConnection(url,user,password);
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}catch(SQLException e)
{
e.printStackTrace();
}return null;
}
另一个需要实现的成员函数是closeConnection(),和函数名说的一样,就是把一个Connection关闭。写成函数的目的是处理异常。
public voidcloseConnection(Connection conn)
{try{
conn.close();
}catch(SQLException e)
{
System.out.println("数据库关闭异常");
e.printStackTrace();
}
}
完整代码如下(就是把前面的拼起来):
packagetest;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;public classUtil
{publicConnection getConnection()
{try{
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8";
String user="root";
String password=".........";returnDriverManager.getConnection(url,user,password);
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}catch(SQLException e)
{
e.printStackTrace();
}return null;
}public voidcloseConnection(Connection conn)
{try{
conn.close();
}catch(SQLException e)
{
System.out.println("数据库关闭异常");
e.printStackTrace();
}
}
};
View Code
6. 待操作类型的定义(Student.java)的实现。
跟C++没啥不同,不多赘述。
packagetest;public classStudent
{privateString id;privateString name;publicString get_id()
{returnid;
}public voidset_id(String id)
{this.id=id;
}publicString get_name()
{returnname;
}public voidset_name(String name)
{this.name=name;
}
};
7. Java与MySQL进行交互(Operation.java)的实现。
先import。
package test; //这里的test请自行调换
importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;import java.sql.SQLException;
用几个交互类型来举例说明:插入、删除、更新、输出整个table。
(1) 插入
插入主要通过两个类来实现:Connection和PreparedStatement。其中,Connection就是在Util.java中获得的东西,而PreparedStatement就是我们补全的指令。
代码的思路是这样的:先通过getConnection()获得Connection,然后用“插入”指令的模板生成初始的PreparedStatement,接着用我们传入的Student对象将PreparedStatement的赋值给补全,最后用补全好的PreparedStatement调用executeUpdate()进行交互。
一个优秀的码农一定不会忘记close和处理异常的,对吧。
public intinsert(Student stu)
{int i=0; //i表示所进行的交互发生在哪一行,其实不是很重要
Util util=newUtil();
Connection conn=util.getConnection(); //进行连接
String sql="insert into Student (id, name) values(?,?)"; //这里的Student需要与MySQL中create的table对应
PreparedStatement pstmt;try{
pstmt=(PreparedStatement)conn.prepareStatement(sql); //使用预设模板初始化PraparedStatement
pstmt.setString(1,stu.get_id());
pstmt.setString(2,stu.get_name()); //进行赋值
i=pstmt.executeUpdate(); //进行交互
pstmt.close();
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}returni;
}
(2) 删除
删除和插入基本一样,看看代码就懂了。
区别在于预设的指令模板不一样了,sql中的where就是在table中选择满足条件的元素。由于我们将id设为了主键,所以可以通过id唯一确定元素。
public intdelete(String id)
{int i=0;
Util util=newUtil();
Connection conn=util.getConnection();
String sql="delete from Student where id='"+id+"'"; //这里的Student请自行调换
PreparedStatement pstmt;try{
pstmt=conn.prepareStatement(sql);
i=pstmt.executeUpdate();
System.out.println("result line:"+i); //输出被删除的是哪一行
pstmt.close();
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}returni;
}
(3) 更新
就是不真正“插入”的类似插入的操作,同上。
public intupdate(Student stu)
{int i=0;
Util util=newUtil();
Connection conn=util.getConnection();
String sql="update Student set name='"+stu.get_name()+"' where id='"+stu.get_id()+"'"; //这里的Student请自行替换
PreparedStatement pstmt;try{
pstmt=(PreparedStatement)conn.prepareStatement(sql);
i=pstmt.executeUpdate();
System.out.println("result line:"+i); //输出被更新的是哪一行
pstmt.close();
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}returni;
}
(4) 输出整个table
sql中的"select *"表示全选,交互后的信息存在ResultSet rs中。
ResultSet就和C++ STL中的vector、set类似,是一个包含所有元素的容器,支持遍历、拿出具体元素等操作。
public voidlist()
{
Util util=newUtil();
Connection conn=util.getConnection();
String sql="select * from Student"; //这里的Student请自行调换
PreparedStatement pstmt;try{
pstmt=(PreparedStatement)conn.prepareStatement(sql);
ResultSet rs=pstmt.executeQuery(); //交互获得的信息
int col=rs.getMetaData().getColumnCount(); //一共有多少键值,在这里等于2,即id和name
System.out.println("====================");
System.out.println("id\tname\t");while(rs.next()) //类似C++ STL中的iterator
{for(int i=1;i<=col;i++)
System.out.print(rs.getString(i)+"\t"); //rs中的所以信息都是String格式
System.out.println("");
}
System.out.println("====================");
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}
}
完整代码如下(就是把前面拼起来):
packagetest;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;public classOperation
{public intinsert(Student stu)
{int i=0;
Util util=newUtil();
Connection conn=util.getConnection();
String sql="insert into Student (id, name) values(?,?)";
PreparedStatement pstmt;try{
pstmt=(PreparedStatement)conn.prepareStatement(sql);
pstmt.setString(1,stu.get_id());
pstmt.setString(2,stu.get_name());
i=pstmt.executeUpdate();
pstmt.close();
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}returni;
}public intdelete(String id)
{int i=0;
Util util=newUtil();
Connection conn=util.getConnection();
String sql="delete from Student where id='"+id+"'";
PreparedStatement pstmt;try{
pstmt=conn.prepareStatement(sql);
i=pstmt.executeUpdate();
System.out.println("result line:"+i);
pstmt.close();
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}returni;
}public intupdate(Student stu)
{int i=0;
Util util=newUtil();
Connection conn=util.getConnection();
String sql="update Student set name='"+stu.get_name()+"' where id='"+stu.get_id()+"'";
PreparedStatement pstmt;try{
pstmt=(PreparedStatement)conn.prepareStatement(sql);
i=pstmt.executeUpdate();
System.out.println("result:"+i);
pstmt.close();
conn.close();
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}returni;
}public voidlist()
{
Util util=newUtil();
Connection conn=util.getConnection();
String sql="select * from Student";
PreparedStatement pstmt;try{
pstmt=(PreparedStatement)conn.prepareStatement(sql);
ResultSet rs=pstmt.executeQuery();int col=rs.getMetaData().getColumnCount();
System.out.println("====================");
System.out.println("id\tname\t");while(rs.next())
{for(int i=1;i<=col;i++)
System.out.print(rs.getString(i)+"\t");
System.out.println("");
}
System.out.println("====================");
}catch(SQLException e)
{
e.printStackTrace();
}finally{
util.closeConnection(conn);
}
}
};
View Code
8. 简单进行调试(可以在Main.java中实现)
packagetest;import java.sql.*;classMain
{public static void main(String[] args) throwsClassNotFoundException, SQLException
{
Student stu=newStudent();
Operation op=newOperation();
stu.set_id("001");
stu.set_name("liurunky");
op.insert(stu);
op.list();
stu.set_name("llq");
op.update(stu);
op.list();
stu.set_id("114514");
stu.set_name("sodayo");
op.insert(stu);
op.list();
op.delete("114514");
op.list();
}
};
输出结果如下:
====================
idname
001liurunky
====================
result line:1
====================
idname
001llq
====================
====================
idname
001llq
114514sodayo
====================
result line:1
====================
idname
001llq
====================
整挺好。
如果写成用while不停获取指令,就可以靠输入进行各种操作了(不过这跟直接用SQL也没太大区别吧...也就指令短一点)。
packagetest;import java.sql.*;importjava.util.Scanner;classMain
{public static void main(String[] args) throwsClassNotFoundException, SQLException
{
Scanner sc=newScanner(System.in);
Student stu=newStudent();
Operation op=newOperation();while(true)
{
String opt=sc.next();if(opt.equals("insert"))
{
String id=sc.next(),name=sc.next();
stu.set_id(id);
stu.set_name(name);
op.insert(stu);
}if(opt.equals("delete"))
{
String id=sc.next();
op.delete(id);
}if(opt.equals("update"))
{
String id=sc.next(),name=sc.next();
stu.set_id(id);
stu.set_name(name);
op.update(stu);
}if(opt.equals("end"))break;
op.list();
}
sc.close();
}
};
软件实践作业要用JDBC是怎么回事呢?软件实践相信大家都很熟悉,但是软件实践作业要用JDBC是怎么回事呢,下面就让小编带大家一起了解吧。
软件实践作业要用JDBC,其实就是上课不讲JDBC,大家可能会很惊讶软件实践怎么会作业要用JDBC呢?但事实就是这样,小编也感到非常惊讶。
这就是关于软件实践作业要用JDBC的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!