上一章讲解了JSP的高级标签运用,链接:EL表达式 && JSTL标签库
任何软件,除去文档和程序以外,剩下的就是数据了。那么在学习JavaWeb的途中就得学会对数据库的访问,就得提及JDBC。
目录
何为JDBC?
JDBC(Java Database Connectivity)就是Java数据库连接,说白了就是使用Java语言向数据库发送SQL语句来操作数据库。
JDBC的组成
提及一下以前的历史,SUN公司与各大数据库厂商讨论,最终得出一个结论:由SUN公司提供一套访问数据库的规范(一组接口),并提供连接数据库的协议标准,然后各大数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API。而SUN公司提供的规范命名为JDBC,而各个厂商提供的遵循了JDBC规范的访问所属数据库的API被称之为驱动。
那么就可以得出JDBC地组成:JDBC Driver Interface 以及 JDBC API。
JDBC Driver Interface:是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库。
JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行。那么要把这些通用的API翻译成特定数据库能懂的"指令",就要由JDBC Driver Interface来实现了。
JDBC的使用
JDBC有四大配置参数:驱动类名称、连接的数据库url、用户名以及密码。对于数据库url来说,不同的数据库厂商有不同的数据库格式。接下来使用其对数据库进行增删查改,以MYSQL数据库为例。
首先是连接数据库模块:
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student";
String userName = "root";
String password = "123456";
// 1.加载驱动
Class.forName(driverClassName);
// 2.获得Connection
Connection con = DriverManager.getConnection(url, userName, password);
值得一提的是,其中加载驱动类是可以省略的,但为了兼容低版本的JDBC,还是写上为妙。因为在JDBC4.0后,每个驱动的Jar包中,在META-INF/services目录下提供了一个名为java.sql.Driver的文件,文件的内容就是该接口的实现类名称,即如下所示:
回到正题,这几串代码又是如何产生联系的呢?找到com.mysql.jdbc.Driver的源文件,其中有一个static块,块内的代码如下所示:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
从块内的代码来看,块内的内容就是把自己(驱动)注册到DriverManager中。那么当执行Class.forName方法时就会初始化驱动类,并且自行执行static块内的代码,以达到注册驱动的目的。
接下来对数据库进行增删改查,其顺序是通过Connection得到Statement对象,再由Statement对象发送sql语句。
先创建一个message表,相关字段设置如下所示:
CREATE TABLE message (
number char(15) PRIMARY KEY,
name char(15),
age int(5)
);
添加、改变、删除记录
Connection con = null;
try {
// 连接数据库的四大参数
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student";
String userName = "root";
String password = "123456";
// 1.加载驱动
Class.forName(driverClassName);
// 2.获得Connection
con = DriverManager.getConnection(url, userName, password);
// 3.通过Connection得到Statement对象
Statement stmt = con.createStatement();
// 4.使用Statement发送sql语句
// String sql = "INSERT INTO message VALUES('0001', 'zhangsan', 18)";
// String sql = "UPDATE message SET age=30 where number='0001'";
String sql = "DELETE FROM message";
// 返回影响的行数
int total = stmt.executeUpdate(sql);
System.out.println(total);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e.getMessage());
} finally {
if (con != null)
con.close();
}
结果如图所示:
查询记录
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student";
String userName = "root";
String password = "123456";
// 1.加载驱动
Class.forName(driverClassName);
// 2.获得Connection
con = DriverManager.getConnection(url, userName, password);
// 3.通过Connection得到Statement对象
stmt = con.createStatement();
// 4.使用Statement发送sql语句
String sql = "SELECT * FROM message";
// 返回结果集
rs = stmt.executeQuery(sql);
while (rs.next()) {
// 可以用数字代表表中的第几列获取记录
String id = rs.getString(1);
// 也可以直接用表中的列名获取记录
// rs.getString("number");
String name = rs.getString(2);
int age = rs.getInt(3);
System.out.println(id + "---" + name + "---" + age);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e.getMessage());
} finally {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (con != null) con.close();
}
结果如图所示: