java搜索資料庫-ag真人国际官网
① 使用jdbc從資料庫查詢數據,java程序需要考慮哪些優化方法
一、准備工作(一):mysql安裝配置和基礎學習
使用jdbc操作資料庫之前,首先你需要有一個資料庫。這里提供了3個鏈接供讀者自學,如果曾有過sql語言的使用經歷(包括在學校中的課堂學習),前兩個鏈接足以上手。
1.安裝和配置:mysql安裝圖解 mysql圖文安裝教程(詳細說明)
2.基本操作:21分鍾 mysql 入門教程
3.簡易命令查詢 :一千行mysql學習筆記
建議邊看入門教程,邊練習,在練習insert、update、select、delete等基本操作的同時,將後面要用的表建好。
下圖是我接下來用於演示的資料庫的表。
二、准備工作(二):下載資料庫對應的jar包並導入
使用jdbc需要在工程中導入對應的jar包。資料庫與jdbc包的對應關系可以參考各種資料庫對應的jar包、驅動類名和url格式。在eclipse下的導入方法:
在工程的圖標上右擊,選擇」properties」,在」java bulid path」中選擇」add external jars…」,選擇下載並解壓後獲得的jar包。
如果對mysql進行操作,這時下面的import就不會報錯了:
import com.mysql.jdbc.connection;
import com.mysql.jdbc.preparedstatement;
除此以外,還需要jdbc的包,直接import即可。
import java.sql.drivermanager;
import java.sql.resultset;
import java.sql.sqlexception;
三、jdbc基本操作
為了簡單起見,與資料庫相關的操作、命令、參數都被硬編碼了。有興趣的讀者可以對這些進行探索,降低數據與操作的耦合性。
先看具體代碼並實踐,本文第五部分對用到的api稍作了研究。
下面的所有方法和數據成員都在public class jdbcoperation內部。
(1)定義記錄的類(可選)
這樣做主要是為了便於操作和介面定義,是非必須的。
static class student {
private string id;
private string name;
private string sex;
private string age;
student(string name, string sex, string age) {
this.id = null; //default
this.name = name;
this.sex = sex;
this.age = age;
}
public string getid() {
return id;
}
public void setid(string id) {
this.id = id;
}
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public string getsex() {
return sex;
}
public void setsex(string sex) {
this.sex = sex;
}
public string getage() {
return age;
}
public void setage(string age) {
this.age = age;
}
}
(2)連接的獲取
在操作前必須先獲取與資料庫的連接。
driver、url的格式同樣可以參考各種資料庫對應的jar包、驅動類名和url格式。
private static connection getconn() {
string driver = "com.mysql.jdbc.driver";
string url = "jdbc:mysql://localhost:3306/samp_db";
string username = "root";
string password = "";
connection conn = null;
try {
class.forname(driver); //classloader,載入對應驅動
conn = (connection) drivermanager.getconnection(url, username, password);
} catch (classnotfoundexception e) {
e.printstacktrace();
} catch (sqlexception e) {
e.printstacktrace();
}
return conn;
}
(3)insert
private static int insert(student student) {
connection conn = getconn();
int i = 0;
string sql = "insert into students (name,sex,age) values(?,?,?)";
preparedstatement pstmt;
try {
pstmt = (preparedstatement) conn.preparestatement(sql);
pstmt.setstring(1, student.getname());
pstmt.setstring(2, student.getsex());
pstmt.setstring(3, student.getage());
i = pstmt.executeupdate();
pstmt.close();
conn.close();
} catch (sqlexception e) {
e.printstacktrace();
}
return i;
}
(4)update
private static int update(student student) {
connection conn = getconn();
int i = 0;
string sql = "update students set age='" student.getage() "' where name='" student.getname() "'";
preparedstatement pstmt;
try {
pstmt = (preparedstatement) conn.preparestatement(sql);
i = pstmt.executeupdate();
system.out.println("resutl: " i);
pstmt.close();
conn.close();
} catch (sqlexception e) {
e.printstacktrace();
}
return i;
}
(5)select
以select * from xxx為例。
private static integer getall() {
connection conn = getconn();
string sql = "select * from students";
preparedstatement pstmt;
try {
pstmt = (preparedstatement)conn.preparestatement(sql);
resultset rs = pstmt.executequery();
int col = rs.getmetadata().getcolumncount();
system.out.println("============================");
while (rs.next()) {
for (int i = 1; i <= col; i ) {
system.out.print(rs.getstring(i) "\t");
if ((i == 2) && (rs.getstring(i).length() < 8)) {
system.out.print("\t");
}
}
system.out.println("");
}
system.out.println("============================");
} catch (sqlexception e) {
e.printstacktrace();
}
return null;
}
(6)delete
private static int delete(string name) {
connection conn = getconn();
int i = 0;
string sql = "delete from students where name='" name "'";
preparedstatement pstmt;
try {
pstmt = (preparedstatement) conn.preparestatement(sql);
i = pstmt.executeupdate();
system.out.println("resutl: " i);
pstmt.close();
conn.close();
} catch (sqlexception e) {
e.printstacktrace();
}
return i;
}
② java如何訪問資料庫(java訪問mysql資料庫)
java可以使用jdbc訪問資料庫,也可以使用各類orm框架訪問資料庫,但這些框架最終還是通過jdbc訪問資料庫,它們只是封裝了資料庫操作,而使得開發者可以減少這部分消耗。因此,本文只講解jdbc訪問方式。
jdbc訪問一般分為如下流程:
1、載入jdbc驅動程序:
在連接資料庫之前,首先要載入想要連接的資料庫的驅動到jvm(java虛擬機),這通過java.lang.class類的靜態方法forname(stringclassname)實現。
例如:
try{
//載入mysql的驅動類
class.forname("com.mysql.jdbc.driver");
}catch(e){
system.out.println("找不到驅動程序類,載入驅動失敗!");
e.();
}
成功載入後,會將driver類的實例注冊到類中。
2、提供jdbc連接的url
連接url定義了連接資料庫時的協議、子協議、數據源標識。
書寫形式:協議:子協議:數據源標識
協議:在jdbc中總是以jdbc開始
子協議:是橋連接的驅動程序或是資料庫管理系統名稱。
數據源標識:標記找到資料庫來源的地址與連接埠。
例如:(mysql的連接url)
jdbc:mysql://localhost:3306/test?useunicode=true&=gbk;
useunicode=true:表示使用unicode字元集。如果設置為
gb2312或gbk,本參數必須設置為true。=gbk:字元編碼方式。
3、創建資料庫的連接
要連接資料庫,需要向java.sql.請求並獲得connection對象,該對象就代表一個資料庫的連接。
使用的(stringurl,stringusername,stringpassword)方法傳入指定的欲連接的資料庫的路徑、資料庫的用戶名和密碼來獲得。
例如:
//連接mysql資料庫,用戶名和密碼都是root
stringurl="jdbc:mysql://localhost:3306/test";
stringusername="root";
stringpassword="root";
try{
connectioncon=
.(url,username,password);
}catch(se){
system.out.println("資料庫連接失敗!");
se.();
}
4、創建一個statement
要執行sql語句,必須獲得java.sql.statement實例,statement實例分為以下3種類型:
1、執行靜態sql語句。通常通過statement實例實現。
2、執行動態sql語句。通常通過實例實現。
3、執行資料庫存儲過程。通常通過實例實現。
具體的實現方式:
statementstmt=con.();
preparedstatementpstmt=con.preparestatement(sql);
callablestatementcstmt=con.preparecall("{calldemosp(?,?)}");
5、執行慧轎sql語句
statement介面提供了三種執行sql語句的方法:executequery、executeupdate和execute
1、resultsetexecutequery(stringsqlstring):執行查詢資料庫的sql語句,返回一個結果集(resultset)對象。
2、intexecuteupdate(stringsqlstring):用於執行insert、update或delete語句以及sqlddl語句,如:createtable和droptable等
3、execute(sqlstring):用於執行返回多個結果集、多個更新計數或二者組合的語句。
具芹尺體實現的代碼:
resultsetrs=stmt.executequery("select*from...");
introws=stmt.executeupdate("insertinto...");
booleanflag=stmt.execute(stringsql);
6、處理結果
兩種情況:
1、執行更新返回的是本次操作影響到的記錄數。
2、執行查詢返回的結果是一個resultset對象。
resultset包含符合sql語句中條件的所有行,並且它通過一套get方法提嫌碧高供了對這些行中數據的訪問。
使用結果集(resultset)對象的訪問方法獲取數據:
while(rs.next()){
stringname=rs.getstring("name");
stringpass=rs.getstring(1);//此方法比較高效(列是從左到右編號的,並且從列1開始)
}
7、關閉jdbc對象
操作完成以後要把所有使用的jdbc對象全都關閉,以釋放jdbc資源,關閉順序和聲明順序相反:
1、關閉記錄集
2、關閉聲明
3、關閉連接對象
if(rs!=null){//關閉記錄集
try{
rs.close();
}catch(sqlexceptione){
e.printstacktrace();
}
}
if(stmt!=null){//關閉聲明
try{
stmt.close();
}catch(sqlexceptione){
e.printstacktrace();
}
}
if(conn!=null){//關閉連接對象
try{
conn.close();
}catch(sqlexceptione){
e.printstacktrace();
}
}