使用jdbc查询MySQL_使用JDBC连接MySQL并实现增删查

不靠谱教程的受害者决定还是自己写一下...

毕竟短学期还要做大作业...

~ 下载与安装MySQL ~

2. 下载完成后,点开.msi,加载一段时间后会出现如下窗口:

6fbfc20ba843742ba9d1bd2a84ce3f1e.png

3. 选择accept之后点击next,会进入下一个窗口:

96abfdc31b374ab4abc6a987fa00d875.png

我安装的那个版本在右下方还有两个选项。其实只需要最基本的功能就行了,不需要将所有功能全部安装。

4. 接着,会开始检查一些软件的配置情况:

1fe58630d05a0da54c62fcd20c5829e1.png

在这张图片中,status没有显示Mannual的可以由软件帮忙自动安装。只有Visual Studio和Python是需要自己安装的。我自己出现的情况是,即使安装了Visual Studio,在检查的时候仍然显示failing。然后我直接点了next,也能继续安装。

5. 之后可以一路next,直到遇到这个界面:

d02a12c6513b721a56cefc6615194796.png

其实这个密码完全可以不设置,因为我们只是随便玩玩。这个设置的密码是user为root的密码。

之后继续一路next,即可完成安装。

~ 在MySQL中新建Table ~

1. 安装完成后,应该可以在注册表中找到Command Line Client的快捷方式了:

2f0d8b617f6d7a73fbb143a3724b213e.png

2. 点开快捷方式,先输入密码,然后创建database(也可用已有的)。几条可用的指令如下:

create database test; (创建名为test的database)

show databases; (显示已有的database)

use test; (进入名为test的database)

a485c0eea2d4887c1f34f92860622e41.png

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)

9586c4fa0035a4023ca48a86e3aebe17.png

这样一来,在MySQL中的设置就基本完成了。

~ 用JDBC连接MySQL并实现各操作 ~

1. 在eclipse里面新建一个Java Project。

6230ed8c203236a1f4919a31800635fc.png

之后在Build Path > Configure Build Path中导入mysql connector。下载链接见:https://dev.mysql.com/downloads/connector/j/,我选的是Platform Independent的.zip类型。

43ee4c191f70746a817e19e8cc364ecd.png

e5a0d8ebd4bc6020fdb5c816c2159509.png

在Libraries > Add External JARs中选中下载后的.jar文件

26680d57fd6f5553a56e5c9d52ef0736.png

1c13c541b628000cfd886803175db02c.png

点击Apply后,Project中就会出现Referenced Libraries了。

8e51e8f3d50a0f4e08ab5a926ce11bc6.png

2. 接着在这个Project里面新建一个Package。

dbcff12b3296308831b090fbd73320a4.png

所有需要我们写的代码都放在这个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:用于测试。

d03d173378e787aaba0b63a1a1cf68b4.png

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();

}

}

完整代码如下(就是把前面的拼起来):

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

}

}

完整代码如下(就是把前面拼起来):

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值