JAVAWEB 中JDBC 常见知识点(一)
导读:{
【1】什么是JDBC (JAVA DataBase Connectivity : java 数据库连接
)?
【2】如何连接数据库?
【2.1】需要对应数据库的驱动jar 包 (Mysql 对应: Mysql-connector-java-5.17.jar,不同的数据库对应不用的jar 包)放入到 web root/WEB-INF/lib/ 目录下面
【2.2】基本流程
【3】JDBC 的基本操作
(1)注册加载数据库驱动有下面三种方式
(2)对数据库的 增 删 改 查
(2.0) Statement 和 PreparedStatement 的区别:
(2.1)实现对数据库的查询操作。
(2.2)实现对数据库的增加数据
(2.3)实现对数据库的 删除数据操作。
(2.4)实现对数据库的 修改操作。
}
【1】什么是JDBC (JAVA DataBase Connectivity : java 数据库连接)?
是
一套用于执行
SQL
语句的
Java API
。
应用程序可通过这套
API
连接到关系数据库,
并使用
SQL
语句来完成对数据库中数据的
查询
、
更新
和
删除
等操作。
【2】如何连接数据库?
可以看出我们 需要有一个 对应数据库的驱动jar 文件,实现Driver 接口注册,再通过DiverManger 类来获取数据库的连接。
【2.1】需要对应数据库的驱动jar 包 (Mysql 对应: Mysql-connector-java-5.17.jar,不同的数据库对应不用的jar 包)放入到 web root/WEB-INF/lib/ 目录下面
注意:记得先把电脑中的mysql 数据库的服务开启 ,否则不可能连接上 数据库的。
小知识点:开启数据库服务的方法
(1)点击windos 键,在弹出的搜索框中,输入cmd,右键
“管理员身份运行”
打开
(2)输入 net start mysql ,这样就能开启mysql 服务了。
(我的这个是开启过了,有时候你清内存的时候,会把mysql 的服务关掉,再开一下就好了。)
【2.2】基本流程
JDBCUtils.java 主要实现的功能就是,返回出数据库的连接,释放数据库连接的资源
(1)注册Mysql 的驱动程序,通过反射拿到
com.mysql.jdbc.Driver 这个类
(2)通过Mysql 的驱动管理者(DriverManager),返回数据库的连接(Connection)。
再获取数据库的连接时,需要设置 mysql 的路径,数据库用户名,数据库密码
{
static
String
url
=
"jdbc:mysql://localhost:3306/test"
;
static
String
user
=
"root"
;
static
String
password
=
"111"
;
}
(3)通过数据库连接对象(Connection) 获取用于执行sql 语句的类 Statement 对象(或者 PerpardStatemnt)
注意:执行查询的sql 语句的时候会返回一个结果集 (ResultSet)
(4)当执行完数据操作后,就需要关闭连接数据的资源(蓝色区域的部分)
原因:如果不关闭,会占用数据库的连接,可能导致后面的程序连接不上数据库。
所以这一部分的代码 最好写在 try ....finally{
}
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCdemo01 {
static String url = "jdbc:mysql://localhost:3306/test";
static String user = "root";
static String password = "111";
private static Connection connection; // 数据库连接
private static ResultSet executeQuery;
private static Statement statement;
-
public static void main(String[] args) {
try {
// [1] 加载数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
// [2] 连接Mysql数据库,拿到数据库连接
connection = DriverManager.getConnection(url, user, password);
// [3] 获取到可以执行sql语句的对象 statement
statement = connection.createStatement();
// [4] 执行sql语句 查询
executeQuery = statement.executeQuery("select * from user");
//推荐直接使用预编译的statement 对象,执行sql语句
// connection.prepareStatement(sql)
// 拿到我们需要的数据
while (executeQuery.next()) {
int id = executeQuery.getInt("id");
String name = executeQuery.getString("name");
String password = executeQuery.getString("password");
String email = executeQuery.getString("email");
String birthday = executeQuery.getString("birthday");
System.out.println(id+""+name+""+password+""+email+""+birthday);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (executeQuery!=null) {
try {
executeQuery.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executeQuery=null;
}
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
statement=null;
}
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection=null;
}
}
}
}
【3】JDBC 的基本操作
(1)注册加载数据库驱动有下面三种方式
显示注册
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
还可以使用这两种方式
(1.1)
Class.
forName
(
"com.mysql.jdbc.Driver"
).newInstance();
(1.2)
Class.
forName
(
"com.mysql.jdbc.Driver"
); // 我们查看源码会发现,执行forName 会调用newInstance() ,所以跟上面的方法一样。
(2)对数据库的 增 删 改 查
当我们使用Statement (或者 PreparedStatement)对数据库的增删改查 ,其中 增加,删除,修改 都是执行executeUpdate()方法 操作,查询是 executeQuary() 方法的操作,并且查询操作会返回一个结果集(ResultSet)。
(2.0) Statement 和 PreparedStatement 的区别:
我们可以利用 Statement 来实现对数据库的增删改查,我们只需要组织出正确的sql 语句,就可以实现。但是我们所写的sql 语句不可以使用参数代替。也就是(?)代替。
PreparedStatement 继承于 Statement 重写了Statement 的所有方法。
PreparedStatement 允许使用不完整的 sql 语句,空缺的值使用(?)代替,直到执行的时候,再输入进去就可以了。
例子:
使用Statement
Statement createStatement = conn.createStatement();
int executeUpdate2 = createStatement.executeUpdate("insert into user(name,password) values('1','2')");
使用 preparedStatement
//创建预编译语句对象
pstmt = conn.prepareStatement("insert into user(name,password) values(?,?)");
//给4个占位符赋值
pstmt.setString(1, "ww");
pstmt.setString(2, "789");
//执行SQL语句(增加记录)
int n = pstmt.executeUpdate();
所以推荐使用
preparedStatement
流行的框架中都倾向使用它。
下面的例子基本都是使用
preparedStatement 来操作。
(2.1)实现对数据库的查询操作。
package demo;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Ex01 {
/**
* 演示:JDBC访问数据库的操作步骤 查询
*/
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1、加载驱动程序
Class.forName("com.mysql.jdbc.Driver").newInstance();
// 2、通过DriverManager建立数据库连接 Driver 驱动
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "111";
conn = DriverManager.getConnection(url, user, password);
// 3.通过Connection获取语句对象Statement (声明)
stmt = conn.createStatement();
// 4.使用语句对象执行SQL语句
rs = stmt.executeQuery("select * from user");
// 5.遍历结果集
while (rs.next()) {
// 取出当前行各个字段的值
int id = rs.getInt("id");
String name = rs.getString("name");
String pwd = rs.getString("password");
-
System.out.println(id + " " + name + " " + pwd);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {// 一定会执行的代码块,无论是否发生异常
// 6.释放相关资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}
}
}
我们操作的是 test 数据库中的 user 表,执行的sql 语句是
"select * from user"
遍历结果集 拿到我们在表中存放的数据。
(2.2)实现对数据库的增加数据
package demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class Ex02 {
/**
* 演示:预编译语句对象PreparedStatemet的使用
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "111";
conn = DriverManager.getConnection(url, user, password);
pstmt = conn
.prepareStatement("insert into user(name,password,email,birthday) values(?,?,?,?)");
// 给4个占位符赋值
pstmt.setString(1, "ww");
pstmt.setString(2, "789");
pstmt.setString(3, "[email protected]");
pstmt.setDate(4, Date.valueOf("2016-01-01"));
// 执行SQL语句(增加记录)
int n = pstmt.executeUpdate();
if (n > 0) {
System.out.println("增加记录成功");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pstmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
在使用
executeUpdate() 方法时,会返回一个 int 类型,我们可以根据 这个int 值是否大于0 来,判断我们的操作是否成功。
(2.3)实现对数据库的 删除数据操作。
//根据Id删除记录
pstmt = conn.prepareStatement("delete from user where id=?");
pstmt.setInt(1, id);
int n = pstmt.executeUpdate();
if(n>0){
return true; // 操作成功
}else{
return false; // 操作石板
}
(2.4)实现对数据库的 修改操作。
根据id 修改数据
pstmt = conn.prepareStatement("update user set name=?,password=?,email=?,birthday=? where id=?");
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getEmail());
pstmt.setDate(4, user.getBirthday());
pstmt.setInt(5, user.getId());
int n = pstmt.executeUpdate();
if(n>0){
return true;
}else{
return false;
}