




已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
北京傳智播客教育 ,JDBC,講師: 李勇,北京傳智播客教育 ,簡介,JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接),由一些接口和類構成的API。 J2SE的一部分,由java.sql,javax.sql包組成。,北京傳智播客教育 ,簡介,應用程序、JDBC API、數(shù)據(jù)庫驅動及數(shù)據(jù)庫之間的關系,北京傳智播客教育 ,連接數(shù)據(jù)的步驟,注冊驅動 (只做一次) 建立連接(Connection) 創(chuàng)建執(zhí)行SQL的語句(Statement) 執(zhí)行語句 處理執(zhí)行結果(ResultSet) 釋放資源 快速起步示例,北京傳智播客教育 ,注冊驅動,Class.forName(“com.mysql.jdbc.Driver”); 推薦這種方式,不會對具體的驅動類產(chǎn)生依賴。 DriverManager.registerDriver(com.mysql.jdbc.Driver); 會造成DriverManager中產(chǎn)生兩個一樣的驅動,并會對具體的驅動類產(chǎn)生依賴。 System.setProperty(“jdbc.drivers”, “driver1:driver2”); 雖然不會對具體的驅動類產(chǎn)生依賴;但注冊不太方便,所以很少使用。 驅動類型(四種類型),北京傳智播客教育 ,建立連接(Connection),Connection conn = DriverManager.getConnection(url, user, password); url格式: JDBC:子協(xié)議:子名稱/主機名:端口/數(shù)據(jù)庫名?屬性名=屬性值& User,password可以用“屬性名=屬性值”方式告訴數(shù)據(jù)庫; 其他參數(shù)如:useUnicode=true&characterEncoding=GBK。,北京傳智播客教育 ,創(chuàng)建執(zhí)行SQL的語句(Statement),Statement Statement st = conn.createStatement(); st.executeQuery(sql); PreparedStatement String sql = “select * from table_name where col_name=?”; PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1, “col_value”); ps.executeQuery();,北京傳智播客教育 ,處理執(zhí)行結果(ResultSet),ResultSet rs = statement.executeQuery(sql); While(rs.next() rs.getString(“col_name”); rs.getInt(“col_name”); / ,北京傳智播客教育 ,釋放資源,釋放ResultSet, Statement,Connection. 數(shù)據(jù)庫連接(Connection)是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時正確的關閉將導致系統(tǒng)宕機。Connection的使用原則是盡量晚創(chuàng)建,盡量早的釋放。,北京傳智播客教育 ,基本的CRUD(創(chuàng)建、讀取、更新、刪除),模板代碼 Connection conn = null; Statement st=null; ResultSet rs = null; try /獲得Connection /創(chuàng)建Statement /處理查詢結果ResultSet finally /釋放資源ResultSet, Statement,Connection ,北京傳智播客教育 ,創(chuàng)建,增加對應SQL的INSERT,返回增加成功的行(記錄)數(shù) conn = getConnection(); Statement st = conn.createStatement(); String sql=“insert into user(name, age,regist_date )” + “values(name, 10, now()”; int i = st.executeUpdate(sql); /i為插入的記錄數(shù),北京傳智播客教育 ,讀取,讀?。ú樵儯猄QL的SELECT,返回查詢結果 conn = getConnection(); st = conn.createStatement(); String sql = “select id, name, age,regist_date from user“; rs = st.executeQuery(sql); while (rs.next() System.out.print(rs.getInt(“id“) + “ tt “); System.out.print(rs.getString(“name“) + “ tt “); System.out.print(rs.getInt(“age“) + “ tt “); System.out.print(rs.getTimestamp(“regist_date“) + “ tt “); System.out.println(); ,北京傳智播客教育 ,更新,更新(修改)對應SQL的UPDATE,返回被修改的行(記錄)數(shù) conn = getConnection(); Statement st = conn.createStatement(); String sql=“update person set name=new name”; int i = st.executeUpdate(sql); /i為符合條件的記錄數(shù),北京傳智播客教育 ,刪除,刪除對應SQL的DELETE,返回被刪除的行(記錄)數(shù) conn = getConnection(); Statement st = conn.createStatement(); String sql=“delete from user where id=1”; int i = st.executeUpdate(sql); /i為刪掉的記錄數(shù),北京傳智播客教育 ,CRUD總結,增、刪、改用Statement.executeUpdate來完成,返回整數(shù)(匹配的記錄數(shù)),這類操作相對簡單。 查詢用Statement.executeQuery來完成,返回的是ResultSet對象,ResultSet中包含了查詢的結果;查詢相對與增、刪、改要復雜一些,因為有查詢結果要處理。,北京傳智播客教育 ,SQL注入,PreparedStatement和Statement,在SQL中包含特殊字符或SQL的關鍵字(如: or 1 or )時Statement將出現(xiàn)不可預料的結果(出現(xiàn)異?;虿樵兊慕Y果不正確),可用PreparedStatement來解決。 PreperedStatement(從Statement擴展而來)相對Statement的優(yōu)點: 1.沒有SQL注入的問題。 2.Statement會使數(shù)據(jù)庫頻繁編譯SQL,可能造成數(shù)據(jù)庫緩沖區(qū)溢出。 3.數(shù)據(jù)庫和驅動可以對PreperedStatement進行優(yōu)化(只有在相關聯(lián)的數(shù)據(jù)庫連接沒有關閉的情況下有效)。,北京傳智播客教育 ,數(shù)據(jù)類型,詳細信息見java.sql.Types 幾種特殊且比較常用的類型 1.DATA,TIME,TIMESTAMP date,time,datetime 存:ps.setDate(i,d); ps.setTime(i,t); ps.setTimestamp(i, ts); ?。簉s.getDate(i); rs.getTime(i); rs.getTimestamp(i); 2.CLOB text 存:ps.setCharacterStream(index, reader, length); ps.setString(i, s); 取:reader = rs. getCharacterStream(i); reader = rs.getClob(i).getCharacterStream(); string = rs.getString(i); 3.BLOB blob 存:ps.setBinaryStream(i, inputStream, length); ?。簉s.getBinaryStream(i); rs.getBlob(i).getBinaryStream();,北京傳智播客教育 ,一個簡單用戶相關的數(shù)據(jù)訪問層,J2EE三層架構簡介 表示層 、業(yè)務邏輯層、數(shù)據(jù)訪問層,三層之間用接口隔離。 定義domain對象User,定義存取用戶的接口 用JDBC實現(xiàn)接口 用配置文件(properties)和反射實現(xiàn)與具體類的耦合,北京傳智播客教育 ,事務(ACID),原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能只執(zhí)行其中的一部分。 一致性(consistency):在事務處理執(zhí)行前后,數(shù)據(jù)庫是一致的(數(shù)據(jù)庫數(shù)據(jù)完整性約束)。 隔離性(isolcation):一個事務處理對另一個事務處理的影響。 持續(xù)性(durability):事務處理的效果能夠被永久保存下來 。 connection.setAutoCommit(false);/打開事務。 mit();/提交事務。 connection.rollback();/回滾事務。,北京傳智播客教育 ,事務(SavePoint),當只想撤銷事務中的部分操作時可使用SavePoint SavePoint sp = connection.setSavepoint(); connection.rollerbak(sp);mit();,北京傳智播客教育 ,事務(JTA),跨越多個數(shù)據(jù)源的事務,使用JTA容器實現(xiàn)事務。 分成兩階段提交。 javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName“); tx.begin(); /connection1 connection2 (可能來自不同的數(shù)據(jù)庫) mit();/tx.rollback();,北京傳智播客教育 ,隔離級別多線程并發(fā)讀取數(shù)據(jù)時的正確性,connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); V:可能出現(xiàn),X:不會出現(xiàn),北京傳智播客教育 ,存儲過程,存儲過程 CallableStatement(從PreperedStatement擴展來) cs = connection.prepareCall(“call psname(?,?,?)”); cs.registerOutParameter(index, Types.INTEGER); cs.setXXX(i, xxxx); cs.executeUpdate(); int id=cs.getInt(index);,北京傳智播客教育 ,其他的幾個API,PreparedStatement.getGeneratedKeys() PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.executeUpdate(); ResultSet rs = st.getGeneratedKeys();rs.getInt(1); 批處理,可以大幅度提升大量增、刪、改的速度。 PreparedStatement.addBatch(); PreparedStatement.executeBatch();,北京傳智播客教育 ,其他的幾個API,可滾動的結果集 Statement st = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = st.executeQuery(sql); rs.beforeFirst(); rs.afterLast();rs.first();rs.isFirst();rs.last();rs.isLast(); rs.absolute(9);rs.moveToInsertRow(); 可更新的結果集 conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); rs.updateString(“col name“, “new value“); rs.updateRow();,北京傳智播客教育 ,DatabaseMetaData和ParameterMetaData,DatabaseMetaData meta = connection.getMetaData(); 通過DatabaseMetaData可以獲得數(shù)據(jù)庫相關的信息如:數(shù)據(jù)庫版本、數(shù)據(jù)庫名、數(shù)據(jù)庫廠商信息、是否支持事務、是否支持某種事務隔離級別,是否支持滾動結果集等。 ParameterMetaData pmd = preparedStatement.getParameterMetaData(); 通過 ParameterMetaData可以獲得參數(shù)信息。,北京傳智播客教育 ,ResultSetMetaData,ResultSetMetaData meta = rs.getMetaData(); 通過ResultSetMetaData可以獲得結果有幾列、各列名、各列別名、各列類型等。 可以將ResultSet放入Map(key:列名 value:列值)。 用反射ResultSetMetaData將查詢結果讀入對象中(簡單的O/RMapping) 1)讓SQL語句中列別名和要讀入的對象屬性名一樣; 2)通過ResultSetMetaData獲得結果列數(shù)和列別名; 3)通過反射將對象的所有setXxx方法找到; 4)將3)找到的方法setXxx和2)找到的列別名進行匹配(即方法中的xxx于列別名相等); 5)由上一步找到的方法和列別名對應關系進行賦值 Method.invoke(obj, rs.getObject(columnAliasName);,北京傳智播客教育 ,數(shù)據(jù)源和連接池,DataSource用來取代DriverManager來獲取Connection; 通過DataSource獲得Connection速度很快; 通過DataSource獲得的Connection都是已經(jīng)被包裹過的(不是驅動原來的連接),他的close方法已經(jīng)被修改。 一般DataSource內(nèi)部會用一個連接池來緩存Connection,這樣可以大幅度提高數(shù)據(jù)庫的訪問速度; 連接池可以理解成一個能夠存放Connection的Collection; 我們的程序只和DataSource打交道,不會直接訪問連接池;,北京傳智播客教育 ,一個簡單的數(shù)據(jù)源實現(xiàn),使用代理模式的Connection(核心代碼) class MyConnection implements Connection private Connection realConn; private LinkedList connPool; MyConnection(Connection rConn, LinkedList cPool) this.realConn=rConn; this.connPool=cPool; public void close() this.connPool.addLast(this); /. ,北京傳智播客教育 ,一個簡單的數(shù)據(jù)源實現(xiàn),DataSource(核心代碼) class MyDataSource implements DataSource private LinkedList connPool = new Vector(); public Connection getConneciton () if(this.connPool.size()0) return this.connPool.removeFirst(0); return createConnection(); private Connection createConnection() Connection realConn = DriverManager.getConnection(); Connection myConn = new MyConnection(realConn,this.connPool); return myConn; /. ,北京傳智播客教育 ,常用的開源實現(xiàn)DBCP,使用DBCP必須用的三個包: commons-dbcp-1.2.1.jar, commons-pool-1.2.jar, commons-collections-3.1.jar。 配置參數(shù)。 Java API: BasicDataSourceFactory.createDataSource( properties);,北京傳智播客教育 ,使用繼承優(yōu)化JDBC代碼(模板模式),優(yōu)化查詢操作,區(qū)分開變化和不變的部分: sql和ResultSet的處理是變化部分,創(chuàng)建和釋放資源部分是不變部分。 提取超類,將不變部分放入超類,變化部分留給子類實現(xiàn)。 超類的主要代碼: public Object find(String sql, Object args) rs = ps.executeQuery(); if (rs.next() return rowMapper(rs); protected abstract Object rowMapper(ResultSet rs);,北京傳智播客教育 ,使用組合優(yōu)化JDBC代碼(策略模式),優(yōu)化查詢操作,區(qū)分開變化和不變的部分: sql和ResultSet的處理是變化部分,創(chuàng)建和釋放資源部分是不變部分。 提取接口封裝變化部分。 JDBC操作主要代碼: public Object find(String sql, Object args, RowMapper rowMapper) rs = ps.executeQuery(); if (rs.next()return rowMapper.mapRow(rs); 回調(diào)接口: public interface RowMapper public Object mapRow(ResultSet rs) throws SQLException; ,北京傳智播客教育 ,Spring的JdbcTemplate,查詢帶有參數(shù),和行映射方法: public Object queryForObject(String sql, Object args, RowMapper rowMapper),使用自定義的UserRowMapper完成映射。 一個RowMapper的常用實現(xiàn)BeanPropertyRowMapper,該實現(xiàn)可將結果集轉換成一個Java Bean(字段名與Java Bean屬性名不符合規(guī)范,可用別名處理)。 public List query(String sql, Object args, RowMapper rowMapper)返回多個結果。 public int queryForInt(String sql)(如:select count(*) from user),其他結果比如String可用queryForObject方法向下轉型。 public Map queryForMap(String sql, Object args)返回若類型的Map(key:字段名或別名,value:列值)。 public List queryForList(String sql, Object args)返回多Map。,北京傳智播客教育 ,Spring的JdbcTemplate,更新public int update(String sql, Object args)。 插入數(shù)據(jù)并獲得結果: public Object execute(ConnectionCallback action) 其他方法簡介,北京傳智播客教育 ,Spring的NamedParameterJdbcTemplate,NamedParameterJdbcTemplate內(nèi)部包含了一個JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干; NamedParameterJdbcTemplate相對于JdbcTemplate主要增加了參數(shù)可以命名的功能。 public Object queryForObject(String sql, Map par
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 全款轉讓房產(chǎn)合同范本
- 加班法務合同范本
- 公司入股合同范本文檔
- 仔豬購銷糾紛合同范本
- 包裝插畫合同范本
- 農(nóng)村協(xié)議買房合同范本
- 2024年金山區(qū)衛(wèi)生健康事業(yè)單位招聘衛(wèi)生專業(yè)技術人員考試真題
- 2024年南丹縣丹融文化傳媒有限公司招聘筆試真題
- 農(nóng)村修水渠合同范本
- 2024年阜陽市皖西北(阜南)糧食產(chǎn)業(yè)園有限公司招聘考試真題
- 基于康耐視相機的視覺識別實驗指導書
- 三年級書法下冊《第9課 斜鉤和臥鉤》教學設計
- 兒童財商養(yǎng)成教育講座PPT
- 大學學院學生獎助資金及相關經(jīng)費發(fā)放管理暫行辦法
- 2022蘇教版科學五年級下冊全冊優(yōu)質(zhì)教案教學設計
- 加油員的安全生產(chǎn)責任制
- 2023年R2移動式壓力容器充裝操作證考試題及答案(完整版)
- 九年級物理實驗記錄單
- 2022年湖北省高中學業(yè)水平考試真題-音樂學科
- 提高屋面防水施工質(zhì)量年QC成果
- 部編初中語文古詩詞按作者分類梳理
評論
0/150
提交評論