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,自由進行操作,可以使用
jdbc.execute(newConnectionCallback(){publicObjectdoInConnection(Connectionconn)throwsSQLException,DataAccessException{}});//拿到了Connction隨你怎么用了-------------------------------------------------------------------Spring的NameParameterJdbcTemplateNameParameterJdbcTemplate內部包含了一個JdbcTemplate,所以JdbcTemplate能做的事情它都能做NameParameterJdbcTemplate相對于JdbcTemplate主要增加了參數可以命名的功能publicObjectqueryForObject(Stringsql,MapparamMap,RowMapperrowMapper)publicObjectqueryForObject(Stringsql,SqlParameterSourceparamSource,RowMapperrowMapper)
SqlParameterSource的兩個主要實現MapSqlParameterSource和BeanPropertyParameterSource
SimpleJdbcTemplate內部包含了一個NamedParameterJdbcTemplate,所以NamedParameterJdbcTemplate
能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相對于NamedParameterJdbcTemplate主要
增加了JDK5.0的泛型技術和可變長度參數支持
simpleJdbcTemplate中有些方法不全,比如拿到主鍵的方法就沒有,可以獲取到NamedParameterJdbcTemplate
調用它里面的方法
getNamedParameterJdbcOperations()返回的是NamedParameterJdbcOperations其實現就是NamedParameterJdbcTemplate這個類
getJdbcOperations()返回的是JdbcOperation其實現就是JdbcTemplate
++++++++++++++++++++++++++++++++++++++++++++++++++
Map參數源:采用鍵值對方式傳參(參數別名可任意,如:m,:n)
staticUserfindUser(Useruser){NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);Stringsql="selectid,name,money,birthdayfromuserwheremoney>:mandid<:n";Mapmap=newHashMap();map.put("m",user.getMoney());map.put("n",user.getId());Objectu=named.queryForObject(sql,map,newBeanPropertyRowMapper(User.class));//這個方法當查詢對象多于一個或為null時會拋異常return(User)u;}
Bean屬性參數源使用方法(參數別名要與bean類的屬性對應,如:money,:id)(通過&號也可以命名別名,不建議使用)
staticUserfindUser(Useruser){NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";SqlParameterSourceps=newBeanPropertySqlParameterSource(user);Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(User.class));//這個方法當查詢對象多于一個或為null時會拋異常return(User)u;}//保存數據獲得主鍵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版本以上)
//泛型技術(JDK1.5以上版本可使用)//使用泛型技術與可變長度的參數(JDK1.5版本以上)staticUserfindUserSimple(Stringname){SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";//用這個泛型,返回結果就不用向下轉型了//publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessExceptionUseru=simple.queryForObject(sql,ParameterizedBeanPropertyRowMapper.newInstance(User.class),name);//這個行映射器的參數是可變長的Object...returnu;}-----------------------------------------------------------------------------------------------------------------------//代碼importjava.util.HashMap;importjava.util.Map;importorg.springframework.jdbc.core.BeanPropertyRowMapper;importorg.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;importorg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;importorg.springframework.jdbc.core.namedparam.SqlParameterSource;importcom.feihu.domain.User;importcom.feihu.jdbc.JdbcUtil;publicclassSimpleJdbcTemplate{privatestaticNamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(JdbcUtil.getDataSource());///參數命名方法查詢NamedParameterJdbcTemplate//兩種參數傳遞方法BeanPropertySqlParameterSource(user)、MapSqlParameterSource//bean屬性參數源staticUserfindUser(Useruser){//Bean屬性參數源使用方法(參數別名要與bean類的屬性對應,如:money,:id)(通過&號也可以命名別名,不建議使用)Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";SqlParameterSourceps=newBeanPropertySqlParameterSource(user);Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(User.class));//這個方法當查詢對象多于一個或為null時會拋異常return(User)u;}//Map參數源staticUserfindUser2(Useruser){Stringsql="selectid,name,money,birthdayfromuserwheremoney>:mandid<:n";Mapmap=newHashMap();map.put("m",user.getMoney());map.put("n",user.getId());Objectu=named.queryForObject(sql,map,newBeanPropertyRowMapper(User.class));//這個方法當查詢對象多于一個或為null時會拋異常return(User)u;}//泛型技術(JDK1.5以上版本可使用)//使用泛型技術與可變長度的參數(JDK1.5版本以上)staticUserfindUserSimple(Stringname){SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";//用這個泛型,返回結果就不用向下轉型了//publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessExceptionUseru=simple.queryForObject(sql,ParameterizedBeanPropertyRowMapper.newInstance(User.class),name);//這個行映射器的參數是可變長的Object...returnu;}}
“JDBC的概念是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注本站網站,小編將為大家輸出更多高質量的實用文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
【資料圖】有關腰圍和尺碼怎么換算方面的知識,估計很多人不是太了解,今天就給大家詳細的介紹一下關于腰圍和尺碼怎么換算的相關內容。1、腰圍(WC),指的是經臍點(om)的腰部水平圍長,是反映脂肪總量和脂肪分布的綜合指標,世界衛生組織推薦的測量方法是:被測者站立,雙腳分開25至30厘米,體重均勻分配。2、“尺碼”一般指衣服的尺寸碼數,衣服、鞋襪肥瘦或大小,以及人體的某些部位長短和大小。3、腰圍和尺碼換算...
紙黃金開盤時間是什么時候?紙黃金是24小時交易的,但不同時點行情會不同,以下是紙黃金交易時間和活躍狀況:1、早5-14點亞洲市場開盤,其推動力量較小,一般行情震蕩幅度較小。2、午間14-18點為歐洲上午市場。3、傍晚18-20點為歐洲的中午休息和美洲市場的清晨,行情波動變大。4、20--24點為歐洲市場的下午盤和美洲市場的上午盤,行情波動較大。5、24點后到清晨,為美國的下午盤,一般此時已經走出了...
什么是滬港通?滬港通是上交所和聯交所建立技術連接,使內地和香港投資者可以通過當地證券公司或經紀商買賣規定范圍內的對方交易所上市的股票。滬港通包括滬股通和港股通兩部分。滬股通,即在港投資者可以買賣規定范圍內的A股。港股通,是指內地投資者可在內地購買規定范圍內的港股。滬港股通的標的股票范圍滬港通包括滬股通和港股通兩部分。目前,證監會已經公布了交易標的:1、滬股通的股票范圍是上海證券交易所上證180指數...