在数据库中,数据是可以以表格的形式存储的,每个表格中都包含若干条记录,每条记录包含若干个字段,这相比IO流 可以更方便地进行数据的查询、插入、删除和更新操作。数据库系统可以支持大规模数据存储和访问。如果存储的数据量或者访问量很大,就需要使用数据库系统来解决相应的性能问题。另外数据库系统具有更好的跨平台性。不同的操作系统和编程语言都可以使用同一个数据库系统。
一、基本操作之CRUD
先创建一个表格
增加
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8","root", "admin");
Statement s = c.createStatement();
)
{
String sql = "insert into good values("abt",10.0)";
s.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
删除
//核心代码
String sql = "delete from goods where Sname = apple";
修改
//核心代码
String sql = "update goods set Sprice = 12.0 where Sname = "apple"";
查询
String sql = "select * from goods";
// 执行查询语句,并把结果集返回给ResultSet
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
int a = rs.getInt("age");// 可以使用字段名
String name = rs.getString(2);// 也可以使用字段的顺序
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
}
// 不一定要在这里关闭ReultSet,因为Statement关闭的时候,会自动关闭ResultSet
二、发现的问题
这里Class.forName("com.mysql.cj.jdbc.Driver");不能放入try-with-resorce里,这是因为Class.forName()
方法返回的是一个Class,不是实现 java.lang.AutoCloseable
或 java.io.Closeable
接口的资源,而 Connection
, Statement
和 ResultSet
实现了 java.sql.Connection
接口,所以它们都是可关闭的资源,并且可以在 try-with-resources
块内使用并自动关闭。
在Connection c = DriverManager .getConnection语句中,我们查看源码发现Connection是一个接口,getConnection返回的是一个接口对象,这个对象其实是由 JDBC 驱动程序提供的,如下图。
DriverManager
类属于 JDBC API 中的 java.sql
包中,用来管理 JDBC 驱动程序。DriverManager
可以加载多个不同的 JDBC 驱动程序,并且根据提供的 URL 返回适当的 java.sql.Connection
对象。因此,我们可以通过 DriverManager
来获取与特定数据库的连接。
java.sql.Connection
接口属于 JDBC API 中的 java.sql
包中,用来表示与数据库的连接。Connection
接口定义了与数据库交互的一系列方法,例如执行 SQL 语句、提交事务、设置提交模式等等。DriverManager.getConnection()
方法返回的是 java.sql.Connection
接口的一个实现类的对象,这个对象实际上是某个 JDBC 驱动程序提供的。