1.Mysql的安裝和連接
連接數據庫:在CMD窗口
[root@host]# mysql -u root -p
Enter password:******
創建數據庫: mysql> create DATABASE testTable;
刪除數據庫: mysql> drop DATABASE testTable;
選擇數據庫: mysql> use DATABASE testTable;
創建表:create TABLE table_name (column_name column_type, column_name column_type, column_name column_type…);
刪除表:DROP TABLE table_name ;
2.Mysql的CRUD操作
增:insert into table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
刪:DELETE FROM table_name [WHERE Clause]
改:UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
查:select *(column_name, column_name…) from table_name;
3.where條件語句
SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2....// WHERE 子句也可以運用於 SQL 的 DELETE 或 UPDATE 命令
condition中的操作符可以有:
= != > < <= >=
like ‘% xx‘ (%表示任意字符)
SELECT * from runoob_tbl WHERE runoob_author LIKE '%書';//查詢作者爲“*書”的集合
UNION 操作符的語法
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT] //DISTINCT: 可選,刪除結果集中重複的數據。ALL: 可選,返回所有結果集,包含重複數據
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
in操作符的語法
…... where fields in (value1,value2….)
…... where fields not in (value1,value2….)
NULL值處理 where field1 is null;
IS NULL: 當列的值是 NULL,此運算符返回 true。
IS NOT NULL: 當列的值不爲 NULL, 運算符返回 true。
<=>: 比較操作符(不同於=運算符),當比較的的兩個值爲 NULL 時返回 true。
4.MySQL 排序
SELECT 語句使用 ORDER BY 子句將查詢數據排序後再返回數據
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]] // ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列,默認情況下,它是按升序排列。
5.MySQL 分組
GROUP BY 語句根據一個或多個列對結果集進行分組。
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;// 分組的列上我們可以使用 COUNT, SUM, AVG
配合使用 WITH ROLLUP
WITH ROLLUP 可以實現在分組統計數據基礎上再進行相同的統計(SUM,AVG,COUNT…)group by 可以實現一個最簡單的去重查詢,假設想看下有哪些員工,除了用 distinct,還可以用:SELECT name FROM employee_tbl GROUP BY name;
配合使用 having 過濾結果
注意:分組後的條件限定使用 HAVING 來限定,WHERE 是對原始數據進行條件限制。幾個關鍵字的使用順序爲 where 、group by 、having、order by
6.MySQL 聯表查詢/多表查詢
在真正的應用中經常需要從多個數據表中讀取數據,如SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢
INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關係的記錄。
LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
注意:
1. on的條件是在連接生成臨時表時使用的條件,以左表爲基準 ,不管on中的條件真否,都會返回左表中的記錄
2.where條件是在臨時表生成好後,再對臨時表過濾。此時 和left join有區別(返回左表全部記錄),條件不爲真就全部過濾掉,on後的條件來生成左右表關聯的臨時表,where後的條件是生成臨時表後對臨時表過濾。
7.Mysql事務
MySQL 事務主要用於處理操作量大,複雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
事務用來管理 insert,update,delete 語句。
一般來說,事務是必須滿足4個條件(ACID):
原子性(Atomicity,或稱不可分割性)
一致性(Consistency)
隔離性(Isolation,又稱獨立性)
持久性(Durability)。
事務特性的理解:
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。
隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分爲不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
MYSQL 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現
BEGIN 開始一個事務
ROLLBACK 事務回滾
COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
SET AUTOCOMMIT=0 禁止自動提交
SET AUTOCOMMIT=1 開啓自動提交
8.事務隔離級別和安全問題
安全問題
髒讀 : 一個事務讀到了另一個事務的未提交的數據
不可重複讀 : 一個事務讀到了另一個事務已經提交的 update 的數據導致多次查詢結果不一致.
虛/幻讀 : 一個事務讀到了另一個事務已經提交的 insert 的數據導致多次查詢結果不一致.
隔離級別:
未提交讀 :髒讀,不可重複讀,虛讀都有可能發生
已提交讀 :避免髒讀。但是不可重複讀和虛讀有可能發生
可重複讀 :避免髒讀和不可重複讀.但是虛讀(幻讀)有可能發生.
串行化的 :避免以上所有讀問題.
Mysql 默認:可重複讀
Oracle 默認:讀已提交
9.Mysql索引
MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作爲 WHERE 子句的條件)。實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因爲更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會佔用磁盤空間的索引文件。
普通索引:
1最基本的索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length。
2. 修改表結構(添加索引)
ALTER table tableName ADD INDEX indexName(columnName);
3.創建表的時候直接指定
CREATE TABLE mytable(ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); //length代表的是索引最多使用username列前length個字符
唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:
創建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表結構 ALTER table mytable ADD UNIQUE [indexName] (username(length))
創建表的時候直接指定:
CREATE TABLE mytable(ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
索引的刪除:
DROP INDEX [indexName] ON mytable;
10. Mysql JDBC操作
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcTest {
public static void main(String[] args) {
Connection conn= null;
Statement statement = null;
ResultSet eq =null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/springmvc?characterEncoding=UTF-8", "root", "1234567");
statement = conn.createStatement();
String sql = "select * from user where id = 1 ";
eq = statement.executeQuery(sql);
if(eq.next()) {
System.out.println(eq.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
conn.close();
statement.close();
eq.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
11. 數據庫連接池DBCP C3P0
DBCP 要添加兩個jar包:commons-dbcp.jar,commons-pool.jar
配置文件dbcpconfig.properties
#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=
#<!-- 初始化連接 -->
initialSize=10
#最大連接數量
maxActive=50
#<!-- 最大空閒連接 -->
maxIdle=20
#<!-- 最小空閒連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒 -->
maxWait=60000
#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;]
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true
#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
測試
public void demo1(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///web_07");
dataSource.setUsername("root");
dataSource.setPassword("123");
try{
// 獲得連接:
conn = dataSource.getConnection();
// 編寫SQL:
String sql = "select * from category";
// 預編譯SQL:
stmt = conn.prepareStatement(sql);
// 執行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
@Test
/**
* 配置文件方式:
*/
public void demo2(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Properties properties = new Properties();
try{
properties.load(new FileInputStream("src/dbcpconfig.properties"));
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
// 獲得連接:
conn = dataSource.getConnection();
// 編寫SQL:
String sql = "select * from category";
// 預編譯SQL:
stmt = conn.prepareStatement(sql);
// 執行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
C3P0也要引入C3P0連接池的jar包.
配置c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web_07</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
<named-config name="oracle">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web_07</property>
<property name="user">root</property>
<property name="password">123</property>
</named-config>
</c3p0-config>
建工具類:
public class JDBCUtils2 {
private static final ComboPooledDataSource DATA_SOURCE =new ComboPooledDataSource();
/**
* 獲得連接的方法
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = DATA_SOURCE.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}