1. 程式人生 > >初識JABC(一)

初識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.執行