1.jdbc 概念
2.核心類
DriverManager
管理JDBC驅(qū)動
Connection
負責連接數(shù)據(jù)庫并擔任傳送數(shù)據(jù)的任務(wù)
Statement
由 Connection 產(chǎn)生、負責執(zhí)行SQL語句
PreparedStatement
預編譯sql,由 Connection 產(chǎn)生、負責執(zhí)行SQL語句
CallableStatement
由 Connection 產(chǎn)生、負責執(zhí)行SQL語句,執(zhí)行存儲過程
ResultSet
負責保存Statement執(zhí)行后所產(chǎn)生的查詢結(jié)果
3.Statement與PreparedStatement區(qū)別
Statement執(zhí)行順序
1.進行sql語法校驗,語法錯誤就報錯了
2.校驗權(quán)限,權(quán)限不夠報錯
3.會從sql緩存區(qū)去找有沒有這條sql
有就直接執(zhí)行
沒有就添加到緩存區(qū),再執(zhí)行
PreparedStatement
3.會減少添加緩存區(qū)sql的次數(shù),條數(shù)。
區(qū)別:
1)Statement 執(zhí)行相對于PreparedStatement來說會不安全
Statement 會有sql注入
PreparedStatement 可以預防sql注入
2)PreparedStatement效率高
推薦以后使用PreparedStatement。
4.把數(shù)據(jù)庫的信息放到配置文件中 db.properties
5.批處理
addBatch 添加一條sql到Statement中。
executeBatch() 統(tǒng)一執(zhí)行一組sql。
步驟:
1,獲取對象
Statement
PreparedStatement : 創(chuàng)建這個對象的時候,傳入的sql是可以為""空字符串的
2.添加一些sql的集合
addBatch
3.執(zhí)行這些sql
executeBatch
6.獲取自增長的值
connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
注意:Statement.RETURN_GENERATED_KEYS
獲取返回的自增長id
ResultSet resultSet = prepareStatement.getGeneratedKeys();
7.大文本處理
1.txt.html,xml
mysql : text(64K),meduimtext(16M),longtext(4G)
oracle : clob
代碼
寫入:
FileReader reader = new FileReader(file);
prepareStatement.setClob(2, reader);
讀出:
Clob clob = resultSet.getClob("description");
Reader reader = clob.getCharacterStream();
2.二進制,圖片
mysql: blob,meduimblob,longblob
oracle:blob
代碼
寫入:
File file = new File("f:\\one.jpg");
FileInputStream inputStream = new FileInputStream(file);
prepareStatement.setBlob(2, inputStream);
讀出:
Blob blob = resultSet.getBlob("img");
InputStream inputStream = blob.getBinaryStream();
8.時間處理
date 只存儲年月日
time 只存儲時分秒
timestamp 存儲年月日時分秒
代碼
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date date = format.parse("1982-07-29 12:00:00");
prepareStatement.setTimestamp(2, new Timestamp(date.getTime()));
9.事務(wù)
概括
把一組sql放到一起去執(zhí)行,要么都成功,要么都失敗。
操作
提交
回滾
事務(wù)的特點
原子性
要么都成功,要么都失敗
隔離性
事務(wù)與事務(wù)之間互不干擾
問題:
臟讀
一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù)
不可重復讀
一個事務(wù)讀取了另外一個事務(wù)已經(jīng)更新的數(shù)據(jù)
幻讀
一個事務(wù)讀到了另外一個事務(wù)已經(jīng)提交的插入數(shù)據(jù)
解決這些問題,就有事務(wù)的隔離級別
serializable 最高級別? 不支持臟讀,不支持不可重復讀,不支持幻讀(默認)
repeatable read 不支持臟讀,不支持不可重復讀,支持幻讀
read committed 不支持臟讀,支持不可重復讀,支持幻讀
read uncommitted 支持臟讀,支持不可重復讀,支持幻讀
一致性
執(zhí)行前和執(zhí)行后結(jié)果應(yīng)該一致
持久性
事務(wù)提交,保存到數(shù)據(jù)庫