1. 概述
JDBC(Java Data Base Connectivity的缩写)是Java程序操作数据库的API,使用JDBC操作数据库,需要数据库厂商提供数据库的驱动程序。
1.1 Eclipse导入mysql驱动包
-
下载
mysql-connector-java-8.0.22.jar
,复制一份到WEB-INF下的lib文件夹中
-
项目名上右键选择
Build Path
,Configure Build Path...
,在Module中添加刚才的jar包
-
使用时在文件中引入:
import java.sql.*
或<%@page import = "java.sql.*"%>
1.2 JAVA连接数据库
大致分为三步
- 注册数据库驱动
将数据库厂商提供的数据库驱动类注册到JDBC的驱动管理器中
Class.forName("com.mysql.cj.jdbc.Driver");//新版本
//旧版本使用的是Class.forName("com.mysql.jdbc.Driver");
- 构建数据库连接URL
基本格式为JDBC协议+IP地址或域名+端口+数据库名称
注意这里的useSSL=false&serverTimezone=GMT%2B8"
是必须的,GMT%2B8
代表选择北京东八区,也可以设置为UTC
美国时间,useSSL
代表是否使用SSL连接
String url = "jdbc:mysql://localhost:3306/database_name?useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "密码串";
- 与数据库建立连接得到Connection
Connection conn = DriverManager.getConnection(url,user,password);
if(Conn != null){
//连接成功
Conn.close();
}
这些步骤均需要放在try catch
块中,实例如下
<%
try{
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/sql_jdbc?useSSL=false&serverTimezone=GMT%2B8";
Connection conn = DriverManager.getConnection(url,"root","密码串");
if(conn != null){
System.out.println("连接成功");
conn.close();
}
else{
System.out.println("连接失败");
}
}catch(Exception e){
System.out.println("出错");
e.printStackTrace();
}
%>
2. API
2.1 Connection接口
Connection接口位于java.sql包中,是与数据库的连接会话。只有获得该对象,才能访问和操作数据库。
2.2 DriverManager类
DriverManager类作用于用户及驱动程序之间,它是JDBC中的管理层,通过DriverManager类可以管理数据库厂商提供的驱动程序,并建立应用程序与数据库之间的连接。
2.3 Statement接口
Statement接口提供了执行sql语句和获取查询结果的基本方法。
2.4 PreparedStatement接口
继承于Statement接口。
- 可以使用占位符“?”来代替SQL语句中的参数,然后再对其进行赋值。
- SQL执行效率更高,且可以避免SQL语句的注入式攻击。
使用占位符的时候注意下标从1开始
占位符的使用和批处理方法如下
try {
String sql = "insert into tb_student_batch(id,name,sex,age) values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
Random random = new Random();
for(int i=0;i<10;i++){
ps.setInt(1, i+1);
ps.setString(2, "学生"+i);
ps.setBoolean(3, i%2==0?true:false);
ps.setInt(4, random.nextInt(5)+10);
ps.addBatch(); //添加批处理命令
}
int[] rows = ps.executeBatch(); //执行批处理操作并返回计数组成的数组
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
ResultSet接口
使用ResultSet对象接收查询结果集。 ResultSet对象包含了符合SQL语句的所有行,针对Java中的数据类型提供了GetXXX方法,通过这些方法可以获得每一行的数据。除此之外, ResultSet还提供了光标功能。
next
方法中,如果当前位置下一行没有行,则此方法返回false,否则返回true ,可以这样获得rs结果集的行数
int tmp = 0;
while (rs.next()) {
++tmp;
}
注意光标位置
👆啊我现在对它存疑了,在有效结果的最后一行处调用next返回false,也许没有在最后一行后面加空行,待考证。
3. 操作数据库
3.1 增
插入语句
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
(1) 注意操作都要放在trycatch块中
(2) 注意insert语句中字符串要加引号QAQ
index.jsp
<form action="MyServlet" method="post">
<table>
<tr>
<td>名</td>
<td><input type="text" name="u_id"></input></td>
</tr>
<tr>
<td>密码</td>
<td><input type="text" name="u_pass"></input></td>
</tr>
<tr>
<td>数目</td>
<td><input type="text" name="u_num"></input></td>
</tr>
<tr>
<td><input type="submit" /></td>
</tr>
</table>
</form>
MyServlet.servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();//向浏览器发送数据,可以显示在MyServlet的http页面上
// 设置JavaBean的值
Bean MyBean = new Bean();
MyBean.setU_id(request.getParameter("u_id"));
MyBean.setU_pass(request.getParameter("u_pass"));
MyBean.setU_num(Integer.parseInt(request.getParameter("u_num")));
// 建立SQL语句
String sql = "insert into my_table (u_id,u_pass,u_num) values('" + MyBean.getU_id() + "','" + MyBean.getU_pass()
+ "'," + Integer.toString(MyBean.getU_num()) + ")";
out.print(sql+"<br>");
// 更新数据库
int row = DB.update(sql);
out.print(row+"<br>");
out.flush();//这个要有
out.close();//这个要有
DB.close();//这个要有
}
DB.java
package com.caut.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class DB {
// 连接数据库
private static final String DRIVERNAME = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/sql_jdbc?useSSL=false&serverTimezone=GMT%2B8";
private static final String USER = "root";
private static final String PASSWORD = "20011017lh";
// 操作数据库
private static Connection conn;
private static Statement sta;
private static PreparedStatement psta;
private static ResultSet rs;
private static int row = 0;
// 与数据库建立连接
public static Connection getConnection() {
try {
Class.forName(DRIVERNAME);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
if (conn != null) {
System.out.println("连接成功");
} else {
System.out.println("连接失败");
}
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 释放资源
public static void close() {
try {
if (rs != null)
rs.close();
if (sta != null)
sta.close();
if (psta != null)
psta.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 更新数据库
public static int update(String sql) {
try {
getConnection();
psta = conn.prepareStatement(sql);
row = psta.executeUpdate();
return row;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
// 查询数据库
public static ResultSet query(String sql) {
try {
getConnection();
psta = conn.prepareStatement(sql);
rs = psta.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}
}
3.2 删
删除语句
DELETE FROM table_name [WHERE Clause]
MyServlet.servlet
中的SQL语句改成
String sql = "delete from my_table where u_id='" + MyBean.getU_id() + "' and u_pass='" + MyBean.getU_pass()
+ "' and u_num=" + MyBean.getU_num();
3.3 改
修改语句
UPDATE table_name SET field1=new_value1, field2=new_value2
[WHERE Clause]
MyServlet.servlet
中的SQL语句改成
String sql = "update my_table set u_pass='" + MyBean.getU_pass() + "', u_num=" + MyBean.getU_num()
+ " where u_id='" + MyBean.getU_id() + "'";
3.4 查
查询语句
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
在DB.java
中添加查询方法,注意这里不能提前close
了,因为ResultSet关闭之后无法进行操作,也就不能查看查询的数据了
// 查询数据库
public static ResultSet query(String sql) {
try {
getConnection();
psta = conn.prepareStatement(sql);
rs = psta.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}
在MyServlet.java
中,引入相关包
import java.sql.ResultSet;
import java.sql.SQLException;
查询改为
// 建立SQL语句
String sql = "select * from my_table where u_id='" + MyBean.getU_id() + "'";
System.out.println(sql);
// 查询数据库
ResultSet rs = DB.query(sql);
try {
while (rs.next()) {
String now = "u_id = " + rs.getString("u_id") + ", u_pass = " + rs.getString("u_pass") + ", u_num = "
+ rs.getInt("u_num");
System.out.println(now);
}
DB.close();
} catch (SQLException e) {
e.printStackTrace();
}
杂
在操作进行完之后close,否则会报线程访问的错误
sql语句不区分大小写,如表名MyTable和mytable是一样的
查询结果为空的时候,返回一个空行,即rs.next()返回零