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