初識JABC(一)
一.什麼是JDBC
Java Database Connectivity 直接翻譯過來叫 Java資料庫連線
Java操作資料庫的一門技術
使用JDBC 可以 讓java程式連線資料庫 實現最基本的CRUD操作
一組規範: 包含介面和類,主要是介面
二.為什麼用JDBC?(介面的好處)
如果訪問資料庫的API不統一,每個資料庫廠商各自一套API
連線oracle
Oracle資料庫類.test111();
Oracle資料庫類.test222();
Oracle資料庫類.test333();
連線mysql
MySql資料庫類.testAAA();
MySql資料庫類.testBBB();
MySql資料庫類.testCCC();
缺點1: 學習成本高,每連線一種資料庫需要 學習一套API,太麻煩了
缺點2: 需求變了以後 mysql-->oracle 需要改程式碼 不可維護 不符合OCP
介面統一以後,大家都使用JDBC訪問資料庫,程式設計師只需要針對介面程式設計就可以了
然後由資料庫產生提供對介面的實現,這樣學習成本降低了、需求變了以後也不需要
修改程式碼,可維護
三.使用JDBC的五個步驟
1. 載入驅動
2. 建立連線
3. 建立通道
4. 執行並返回結果集
5. 關閉
*************************商品種類管理(分層)***********************************
一.資料庫層
1.建立表
create table category(
cid number(10) primary key,
cname varchar2(50),
cdesc varchar2(500)
)
2.建立序列
create sequence seq_category minvalue 0 start with 0 increment by 1
二.VO層(Value Object 值物件) 實體層
3個對應關係
java 資料庫
1.類 表
2.屬性 欄位
3.物件 記錄
VO層包含屬性、setters和getters()方法、toString(),它是一個最簡單的JavaBean物件
演示程式碼:
package com.vo;
//java 資料庫
//1.類 表
//2.屬性 欄位
public class Category {
private int cid;
private String cname;
private String cdesc;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCdesc() {
return cdesc;
}
public void setCdesc(String cdesc) {
this.cdesc = cdesc;
}
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + ", cdesc=" + cdesc
+ "]";
}
}
為什麼有VO層???
Java程式(面向物件的) + sql(面向關係的)
Java程式設計師一會編寫面向物件的程式碼 一會編寫sql語句 不是純面向物件的思維
體驗非常不好, 有了VO層以後 就可以 把對記錄的CRUD轉換成對物件的CRUD
public int addCategory(Category category){
String sql = "insert...";
}
********************訪問資料庫的工具類 ConnOracle.java*****************************
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 公司:藍橋軟體學院
* 作者:zhangzy
* 時間:2017年8月30日 上午9:26:05
* 功能:連線資料庫的工具類
*/
public class ConnOracle {
public static Connection getConnection(){
Connection conn = null;
String className = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "tiger";
//1.載入驅動
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
System.out.println("驅動類沒有找到");
e.printStackTrace();
}
//2.建立連線
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("連線資料庫失敗");
e.printStackTrace();
}
return conn;
}
public static void closeConnection(Statement stmt,Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
System.out.println("關閉通道失敗");
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("關閉資料庫連線失敗");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println(ConnOracle.getConnection());
}
}
三.DAO(Data Access Object) 資料訪問層(資料訪問物件)
實現對錶中記錄的最基本的增刪改查操作,為上一層服務的....
public int addCategory(Category category){
//1.載入驅動 2.建立連線
String sql = "insert...";
}
public int deleteCategory(Category category){
//1.載入驅動 2.建立連線
String sql = "delete...";
}
public int updateCategory(Category category){
//1.載入驅動 2.建立連線
String sql = "update...";
}
訪問資料庫需要載入驅動類,驅動類都在連線資料庫的jar包中
驅動類 就是 對JDBC介面的實現類,提供了真正訪問資料庫的程式碼...
oracle 11g ojdbc5.jar(jdk5.0用這個) 或ojdbc6.jar
oracle 10g ojdbc14.jar
mysql mysql-connector-java-5.1.7-bin.jar
一.介面
CategoryDao.java
package com.dao.inter;
import java.util.List;
import com.vo.Category;
public interface CategoryDao {
//1.新增
public int addCategory(Category category);
//2.刪除
public int deleteCategory(Category category);
//3.修改
public int updateCategory(Category category);
//4.查1
public Category getCategoryById(int id);
//5.按SQL語句查
public List<Category> getPageByQuery(String sql);
}
二.實現類
CategoryDaoImpl.java
package com.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import com.dao.inter.CategoryDao;
import com.util.ConnOracle;
import com.vo.Category;
public class CategoryDaoImpl implements CategoryDao {
//1.組合Connection
private Connection conn;
public CategoryDaoImpl(){
conn = ConnOracle.getConnection();
}
@Override
public int addCategory(Category category) {
int count = 0;
//3.建立通道
String sql = "insert into category values(seq_category.nextval,?,?)";
//獲得了一個預編譯的通道 相當於IO通道 可以用它來發送sql語句
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, category.getCname());
pstmt.setString(2, category.getCdesc());
//4.執行並返回結果集
count =pstmt.executeUpdate();//可以執行除了DQL以外所有的語句 DML 返回的是受影響的行數 DCL或DDL語句 返回值是0
if(count>=1){
System.out.println("新增商品種類成功!");
}else{
System.out.println("沒有新增任何商品種類!");
}
} catch (SQLException e) {
System.out.println("建立通道或新增商品種類失敗");
e.printStackTrace();
}finally{
//5.關閉
ConnOracle.closeConnection(pstmt, conn);
}
return count;
}
@Override
public int deleteCategory(Category category) {
int count = 0;
//3.建立通道
String sql = "delete from category where cid=?";
//獲得了一個預編譯的通道 相當於IO通道 可以用它來發送sql語句
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, category.getCid());
//4.執行並返回結果集
count =pstmt.executeUpdate();//可以執行除了DQL以外所有的語句 DML 返回的是受影響的行數 DCL或DDL語句 返回值是0
if(count>=1){
System.out.println("刪除商品種類成功!");
}else{
System.out.println("沒有刪除任何商品種類!");
}
} catch (SQLException e) {
System.out.println("建立通道或刪除商品種類失敗");
e.printStackTrace();
}finally{
//5.關閉
ConnOracle.closeConnection(pstmt, conn);
}
return count;
}
@Override
public int updateCategory(Category category) {
int count = 0;
//3.建立通道
String sql = "update category set cname=?,cdesc=? where cid=?";
//獲得了一個預編譯的通道 相當於IO通道 可以用它來發送sql語句
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, category.getCname());
pstmt.setString(2, category.getCdesc());
pstmt.setInt(3, category.getCid());
//4.執行並返回結果集
count =pstmt.executeUpdate();//可以執行除了DQL以外所有的語句 DML 返回的是受影響的行數 DCL或DDL語句 返回值是0
if(count>=1){
System.out.println("修改商品種類成功!");
}else{
System.out.println("沒有修改任何商品種類!");
}
} catch (SQLException e) {
System.out.println("建立通道或修改商品種類失敗");
e.printStackTrace();
}finally{
//5.關閉
ConnOracle.closeConnection(pstmt, conn);
}
return count;
}
@Override
public Category getCategoryById(int id) {
return null;
}
@Override
public List<Category> getPageByQuery(String sql) {
return null;
}
public static void main(String[] args) {
CategoryDaoImpl dao = new CategoryDaoImpl();
Category category = new Category();
category.setCid(3);
category.setCname("手機3");
category.setCdesc("通訊工具3");
dao.updateCategory(category);
}
}
***********************************schemas 方案*********************************
方案: 資料庫物件的集合..... Scott方案
Scott使用者 可以訪問 Scott方案
***********************************三種通道*********************************
1. PreparedStatement 預編譯的通道
語句固定不變 比如 每次都是 insert into category values(seq_category.nextval,引數,引數);
只是引數發生改變 推薦使用預編譯的通道
增加、刪除、修改、查1 都是固定不變的 使用這個通道
第一次發sql語句 會先把整條sql語句發過來 編譯 執行
第二次如果發同樣的sql語句 只會發引數 不會再從新編譯了 直接執行 效率高
2. Statement 普通的通道
每次發的語句不一樣 使用這個通道
每次都把整條sql發過來 每次都要從新編譯 執行 效率低
3. CallableStatement 呼叫儲存過程
sql語句的執行過程:
1.編譯
2.執行