1)JBDC簡介:
JBDC 是java數據庫鏈接技術的簡稱,提供鏈接各種常用數據庫的能力
JBDC的工作原理:
JBDC API:
提供者:Sun公司
內容:供程序員調用的接口與類,集成在 Java.sql 和 javax.sql 包中,
如:
DriverManager 類:
Connection接口:
Statement接口:
ResultSet接口:
DriverManager:
提供者:Sun公司
作用:管理各種不同的JBDC驅動
JBDC驅動:
提供者:數據庫廠商
作用:負責鏈接各種不同的數據庫
JBDC API主要功能:
與數據庫建立連接、執行SQL語句、處理結果
DriverManager: 依據數據庫的不同,管理JDBC驅動
Connection:負責鏈接數據庫並擔任傳送數據的任務
Statement: 由Connection 產生、負責執行SQL語句
ResultSet :負責保存Statement 執行後所產生的查詢結果
2)連接數據庫庫
JBDC驅動由數據庫廠商提供:
在個人開發測試中,可以使用JBDC-ODBC橋連方式
在生產型開發中,推薦使用純java 驅動方式
使用JBDC - OBDC 橋方式連接數據庫
將對JBDC API 的調用,轉換爲對另一組數據庫連接API的調用
優點:可以訪問所有ODBC可以訪問的數據庫
缺點:執行效率低、功能不夠強大
=====================================================================
JDBC驅動:
使用純java方式連接數據庫
由JDBC驅動直接訪問數據庫
優點:100% java,快又可跨平臺
缺點:訪問不同的數據庫需要下載專用的JDBC驅動
在使用純java方式連接數據庫之前需要先引用相關架包
下載地址:https://download.csdn.net/download/qq_41303423/10291176
引用完後就可以使用了。以下代碼演示,如若拷貝代碼,請註釋記錄日誌代碼,以免有錯誤
使用純java方式連接數據庫的步驟:
1.加載驅動 2.建立連接 3.異常處理 4.關閉連接
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 純java方式連接關閉數據庫
*<p>Title:Text01</p>
*<p>Description:</p>
*<p>Company:</p>
* @author MLQ
* @date 2018年3月16日 下午5:21:42
*/
public class Text01 {
//記錄日誌
private static Logger log=LoggerFactory.getLogger(Text01.class);
public static void main(String[] args) {
Connection con=null;
//1.加載驅動
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立連接
try {
/**
* localhost:3306 本地
* Library:要操作的數據庫
* text:用戶名
* 123:密碼
*/
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
System.out.println("建立連接成功");
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(con!=null){
con.close();
System.out.println("關閉連接成功");
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
}
}
3)使用 Statement 和 ResultSet
Statement常用方法:
ResultSet常用方法:
代碼演示向數據庫添加信息:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Text02 {
private static Logger log=LoggerFactory.getLogger(Text02.class);
public static void main(String[] args) {
//連接數據庫
Connection con=null;
//向數據庫發送信息
Statement stmt=null;
//1.加載驅動
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立連接
try {
/**
* localhost:3306 本地
* Library:要操作的數據庫
* text:用戶名
* 123:密碼
*/
StringBuffer sql=new StringBuffer();
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//發送給數據庫命令,並執行sql語句
stmt=con.createStatement();
//拼接sql語句
//INSERT INTO `reader` VALUES('006','測試',4,'吳名區');
sql.append("INSERT INTO `reader` VALUES(");
sql.append("'007',");
sql.append("'測試1',");
sql.append("4,");
sql.append("'吳名區1');");
//執行sql
//boolean flog=stmt.execute(sql.toString());
int num=stmt.executeUpdate(sql.toString());
if(num>0)
{
System.out.println("插入成功");
}else
{
System.err.println("插入失敗!!!");
}
// if(flog)
// {
// System.out.println("插入成功");
// }else
// {
// System.err.println("插入失敗!!!");
// }
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
}
}
//對數據庫進行修改
public static void main(String[] args) {
//連接數據庫
Connection con=null;
//向數據庫發送信息
Statement stmt=null;
//1.加載驅動
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立連接
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//發送給數據庫命令,並執行sql語句
stmt=con.createStatement();
int num = stmt.executeUpdate("UPDATE `reader` SET `rName`='測試數據' WHERE `Rid`='007';");
if(num>0)
{
System.out.println("修改成功");
}else
{
System.err.println("修改失敗!!!");
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
//查詢數據庫中一張表的信息public static void main(String[] args) {
//連接數據庫
Connection con=null;
//向數據庫發送信息
Statement stmt=null;
//定義一個容器
ResultSet set=null;
//1.加載驅動
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立連接
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//發送給數據庫命令,並執行sql語句
stmt=con.createStatement();
set=stmt.executeQuery("select * from reader");//把查詢到的信息保存到一個容器裏面
//循環讀取
System.out.println("編號\t姓名\t測試\t地址");
while(set.next())
{//循環所有行
System.out.print(set.getInt(1)+"\t");//輸出每一列
System.out.print(set.getString(2)+"\t");
System.out.print(set.getInt(3)+"\t");
System.out.println(set.getString(4));
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
4)PreparedStatement接口:
使用PreparedStatement接口
繼承自Statement接口
比Statement對象使用起來更加靈活,更有效率
代碼演示:
public static void main(String[] args) {
//連接數據庫
Connection con=null;
//向數據庫發送信息
PreparedStatement stmt=null;
//1.加載驅動
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立連接
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//發送給數據庫命令,並執行sql語句
stmt=con.prepareStatement("UPDATE `reader` SET `rName`=? WHERE `Rid`=?;");
stmt.setString(1, "判斷");
stmt.setInt(2, 007);
int num=stmt.executeUpdate();
if(num>0)
{
System.out.println("修改成功");
}else
{
System.err.println("修改失敗!!!");
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
}
}
5)PreparedStatement 與 Statement 執行SQL時的差異區別
數據庫User表 UserId爲:2018 密碼UserPwd:123
測試結果如下:
調用:statementText() 方法時可以登錄成功
調用:preparedStatementText() 方法時登陸失敗
具體詳情請參考以下代碼:
----------------------內容重置-------------------------
PreparedStatement接口繼承自Statement接口
提高了代碼的可讀性和維護性
提高了SQL語句執行性能和安全性
<--------僅供參考------->