老杜 JavaWeb 讲解(四) ——Servlet编写JDBC连接数据库
老杜 JavaWeb 讲解
对应视频:
(六) 在Servlet(Java小程序)中编写JDBC连接数据库
6.1 JDBC介绍:
JDBC的全称是Java数据库连接 (Java Database connect),它是一套用于执行SQL语句的Java API。[1] JDBC(Java Data Base Connectivity)是Java编程语言中用来规范客户端程序如何进行访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
JDBC主要由两部分组成,一是JDBC API,这是使用Java语言访问数据库的标准,提供了使用Java语言访问不同数据库的标准接口,可以编写与平台和数据库无关的代码;二是JDBC驱动,它是一组实现JDBC API的类库,它负责完成Java程序与真实数据库之间的连接,通过实现JDBC API中的接口来达到这个目的。
通过 JDBC API,应用程序可以使用与平台和数据库无关的 SQL 语句和数据类型来访问数据库,并执行查询、更新、插入和删除等操作。[2] JDBC API 提供了以下核心类和接口:DriverManager 类、Connection 接口、Statement 接口、PreparedStatement 接口、CallableStatement 接口、ResultSet 接口等。
在使用 JDBC 连接数据库时,需要完成以下步骤:
- 加载数据库驱动程序。
- 获取连接对象。
- 创建 Statement 对象。
- 执行 SQL 语句。
- 处理结果集。
- 关闭对象。
为了防止 SQL 注入攻击,提高程序的性能,还可以使用 PreparedStatement 预编译 SQL 语句。同时,还可以使用连接池技术,避免频繁地创建和销毁数据库连接,从而提高程序的性能。[1] [2]
样例代码:
import java.sql.*; public class Main { public static void main(String[] args) { try { // 加载数据库驱动程序 Class.forName("com.mysql.cj.jdbc.Driver"); // 获取连接对象 String url = "jdbc:mysql://localhost:3306/ZWM"; String user = "root"; String password = "root"; Connection conn = DriverManager.getConnection(url, user, password); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 执行 SQL 语句 String sql = "SELECT no, name FROM t_student"; ResultSet rs = stmt.executeQuery(sql); // 处理结果集 while (rs.next()) { String no = rs.getString("no"); String name = rs.getString("name"); System.out.println(no + "\t" + name); } // 关闭对象 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
知识点:
-
Class.forName("com.mysql.cj.jdbc.Driver");与 Class.forName("com.mysql.jdbc.Driver"); 的区别
Class.forName("com.mysql.cj.jdbc.Driver")
与Class.forName("com.mysql.jdbc.Driver")
的主要区别在于 JDBC 驱动版本不同。com.mysql.cj.jdbc.Driver
是 MySQL Connector/J 5.1 的驱动类,而com.mysql.jdbc.Driver
是早期版本的 MySQL Connector/J 的驱动类。MySQL Connector/J 5.1 和早期版本的 MySQL Connector/J 在 API 和实现上有一些不同之处。从功能、性能和稳定性等角度考虑,推荐使用新版的 MySQL Connector/J 5.1。
在使用 MySQL Connector/J 建立连接时,需要注意以下几点:
- 加载驱动类:在 Java 8 及以后版本中,可以省略掉
Class.forName()
方法,因为 JDBC 4.0 开始自动查找并加载 Driver 类; - 建立连接:通过
DriverManager.getConnection()
方法建立连接,并指定连接字符串、用户名和密码; - 使用连接对象执行 SQL 命令:通过 Connection 对象的 createStatement() 或 prepareStatement() 方法创建 Statement 或 PreparedStatement 对象,然后使用它们执行 SQL 命令;
- 关闭资源:处理完数据库操作后,需要关闭 ResultSet、Statement 和 Connection 对象,避免资源泄露。
- 加载驱动类:在 Java 8 及以后版本中,可以省略掉
6.2 Servlet中连接数据库:
- Servlet是Java程序,所以在Servlet中完全可以编写JDBC代码连接数据库。
- 在一个webapp中去连接数据库,需要将驱动jar包放到WEB-INF/lib目录下。(com.mysql.cj.jdbc.Driver 这个类就在驱动jar包当中。)
步骤:
-
编写相关代码(StudentServlet.java):
import jakarta.servlet.Servlet; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.ServletConfig; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.*; public class StudentServlet implements Servlet{ public void init(ServletConfig config) throws ServletException{ } public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{ //将获取的数据打印到页面上 response.setContentType("text/html"); PrintWriter out = response.getWriter(); //编写JDBC代码,连接数据库,查询所有学生的信息。 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //获取连接 String url = "jdbc:mysql://localhost:3306/ZWM"; String user = "root"; String password = "root"; conn = DriverManager.getConnection(url, user, password); //获取预编译的数据库操作对象 String sql = "SELECT * FROM t_student"; ps = conn.prepareStatement(sql); //执行SQL rs = ps.executeQuery(); //处理查询结果集 while (rs.next()) { String no = rs.getString("no"); String name = rs.getString("name"); System.out.println("no: " + no + ", name: " + name); out.print("no: " + no + ", name: " + name+"<br>"); } } catch (Exception e) { e.printStackTrace(); } finally { //释放资源 if(rs!=null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if(ps!=null){ try { ps.close(); } catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } } public void destroy(){ } public String getServletInfo(){ return ""; } public ServletConfig getServletConfig(){ return null; } }
-
导入相关jar包:
将驱动jar包放到WEB-INF/lib目录下
-
编译java文件,生成class文件,将class文件移动至项目下的WEB-INF文件夹下的classes文件夹中。
-
在web.xml文件中配置Servlet
<servlet> <servlet-name>a2_JDBC</servlet-name> <servlet-class>StudentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>a2_JDBC</servlet-name> <url-pattern>/student</url-pattern> </servlet-mapping>
-
启动tomcat,访问 http://localhost:8080/crm/student 访问相关页面。
文理双修:
5.《菩萨蛮·书江西造口壁》宋朝·辛弃疾
郁孤台下清江水,中间多少行人泪。西北望长安,可怜无数山。
青山遮不住,毕竟东流去。江晚正愁余,山深闻鹧鸪。
译文:
郁孤台下这赣江的水,水中有多少行人的眼泪。我举头眺望西北的长安,可惜只看到无数青山。
但青山怎能把江水挡住?江水毕竟还会向东流去。夕阳西下我正满怀愁绪,听到深山里传来鹧鸪的鸣叫声。