蘇州java大數(shù)據(jù)培訓(xùn)費用
一. JDBC編程概述
1. 什么JDBC
JDBC(Java Database Connection):為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問。它由一組用Java語言編寫的類和接口組成。是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)和規(guī)范。
2. 常見數(shù)據(jù)庫介紹
Mysql:開源免費的數(shù)據(jù)庫,小型的數(shù)據(jù)庫。非常實用和受歡迎。已經(jīng)被Oracle收購了.MySQL6.x版本也開始收費。
Oracle:收費的大型數(shù)據(jù)庫,Oracle公司的產(chǎn)品。一般中大型公司會使用。Oracle收購了SUN公司,Mysql數(shù)據(jù)庫。
DB2:IBM公司的收費數(shù)據(jù)庫產(chǎn)品。常應(yīng)用在銀行系統(tǒng)和金融系統(tǒng)中.
SQLServer:MicroSoft 公司收費的中型的數(shù)據(jù)庫。常常在C#、.net等語言中使用。
SyBase:提供了一個非常專業(yè)數(shù)據(jù)建模的工具PowerDesigner,但是數(shù)據(jù)庫本身已經(jīng)淡出歷史舞臺。
SQLite: 嵌入式的小型數(shù)據(jù)庫,基本上用于移動端。
Java相關(guān)的數(shù)據(jù)庫:MYSQL,Oracle。
數(shù)據(jù)庫的設(shè)計和開發(fā),sql語句的編寫在這里不做詳細(xì)的介紹。
Java
3. JDBC開發(fā)原理
Java和數(shù)據(jù)庫之間沒有必然的聯(lián)系,兩者之間是如何連接的呢?雖然Java提供了各種數(shù)據(jù)庫接口,但是我們并不知道各種數(shù)據(jù)庫具體的實現(xiàn)原理,難以對接口進行具體的實現(xiàn)。
所以,數(shù)據(jù)庫生產(chǎn)商提供了這些接口的實現(xiàn)類:驅(qū)動
Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實現(xiàn)類稱為驅(qū)動。
Java
JDBC是接口,驅(qū)動是接口的實現(xiàn),沒有驅(qū)動將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫。每個數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫。
二. JDBC開發(fā)步驟
JDBC一般的開發(fā)步驟如下:
首先要從官方網(wǎng)站上下載Mysql的驅(qū)動,并**Eclipse導(dǎo)入驅(qū)動(jar包)
Java
JDBC開發(fā)步驟如下:
1.注冊驅(qū)動(Driver)
2.獲得連接(Connection)
3.獲得語句執(zhí)行平臺(Statement)
4.使用SQL語句進行處理
5.釋放資源,關(guān)閉鏈接
數(shù)據(jù)庫中創(chuàng)建示例:
create table users(
username varchar(10),
pass varchar(10),
nicheng varchar(30)
);
insert into users (username,pass,nicheng) values('wjy','wjykl22','涼涼夜色為你思念成河');
select * from users;
Java連接數(shù)據(jù)庫
1.注冊驅(qū)動:
官方API推薦方法:
Class.forName("com.mysql.jdbc.Driver");
不推薦使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());注冊,以上代碼有兩點不足:
1.硬編碼,后期不易維護
2.驅(qū)動在源碼中就被注冊過,驅(qū)動會被兩次注冊
3.Driver源碼:
4.
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
}
2.獲得連接:
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url, username, password);
其中url:需要連接數(shù)據(jù)庫的位置(網(wǎng)址)目前來說格式基本上固定。
**部分:jdbc,這是固定的;
第二部分:數(shù)據(jù)庫名稱,我們連接的是Mysql數(shù)據(jù)庫,所以使用Mysql
第三部分:由數(shù)據(jù)庫廠商規(guī)定的,每個廠商都有各自的要求,分別由數(shù)據(jù)庫服務(wù)器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(jdbc)組成。
username:數(shù)據(jù)庫用戶名。
password:數(shù)據(jù)庫密碼。
采用上述方法就可以獲得數(shù)據(jù)庫的鏈接。
3.獲得執(zhí)行平臺并執(zhí)行sql語句
Statement stat = con.createStatement();
int executeUpdate(String sql);//用于執(zhí)行insert update delete語句.
ResultSet executeQuery(String sql); //用于執(zhí)行select語句.
boolean execute(String sql); //用于執(zhí)行select返回true 執(zhí)行其他的語句返回false.
4.結(jié)果集處理
得到ResultSet結(jié)果集后,需要對其中的數(shù)據(jù)進行數(shù)據(jù)的提取,對于ResultSet結(jié)果集的處理方法:
Object getObject(int index) / Object getObject(String name) 獲得任意對象
String getString(int index) / Object getObject(String name) 獲得字符串
int getInt(int index) / Object getObject(String name) 獲得整形
double getDouble(int index) / Object getObject(String name) 獲得雙精度浮點型
5.釋放資源
**后一步就是釋放資源,與IO釋放資源的方式如出一轍。
rs.close();
stmt.close();
con.close();
總結(jié)
完整的上述步驟如下:
public class JDBCDemo {
public static void main(String args[]) {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url, username, password);
Statement stat = con.createStatement();
stat.executeUpdate("insert into users (username,pass,nicheng) values('wjy2','wjykl33','如水流央')");
ResultSet rs = stat.executeQuery("select * from users");
while(rs.next()) {
System.out.println(rs.getString("username")
"\t" rs.getString("pass") "\t" rs.getString("nicheng"));
}
rs.close();
stat.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
預(yù)處理對象方法
為了防止代碼存在SQL注入漏洞,使得代碼更加完善,我們一般采用預(yù)處理對象:PreparedStatement
每條sql語句所有的實際參數(shù),都使用逗號分隔。
1. 預(yù)處理對象并執(zhí)行sql語句
String sql = "insert into sort(sid,sname) values(?,?)";
PreparedStatement psmt = conn.prepareStatement(sql)
2. 設(shè)置實際參數(shù)
void setXxx(int index, Xxx xx)
完整的代碼程序段如下:
public class LoginDemo {
/*
* Java程序?qū)崿F(xiàn)用戶的登錄,用戶名和密碼,數(shù)據(jù)庫檢查
* 防止注入攻擊
* Statment有一個子接口PrepareStatment,表示預(yù)編譯的SQL語句對象,可以高效的執(zhí)行
* 這個方法是Connection數(shù)據(jù)庫連接的方法
* 如何獲取這個實現(xiàn)類呢?
*/
public static void main(String args[]) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/world";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url,username,password);
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
//執(zhí)行sql語句,查詢用戶名和密碼。
//注意要寫問號
String sql = "select * from users where username =? and pass =?";
java.sql.PreparedStatement pst = con.prepareStatement(sql);
//調(diào)用pst中的set方法
pst.setObject(1, user);
pst.setObject(2, pass);
System.out.println(sql);
ResultSet rs = pst.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("username") " " rs.getString("pass"));
}
}
}
三. 工具類撰寫和使用
作為一名程序員**應(yīng)該學(xué)會的事情就是偷懶。設(shè)想一下,如果我們要在多各程序中使用Mysql數(shù)據(jù)庫,會有很多代碼重復(fù)使用,我們可以創(chuàng)建一個工具類Utils,**工具類來完成注冊驅(qū)動,獲得鏈接,獲得執(zhí)行平臺以及釋放資源的操作。
代碼如下:
public class JDBCUtils {
public static final String DRIVERNAME = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/mydb";
public static final String USER = "root";
public static final String PASSWORD = "root";
static {
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
System.out.println("數(shù)據(jù)庫驅(qū)動注冊失??!");
}
}
public static Connection getConn() throws Exception {
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
return conn;
}
}
**調(diào)用Utils類中的各種靜態(tài)方法來達到重復(fù)利用代碼的效果。
四. properties配置文件
上述代碼還是不太方便,如果要修改某個參數(shù),需要修改源代碼,有沒有方法能夠不修改源代碼就能夠完成配置的修改呢?
通常情況下,我們習(xí)慣使用properties文件來存儲與數(shù)據(jù)庫有關(guān)的配置文件。
1.文件位置:任意,建議src下
2.文件名稱:任意,擴展名為properties
3.文件內(nèi)容:一行一組數(shù)據(jù),格式是“key=value”.
4.3.1 key命名自定義,如果是多個單詞,習(xí)慣使用點分隔。例如:jdbc.driver
5.3.2 value值不支持中文,如果需要使用非英文字符,將進行unicode轉(zhuǎn)換。
例如:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
user=root
password=root
加載配置文件properties的方法:
對應(yīng)properties文件處理,開發(fā)中也使用Properties對象進行。我們將采用加載properties文件獲得流,然后使用Properties對象進行處理。
public class JDBCUtils {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
try {
// 1. 使用Properties處理流
// 使用load()方法加載指定的流
Properties props = new Properties();
Reader is = new FileReader("db.properties");
props.load(is);
// 2. 使用getProperty(key),**key獲得需要的值,
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 獲得連接
*/
public static Connection getConnection() {
try {
// 1 注冊驅(qū)動
Class.forName(driver);
// 2 獲得連接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
總結(jié)
JDBC編程是Java學(xué)習(xí)中的重點,對于初學(xué)Java的學(xué)習(xí)者來說也是一大難點,需要大量的練習(xí)和經(jīng)驗的總結(jié)。JDBC經(jīng)常和WEB一起使用,在之后文章中會結(jié)合具體的案例對JDBC進行進一步講解。歡迎繼續(xù)觀看后續(xù)內(nèi)容,一起體會Java語言的智慧與魅力。
更多課程推薦: