標籤:
學習資料《瘋狂java講義》
環境:MYSQL
Java 1.7
java用JDBC操作資料庫是java編程的基礎之一。而掌握SQL是JDBC編程的基礎。JDBC是sun公司制定的介面API,各個資料庫產商根據介面API提供實作類別(驅動程式),這是面向介面編程的典型應用。
可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (Data Definition Language) (DDL)。
SQL (結構化查詢語言 (SQL))是用於執行查詢的文法。但是 SQL 語言也包含用於更新、插入和刪除記錄的文法。
查詢和更新指令構成了 SQL 的 DML 部分:
- SELECT - 從資料庫表中擷取資料
- UPDATE - 更新資料庫表中的資料
- DELETE - 從資料庫表中刪除資料
- INSERT INTO - 向資料庫表中插入資料
SQL 的資料定義語言 (Data Definition Language) (DDL) 部分使我們有能力建立或刪除表格。我們也可以定義索引(鍵),規定表之間的連結,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
- CREATE DATABASE - 建立新資料庫
- ALTER DATABASE - 修改資料庫
- CREATE TABLE - 建立新表
- ALTER TABLE - 變更(改變)資料庫表
- DROP TABLE - 刪除表
- CREATE INDEX - 建立索引(搜尋鍵)
- DROP INDEX - 刪除索引
MYSQL文法:
show databases;
use 資料庫名;
show tables;
desc 表名--查看資料表的結構
bin\ mysql -p 密碼 -u 使用者名稱 -h主機名稱 --default-character-set=utf8 串連遠程主機的mysql服務
alter table tablename modify; 只能一次修改一個列
alter table tablename rename to newname;
alter table tablename change 列名 to 新列名 type;
(constraint 約束名)約束定義;---多列約束
primary key( 列名) ----多列主鍵約束,不能自訂約束名稱
列名 type auto_increment primary key---自增長主鍵
alter table tablename drop index 約束名;
建立外鍵約束時,MYSQL會為該列建立索引;
列名 類型 references 表名(主鍵名);
外鍵參照自身表的主鍵----自關聯
on detete cascade / on delete set null--主鍵記錄刪除,從鍵也刪除
create index index_name on table_name (column1, column2...);
create or replace view view_name as subquery with check option;不允許修改視圖資料
DML:
insert into ; update; delete from;
concat("xxx","xxx")字串串連
distinct、in、like、is null
PS:不建議在JAVA程式中使用特定資料庫的函數,因為會導致程式碼與特定資料庫耦合;如果移植要重新開啟來源程式修改SQL語句。
where 與having的區別
where用於過濾行,having用於過濾組
where子句中不能使用組函數(avg(), count(), max(),min(),sum()),having可以
cross join, natural join, join using, join on
left join, right join ,full join
子查詢
集合運算select union/minus/
JDBC常用類和介面:在java.sql包下重要的幾個類或對象
DriverManager
Connection
Statement
ResultSet
例子:記得添加mysql -connector-java 的jar包
public class JDBCTest { public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException { // 載入驅動 Class.forName("com.mysql.jdbc.Driver"); try { Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/sakila", "root", "password"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from city LIMIT 5"); while (rs.next()) { System.out.println( rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getInt(3) + "\t" + rs.getTimestamp(4)); Thread.sleep(3000); } } finally { } }}輸出:1 A Corua (La Corua) 87 2006-02-15 04:45:25.02 Abha 82 2006-02-15 04:45:25.03 Abu Dhabi 101 2006-02-15 04:45:25.04 Acua 60 2006-02-15 04:45:25.05 Adana 97 2006-02-15 04:45:25.0
//執行SQL,PreparedStatement與Statement對比public class PreparedStatementTest { private String driver; private String url; private String user; private String pass; public void initParam(String paramFile) throws Exception { Properties props = new Properties(); props.load(new FileInputStream(paramFile)); driver = props.getProperty("driver"); url = props.getProperty("url"); user = props.getProperty("user"); pass = props.getProperty("pass"); } public void insertUseStatement() throws Exception { Class.forName(driver); long start = System.currentTimeMillis(); try( Connection conn = (Connection) DriverManager.getConnection(url,user,pass); Statement stmt = conn.createStatement()) { for(int i=0;i<100;i++) { stmt.executeUpdate("insert into student_table values("+"null,‘姓名"+i+"‘, 1)"); } System.out.println("using statement:"+(System.currentTimeMillis()-start)); } } //PreparedStatement能防止SQL注入,?代表預留位置 public void insertUsePrepare() throws Exception { Class.forName(driver); long start=System.currentTimeMillis(); try( Connection conn = DriverManager.getConnection(url,user,pass); PreparedStatement pstmt=conn.prepareStatement("insert into student_table values(null,?,1)")) { for(int i =0;i<100;i++) { pstmt.setString(1,"姓名"+i); pstmt.executeUpdate(); } System.out.println(" using PreparedStatement:"+(System.currentTimeMillis()-start)); } } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub PreparedStatementTest pt = new PreparedStatementTest(); pt.initParam("E:\\workspace\\learning\\mysql.ini"); pt.insertUseStatement(); pt.insertUsePrepare(); }}輸出:using statement:3423 using PreparedStatement:3176View Code
JDBC編程JAVA