21、jdbc入門1
jdbc入門
什麼是jdbc
使用java程式碼(程式)傳送sql語句的技術,就是jdbc技術!!!!
連線案例
/**
* jdbc連線資料庫
* @author APPle
*
*/
public class Demo1 {
//連線資料庫的URL
private String url = "jdbc:mysql://localhost:3306/day17";
// jdbc協議:資料庫子協議:主機:埠/連線的資料庫 //
private String user = "root";//使用者名稱
private String password = "root";//密碼
/**
* 第一種方法
* @throws Exception
*/
@Test
public void test1() throws Exception{
//1.建立驅動程式類物件
Driver driver = new com.mysql.jdbc.Driver(); //新版本
//Driver driver = new org.gjt.mm.mysql.Driver(); //舊版本
//設定使用者名稱和密碼
Properties props = new Properties();
props.setProperty("user", user);
props.setProperty("password", password);
//2.連線資料庫,返回連線物件
Connection conn = driver.connect(url, props);
System.out.println(conn);
}
/**
* 使用驅動管理器類連線資料庫(註冊了兩次,沒必要)
* @throws Exception
*/
@Test
public void test2() throws Exception{
Driver driver = new com.mysql.jdbc.Driver();
//Driver driver2 = new com.oracle.jdbc.Driver();
//1.註冊驅動程式(可以註冊多個驅動程式)
DriverManager.registerDriver(driver);
//DriverManager.registerDriver(driver2);
//2.連線到具體的資料庫
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
/**
* (推薦使用這種方式連線資料庫)
* 推薦使用載入驅動程式類 來 註冊驅動程式
* @throws Exception
*/
@Test
public void test3() throws Exception{
//Driver driver = new com.mysql.jdbc.Driver();
//通過得到位元組碼物件的方式載入靜態程式碼塊,從而註冊驅動程式
Class.forName("com.mysql.jdbc.Driver");
//Driver driver2 = new com.oracle.jdbc.Driver();
//1.註冊驅動程式(可以註冊多個驅動程式)
//DriverManager.registerDriver(driver);
//DriverManager.registerDriver(driver2);
//2.連線到具體的資料庫
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
}
核心API
|- Driver介面: 表示java驅動程式介面。所有的具體的資料庫廠商要來實現此介面。
|- connect(url, properties): 連線資料庫的方法。
url: 連線資料庫的URL
URL語法: jdbc協議:資料庫子協議://主機:埠/資料庫
user: 資料庫的使用者名稱
password: 資料庫使用者密碼
|- DriverManager類: 驅動管理器類,用於管理所有註冊的驅動程式
|-registerDriver(driver) : 註冊驅動類物件
|-Connection getConnection(url,user,password); 獲取連線物件
|- Connection介面: 表示java程式和資料庫的連線物件。
|- Statement createStatement() : 建立Statement物件
|- PreparedStatement prepareStatement(String sql) 建立PreparedStatement物件
|- CallableStatement prepareCall(String sql) 建立CallableStatement物件
|- Statement介面: 用於執行靜態的sql語句
|- int executeUpdate(String sql) : 執行靜態的更新sql語句(DDL,DML)
|- ResultSet executeQuery(String sql) :執行的靜態的查詢sql語句(DQL)
|-PreparedStatement介面:用於執行預編譯sql語句
|- int executeUpdate() : 執行預編譯的更新sql語句(DDL,DML)
|-ResultSet executeQuery() : 執行預編譯的查詢sql語句(DQL)
|-CallableStatement介面:用於執行儲存過程的sql語句(call xxx)
|-ResultSet executeQuery() : 呼叫儲存過程的方法
|- ResultSet介面:用於封裝查詢出來的資料
|- boolean next() : 將游標移動到下一行
|-getXX() : 獲取列的值
執行DDL
/**
* 執行DDL語句(建立表)
*/
@Test
public void test1(){
Statement stmt = null;
Connection conn = null;
try {
//1.驅動註冊程式
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連線物件
conn = DriverManager.getConnection(url, user, password);
//3.建立Statement
stmt = conn.createStatement();
//4.準備sql
String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))";
//5.傳送sql語句,執行sql語句,得到返回結果
int count = stmt.executeUpdate(sql);
//6.輸出
System.out.println("影響了"+count+"行!");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
//7.關閉連線(順序:後開啟的先關閉)
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
執行DML
PreparedStatement vs Statment
1)語法不同:PreparedStatement可以使用預編譯的sql,而Statment只能使用靜態的sql
2)效率不同: PreparedStatement可以使用sql快取區,效率比Statment高
3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
推薦使用PreparedStatement
/**
* 使用Statement執行DML語句
* @author APPle
*
*/
public class Demo2 {
private String url = "jdbc:mysql://localhost:3306/day17";
private String user = "root";
private String password = "root";
/**
* 增加
*/
@Test
public void testInsert(){
Connection conn = null;
Statement stmt = null;
try {
//通過工具類獲取連線物件
conn = JdbcUtil.getConnection();
//3.建立Statement物件
stmt = conn.createStatement();
//4.sql語句
String sql = "INSERT INTO student(NAME,gender) VALUES('李四','女')";
//5.執行sql
int count = stmt.executeUpdate(sql);
System.out.println("影響了"+count+"行");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
//關閉資源
/*if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}*/
JdbcUtil.close(conn, stmt);
}
}
/**
* 修改
*/
@Test
public void testUpdate(){
Connection conn = null;
Statement stmt = null;
//模擬使用者輸入
String name = "陳六";
int id = 3;
try {
/*//1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連線物件
conn = DriverManager.getConnection(url, user, password);*/
//通過工具類獲取連線物件
conn = JdbcUtil.getConnection();
//3.建立Statement物件
stmt = conn.createStatement();
//4.sql語句
String sql = "UPDATE student SET NAME='"+name+"' WHERE id="+id+"";
System.out.println(sql);
//5.執行sql
int count = stmt.executeUpdate(sql);
System.out.println("影響了"+count+"行");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
//關閉資源
/*if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}*/
JdbcUtil.close(conn, stmt);
}
}
/**
* 刪除
*/
@Test
public void testDelete(){
Connection conn = null;
Statement stmt = null;
//模擬使用者輸入
int id = 3;
try {
/*//1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連線物件
conn = DriverManager.getConnection(url, user, password);*/
//通過工具類獲取連線物件
conn = JdbcUtil.getConnection();
//3.建立Statement物件
stmt = conn.createStatement();
//4.sql語句
String sql = "DELETE FROM student WHERE id="+id+"";
System.out.println(sql);
//5.執行sql
int count = stmt.executeUpdate(sql);
System.out.println("影響了"+count+"行");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
//關閉資源
/*if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}*/
JdbcUtil.close(conn, stmt);
}
}
}
執行DQL
/**
* 使用Statement執行DQL語句(查詢操作)
* @author APPle
*/
public class Demo3 {
@Test
public void test1(){
Connection conn = null;
Statement stmt = null;
try{
//獲取連線
conn = JdbcUtil.getConnection();
//建立Statement
stmt = conn.createStatement();
//準備sql
String sql = "SELECT * FROM student";
//執行sql
ResultSet rs = stmt.executeQuery(sql);
//移動游標
/*boolean flag = rs.next();
flag = rs.next();
flag = rs.next();
if(flag){
//取出列值
//索引
int id = rs.getInt(1);
String name = rs.getString(2);
String gender = rs.getString(3);
System.out.println(id+","+name+","+gender);
//列名稱
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(id+","+name+","+gender);
}*/
//遍歷結果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(id+","+name+","+gender);
}
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, stmt);
}
}
}
使用PreparedStatement執行sql語句
public class Demo1 {
/**
* 增加
*/
@Test
public void testInsert() {
Connection conn = null;
PreparedStatement stmt = null;
try {
//1.獲取連線
conn = JdbcUtil.getConnection();
//2.準備預編譯的sql
String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一個引數的佔位符
//3.執行預編譯sql語句(檢查語法)
stmt = conn.prepareStatement(sql);
//4.設定引數值
/**
* 引數一: 引數位置 從1開始
*/
stmt.setString(1, "李四");
stmt.setString(2, "男");
//5.傳送引數,執行sql
int count = stmt.executeUpdate();
System.out.println("影響了"+count+"行");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt);
}
}
/**
* 修改
*/
@Test
public void testUpdate() {
Connection conn = null;
PreparedStatement stmt = null;
try {
//1.獲取連線
conn = JdbcUtil.getConnection();
//2.準備預編譯的sql
String sql = "UPDATE student SET NAME=? WHERE id=?"; //?表示一個引數的佔位符
//3.執行預編譯sql語句(檢查語法)
stmt = conn.prepareStatement(sql);
//4.設定引數值
/**
* 引數一: 引數位置 從1開始
*/
stmt.setString(1, "王五");
stmt.setInt(2, 9);
//5.傳送引數,執行sql
int count = stmt.executeUpdate();
System.out.println("影響了"+count+"行");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt);
}
}
/**
* 刪除
*/
@Test
public void testDelete() {
Connection conn = null;
PreparedStatement stmt = null;
try {
//1.獲取連線
conn = JdbcUtil.getConnection();
//2.準備預編譯的sql
String sql = "DELETE FROM student WHERE id=?"; //?表示一個引數的佔位符
//3.執行預編譯sql語句(檢查語法)
stmt = conn.prepareStatement(sql);
//4.設定引數值
/**
* 引數一: 引數位置 從1開始
*/
stmt.setInt(1, 9);
//5.傳送引數,執行sql
int count = stmt.executeUpdate();
System.out.println("影響了"+count+"行");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt);
}
}
/**
* 查詢
*/
@Test
public void testQuery() {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//1.獲取連線
conn = JdbcUtil.getConnection();
//2.準備預編譯的sql
String sql = "SELECT * FROM student";
//3.預編譯
stmt = conn.prepareStatement(sql);
//4.執行sql
rs = stmt.executeQuery();
//5.遍歷rs
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(id+","+name+","+gender);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
//關閉資源
JdbcUtil.close(conn,stmt,rs);
}
}
}
CallableStatement執行儲存過程
/**
* 使用CablleStatement呼叫儲存過程
* @author APPle
*
*/
public class Demo1 {
/**
* 呼叫帶有輸入引數的儲存過程
* CALL pro_findById(4);
*/
@Test
public void test1(){
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs = null;
try {
//獲取連線
conn = JdbcUtil.getConnection();
//準備sql
String sql = "CALL pro_findById(?)"; //可以執行預編譯的sql
//預編譯
stmt = conn.prepareCall(sql);
//設定輸入引數
stmt.setInt(1, 6);
//傳送引數
rs = stmt.executeQuery(); //注意: 所有呼叫儲存過程的sql語句都是使用executeQuery方法執行!!!
//遍歷結果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(id+","+name+","+gender);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt ,rs);
}
}
/**
* 執行帶有輸出引數的儲存過程
* CALL pro_findById2(5,@NAME);
*/
@Test
public void test2(){
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs = null;
try {
//獲取連線
conn = JdbcUtil.getConnection();
//準備sql
String sql = "CALL pro_findById2(?,?)"; //第一個?是輸入引數,第二個?是輸出引數
//預編譯
stmt = conn.prepareCall(sql);
//設定輸入引數
stmt.setInt(1, 6);
//設定輸出引數(註冊輸出引數)
/**
* 引數一: 引數位置
* 引數二: 儲存過程中的輸出引數的jdbc型別 VARCHAR(20)
*/
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
//傳送引數,執行
stmt.executeQuery(); //結果不是返回到結果集中,而是返回到輸出引數中
//得到輸出引數的值
/**
* 索引值: 預編譯sql中的輸出引數的位置
*/
String result = stmt.getString(2); //getXX方法專門用於獲取儲存過程中的輸出引數
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt ,rs);
}
}
}
相關文章
- Mysql入門【JDBC】MySqlJDBC
- 22、jdbc入門2JDBC
- 24、jdbc入門3JDBC
- JDBC入門(一):Statement物件JDBC物件
- Jdbc從入門到入土JDBC
- JDBC入門基礎篇JDBC
- JDBC入門與簡單使用JDBC
- Nodejs教程21:資料庫入門NodeJS資料庫
- C#快速入門教程(21)—— 泛型C#泛型
- javascript快速入門21--DOM總結JavaScript
- Sharding-JDBC 快速入門第一課JDBC
- Sharding-JDBC 使用入門和基本配置JDBC
- JDBC TM入門指南6--Parepared Statement (轉)JDBC
- flask入門1Flask
- 1、MyCat入門
- docker入門1Docker
- 1、dwr入門
- redux——入門1Redux
- 機器學習1—入門機器學習
- JQuery入門(1)jQuery
- Java入門系列-21-多執行緒Java執行緒
- JDBC基礎入門教程,輕鬆掌握jdbc基礎+核心技術,超全面!JDBC
- 21,21,只要21天,快速入門Python不是夢,確定不瞭解一下?Python
- Docker入門(1):概述Docker
- Kafka入門(1):概述Kafka
- (1)入門MasaFramework教程Framework
- 1、Spring入門Spring
- Julia快速入門(1)
- Python(1):入門Python
- 入門1~4:A系列
- 重構入門(1)
- WindowsServer入門系列21防範ARP欺騙WindowsServer
- JDBC學習1:詳解JDBC使用JDBC
- JDBC+MySQL入門實戰(實現CURD的例子)JDBCMySql
- JDBC總結1JDBC
- Pygame第1-1課:入門GAM
- 1(1)FPGA入門第一關FPGA
- docker筆記21-k8s的使用入門Docker筆記K8S