成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談JDBC的概念理解與學習

開發 后端
本文將介紹JDBC的概念理解與學習的內容,JDBC(Java Data Base Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。

JDBC的概念:doMaim對象(javaBean實體)

UserDao(DataAccessObject)

工廠模式,Factory消除UserDaoTest業務類對具體實現UserDaoJdbc類的依賴

讀配置文件,通過工廠讀配置文件來加載信息,具體實現類使用工廠來獲取實現接口類的對象

JDBC的概念:工廠一般使用單例模式

工廠-->生產產品(Dao這個產品)

類加載器,不光可以load.class,還可以load其他的文件

事務概念與處理

1.原子性:不能拆分,組成事事務處理的語句形成一個邏輯處理單元,不能只執行其中的一部分

2.一致性:事務做完之后,保定數據的完整性約束

3.隔離性:一個事務處理對另一個事務處理的影響

4.持續性:事務處理的結果能被***保存下來

步驟:打開事務connection.setAutoCommit(false);

提交事務:connection.commit();

回滾事務:connection.rollback();

jdbc缺省是自動提交的,客戶端連接也是自動提交的,要想打開事務,要把自動提交關掉

保存點:savePoint

Savepointsp=null

sp=conn.setSavepoint();

conn.rollback(sp);

-----------------------------------

JDBC的概念:跨多個數據庫的事務JTA

JTA容器weblogic,websphere

分成兩階段提交。

用到JNDI服務器

javax.transaction.UserTransactiontx=

(UserTransaction)ctx.lookup("jndiName");

tx.begin();

//connection1connection2(可能來自不同的數據庫)

tx.commit();//tx.rollback();

---------------------------------

事務的隔離級別:

connction.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

隔離級別

讀未提交(Readuncommitted)可能出現臟讀,不可重復讀,幻讀

讀已提交(Readcommitted)可能出現不可重復讀,幻讀

可重復讀(Repeatableread)可能出現幻讀(幻影數據,執行插入一條數據,在另一個客戶端有可能看到)

可串行化(Serializable)

隔離級別各個數據庫的實現是不一樣的。

--------------------------------------------------

關于存儲過程(兩層架構的時候用的很多)

三層架構的系統很少使用了。略過不看了先。

---------------------------------------------------

其他幾個有用的API

jdbc3.0規范提供的方法

插一條記錄,它能把主鍵返回來

PreparedStatement.getGeneratedKeys();

PreparedStatementps=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

ps.executeUpdate();

ResultSetrs=st.getGeneratedKeys();

rs.getInt(1);

批量處理:可以大幅提升大量增刪改的速度(并非絕對),與具體數據庫有關,也不一定能提高性能

PreparedStatement.addBatch();

PreparedStatement.executeBatch();

 

-------------------------------------------------------------

可滾動結果集與分頁特性

Statementst=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSet.TYPE_SCROLL_SENSITIVE--對數據庫敏感的,就是說,數據庫中記錄發生了變化,結果集會覺察到(但某些數據庫不一定遵循這一規范,mysql就不遵循)

ResultSet.CONCUR_UPDATABLE--可更新的,就是說,改變結果集中的內容可以影響到數據庫里

ResultSet.CONCUR_READ_ONLY--只讀的,

可滾動的結果集

Statementst=connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSetrs=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("colname","newvalue");

rs.updateRow();

mysql分頁例如:

selectid,name,money,birthdayfromuserlimit150,10;

從user表中第150條記錄開始,取10條記錄

---------------------------------------------------------

jdbc元數據信息數據庫元數據信息、參數元數據信息

DatabaseMetaDatameta=connection.getMetaData();

通過DatabaseMetaData可以獲得數據庫相關的信息,如:

數據庫版本,數據庫名,數據庫廠商信息,是否支持事務,是否支持某種事務隔離級別,

是否支持滾動結果集等。

ParameterMetaDatapmd=preparedStatement.getParameterMetaData();

通過ParameterMetaData可以獲得參數信息.

ParameterMetaDatapmd=ps.getParameterMetaData();

intcount=pmd.getParameterCount();

System.out.println("count="+count);

for(inti=1;i<=count;i++)

{

ps.setObject(i,params[i-1]);

}

ResultSetrs=ps.executeQuery();

--------------------------------------------------

dataSource代理模式:

組合優先于繼承

攔截Connection.close()方法

動態代理

調用處理器

----------------------------------------------------

數據源和連接池

DataSource用來取代DriverManger來獲取Connection

通過DataSource獲得Connection速度很快

通過DataSource獲得的Connection都是已經被包裹過的(不是驅動原來的連接),

他的close方法已經被修改

一般DataSource內部會用一個連接池來緩存Connection,這樣可以大幅度提高

數據庫的訪問速度;

連接池可以理解成一個能夠存放Connection的Connection

我們的程序只和DataSource打交道,不會直接訪問連接池。

------------------------------------------

DBCP的應用

1.加載三個.jar

2.寫dbcpconfig.properties配置文件

3.創建DataSource數據源

使用DBCP必須用的三個包

commons-dbcp-1.2.2\commons-dbcp-1.2.1.jar,

spring-framework-2.5.6\lib\jakarta-commons\commons-pool.jar,commons-collection-3.1.jar

dbcpconfig.properties

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/jdbc

username=root

password=root

#初始化連接

initialSize=10

#***連接數量

maxActive=50

#***空閑連接

maxIdle=20

#最小空閑連接

minIdle=5

#超時等待時間以毫秒為單位

maxWait=60000

#JDBC驅動建立連接時附帶的連接屬性格式必須為這樣:屬性名=property

#注注意user與password兩個屬性會被明確地傳遞。因此這里不需要包含他們

connectionProperties=useUnicode=true;characterEncoding=utf-8

#指定由連接池所創建的連接的自動提交auto-commit狀態

defaultAutoCommit=true

#driverdefault指定由連接池所創建的連接的只讀read-only狀態

#如果沒有設置該值,則setReadOnly方法不被調用。

defaultReadOnly=

#driverdefault指定由連接池所創建的連接的事務級別TransactionIsolation

#可用值為下列之一:這依賴于數據庫

#NONE,READ_UNCOMMITED,READ_COMMITTED

defaultTransactionIsolation=READ_COMMITTED

 

----------------------------------------------------

創建數據源

Propertiesprop=newProperties();

prop.setProperty("driverClassName","com.mysql.jdbc.Driver");

prop.setProperty("url","jdbc:mysql://localhost:3306/jdbc");

prop.setProperty("username","root");

prop.setProperty("password","root");

#dbcp使用這個方法創建數據源,需要一個Property參數,參數中的鍵值對就為.properties文件中的配置

#可以直接load進來,省的寫了

Propertiesprop=newProperties();

InputStreamis=JdbcUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");

prop.load(is);

DataSourcemyDataSource=BasicDataSourceFactory.createDataSource(prop);

-------------------------------------------------------------------------

模板模式對查詢抽象,采用繼承的方式(對查詢來說,不夠靈活,查詢的列一變化,就得修改超類)

策略模式(采用接口的方式傳遞一個接口的參數,通過匿名類為各種需求實現)

-----------------------------------------------------------------------

使用JdbcTemplate工具類,在spring框架中提供了一個JdbcTemplate工具類,這個類對JDBCAPI進行了很好的封裝

這個類就像我們自己對JDBC進行封裝一樣。只是代碼列健壯,功能更強大而已。

我們以后在實際項目中可以使用JdbcTemplate類來完全替代直接使用JDBCAPI這與直接使用jdbcapi沒有太大性能區別

使用JdbcTemplate工具類需要額外從spring開發包中導入spring.jar和commons-logging.jar

關于jdbcTemplate查詢,更新相關使用方法見練習

如果想獲取connection,自由進行操作,可以使用

  1. jdbc.execute(newConnectionCallback()  
  2. {  
  3.  
  4. publicObjectdoInConnection(Connectionconn)throwsSQLException,  
  5. DataAccessException  
  6. {}  
  7. });//拿到了Connction隨你怎么用了  
  8.  
  9. -------------------------------------------------------------------  
  10. Spring的NameParameterJdbcTemplate  
  11. NameParameterJdbcTemplate內部包含了一個JdbcTemplate,所以JdbcTemplate能做的事情它都能做  
  12. NameParameterJdbcTemplate相對于JdbcTemplate主要增加了參數可以命名的功能  
  13.  
  14. publicObjectqueryForObject(Stringsql,MapparamMap,RowMapperrowMapper)  
  15. publicObjectqueryForObject(Stringsql,SqlParameterSourceparamSource,RowMapperrowMapper) 

#p#

SqlParameterSource的兩個主要實現MapSqlParameterSource和BeanPropertyParameterSource

SimpleJdbcTemplate內部包含了一個NamedParameterJdbcTemplate,所以NamedParameterJdbcTemplate

能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相對于NamedParameterJdbcTemplate主要

增加了JDK5.0的泛型技術和可變長度參數支持

simpleJdbcTemplate中有些方法不全,比如拿到主鍵的方法就沒有,可以獲取到NamedParameterJdbcTemplate

調用它里面的方法

getNamedParameterJdbcOperations()返回的是NamedParameterJdbcOperations其實現就是NamedParameterJdbcTemplate這個類

getJdbcOperations()返回的是JdbcOperation其實現就是JdbcTemplate

++++++++++++++++++++++++++++++++++++++++++++++++++

Map參數源:采用鍵值對方式傳參(參數別名可任意,如:m,:n)

  1. staticUserfindUser(Useruser)  
  2. {  
  3. NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);  
  4. Stringsql="selectid,name,money,birthdayfromuserwheremoney>:mandid<:n";  
  5. Mapmap=newHashMap();  
  6. map.put("m",user.getMoney());  
  7. map.put("n",user.getId());  
  8. Objectu=named.queryForObject(sql,map,newBeanPropertyRowMapper(User.class));//這個方法當查詢對象多于一個或為null時會拋異常  
  9. return(User)u;  

Bean屬性參數源使用方法(參數別名要與bean類的屬性對應,如:money,:id)(通過&號也可以命名別名,不建議使用)

  1. staticUserfindUser(Useruser)  
  2. {  
  3. NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);  
  4. Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";  
  5. SqlParameterSourceps=newBeanPropertySqlParameterSource(user);  
  6.  
  7. Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(User.class));//這個方法當查詢對象多于一個或為null時會拋異常  
  8. return(User)u;  
  9. //保存數據獲得主鍵

    publicintupdate(Stringsql,SqlParameterSourceparamSource,KeyHoldergeneratedKeyHolder)staticvoidaddUser(Useruser)

    {

    NameParameterJdbcTemplatenamed=newNameParameterJdbcTemplate(dataSource);

    Stringsql="insertintouser(name,birthday,money)values(:name,:birthday,:money";

    SqlParameterSourceps=newBeanPropertySqlParameterSource(user);

    KeyHolderkeyHolder=newGeneratedKeyHolder();

    named.update(sql,ps,keyHolder);

    intid=keyHolder.getKey().intValue();user.setId(id);//如果不是整型的主鍵呢,使用Mapmap=keyHolder.getKeys();}

JDBC的概念:使用泛型技術與可變長度的參數(JDK1.5版本以上)

  1. //泛型技術(JDK1.5以上版本可使用)  
  2. //使用泛型技術與可變長度的參數(JDK1.5版本以上)  
  3. staticUserfindUserSimple(Stringname)  
  4. {  
  5. SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());  
  6.  
  7. Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";  
  8.  
  9. //用這個泛型,返回結果就不用向下轉型了  
  10. //publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessException  
  11. Useru=simple.queryForObject(sql,  
  12. ParameterizedBeanPropertyRowMapper.newInstance(  
  13. User.class),name);//這個行映射器的參數是可變長的Object...  
  14. returnu;  
  15. }  
  16.  
  17.  
  18. -----------------------------------------------------------------------------------------------------------------------  
  19. //代碼  
  20.  
  21. importjava.util.HashMap;  
  22. importjava.util.Map;  
  23.  
  24. importorg.springframework.jdbc.core.BeanPropertyRowMapper;  
  25. importorg.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;  
  26. importorg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;  
  27. importorg.springframework.jdbc.core.namedparam.SqlParameterSource;  
  28.  
  29. importcom.feihu.domain.User;  
  30. importcom.feihu.jdbc.JdbcUtil;  
  31.  
  32. publicclassSimpleJdbcTemplate  
  33. {  
  34. privatestaticNamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(  
  35. JdbcUtil.getDataSource());  
  36.  
  37. ///參數命名方法查詢NamedParameterJdbcTemplate  
  38. //兩種參數傳遞方法BeanPropertySqlParameterSource(user)、MapSqlParameterSource  
  39.  
  40. //bean屬性參數源  
  41. staticUserfindUser(Useruser)  
  42. {  
  43. //Bean屬性參數源使用方法(參數別名要與bean類的屬性對應,如:money,:id)(通過&號也可以命名別名,不建議使用)  
  44.  
  45. Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";  
  46. SqlParameterSourceps=newBeanPropertySqlParameterSource(user);  
  47.  
  48. Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(  
  49. User.class));//這個方法當查詢對象多于一個或為null時會拋異常  
  50. return(User)u;  
  51. }  
  52.  
  53. //Map參數源  
  54. staticUserfindUser2(Useruser)  
  55. {  
  56. Stringsql="selectid,name,money,birthdayfromuserwheremoney>:mandid<:n";  
  57. Mapmap=newHashMap();  
  58. map.put("m",user.getMoney());  
  59. map.put("n",user.getId());  
  60. Objectu=named.queryForObject(sql,map,newBeanPropertyRowMapper(  
  61. User.class));//這個方法當查詢對象多于一個或為null時會拋異常  
  62. return(User)u;  
  63. }  
  64.  
  65. //泛型技術(JDK1.5以上版本可使用)  
  66. //使用泛型技術與可變長度的參數(JDK1.5版本以上)  
  67. staticUserfindUserSimple(Stringname)  
  68. {  
  69. SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());  
  70.  
  71. Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";  
  72.  
  73. //用這個泛型,返回結果就不用向下轉型了  
  74. //publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessException  
  75. Useru=simple.queryForObject(sql,  
  76. ParameterizedBeanPropertyRowMapper.newInstance(  
  77. User.class),name);//這個行映射器的參數是可變長的Object...  
  78. returnu;  
  79. }  

【編輯推薦】

  1. 使用JDBC的五個精華功能
  2. Tomcat5+MySQL JDBC連接池配置
  3. 在Weblogic中實現JDBC的功能
  4. 詳解JDBC與Hibernate區別
  5. JDBC連接MySQL數據庫關鍵四步
  6. 淺談JDBC DAO的設計理念
責任編輯:彭凡 來源: 新浪科技
相關推薦

2010-09-13 14:34:55

2009-07-01 17:58:20

JSP

2009-08-20 19:08:30

C#異步調用

2017-05-02 14:45:11

深度學習機器學習人工神經網絡

2009-07-15 15:47:12

JDBC DAO

2010-06-30 17:34:25

SNMP Trap

2009-07-23 13:30:46

JDBC事務

2009-06-24 11:12:17

callerJavascript

2009-06-29 17:17:57

Spring

2009-07-20 17:41:59

Java JDBC

2009-07-21 17:41:58

JDBC數據源

2009-06-17 15:25:59

Java學習

2021-08-29 23:25:36

前端開發工具

2015-12-10 09:24:54

Linux架構理解

2009-07-14 17:01:24

JDBC基礎

2017-05-22 16:00:14

2010-01-26 17:42:14

Android浮點

2018-09-29 10:05:54

深度學習神經網絡神經元

2010-01-07 13:27:15

JSON概念

2009-07-15 18:07:47

JDBC代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九成人| 天天影视网天天综合色在线播放 | 国产精品日日摸夜夜添夜夜av | 日本免费一区二区三区 | 中文字幕在线播放第一页 | 中文字幕加勒比 | 欧美成人免费在线 | 日韩欧美在线观看视频网站 | 色视频在线播放 | 国产激情视频网 | 亚洲欧美第一视频 | 久久久精彩视频 | 亚洲精品自在在线观看 | 尤物在线 | 亚洲免费大片 | www.日本在线播放 | 日韩午夜在线播放 | 成人h视频在线 | 国产欧美一区二区三区在线播放 | 国产午夜在线观看 | 欧美激情在线一区二区三区 | 日韩高清在线观看 | 香蕉久久av | avtt国产| 精品国模一区二区三区欧美 | 丝袜美腿一区二区三区动态图 | 欧美精品一区在线发布 | 天天操妹子 | 7777在线视频免费播放 | 国产在线中文字幕 | 免费久 | 在线播放亚洲 | 国产成人jvid在线播放 | 三级特黄特色视频 | 国产小视频自拍 | 精品99在线| 久久久毛片| 中文字幕不卡在线观看 | 中文字幕人成乱码在线观看 | 亚洲欧美激情精品一区二区 | 婷婷福利 |