溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JDBC的概念是什么

發(fā)布時(shí)間:2021-12-22 13:41:32 來(lái)源:億速云 閱讀:172 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“JDBC的概念是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

JDBC的概念:doMaim對(duì)象(javaBean實(shí)體)

UserDao(DataAccessObject)

工廠模式,F(xiàn)actory消除UserDaoTest業(yè)務(wù)類(lèi)對(duì)具體實(shí)現(xiàn)UserDaoJdbc類(lèi)的依賴(lài)

讀配置文件,通過(guò)工廠讀配置文件來(lái)加載信息,具體實(shí)現(xiàn)類(lèi)使用工廠來(lái)獲取實(shí)現(xiàn)接口類(lèi)的對(duì)象

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

工廠-->生產(chǎn)產(chǎn)品(Dao這個(gè)產(chǎn)品)

類(lèi)加載器,不光可以load.class,還可以load其他的文件

事務(wù)概念與處理

1.原子性:不能拆分,組成事事務(wù)處理的語(yǔ)句形成一個(gè)邏輯處理單元,不能只執(zhí)行其中的一部分

2.一致性:事務(wù)做完之后,保定數(shù)據(jù)的完整性約束

3.隔離性:一個(gè)事務(wù)處理對(duì)另一個(gè)事務(wù)處理的影響

4.持續(xù)性:事務(wù)處理的結(jié)果能被***保存下來(lái)

步驟:打開(kāi)事務(wù)connection.setAutoCommit(false);

提交事務(wù):connection.commit();

回滾事務(wù):connection.rollback();

jdbc缺省是自動(dòng)提交的,客戶端連接也是自動(dòng)提交的,要想打開(kāi)事務(wù),要把自動(dòng)提交關(guān)掉

保存點(diǎn):savePoint

Savepointsp=null

sp=conn.setSavepoint();

conn.rollback(sp);

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

JDBC的概念:跨多個(gè)數(shù)據(jù)庫(kù)的事務(wù)JTA

JTA容器weblogic,websphere

分成兩階段提交。

用到JNDI服務(wù)器

javax.transaction.UserTransactiontx=

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

tx.begin();

//connection1connection2(可能來(lái)自不同的數(shù)據(jù)庫(kù))

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

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

事務(wù)的隔離級(jí)別:

connction.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

隔離級(jí)別

讀未提交(Readuncommitted)可能出現(xiàn)臟讀,不可重復(fù)讀,幻讀

讀已提交(Readcommitted)可能出現(xiàn)不可重復(fù)讀,幻讀

可重復(fù)讀(Repeatableread)可能出現(xiàn)幻讀(幻影數(shù)據(jù),執(zhí)行插入一條數(shù)據(jù),在另一個(gè)客戶端有可能看到)

可串行化(Serializable)

隔離級(jí)別各個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)是不一樣的。

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

關(guān)于存儲(chǔ)過(guò)程(兩層架構(gòu)的時(shí)候用的很多)

三層架構(gòu)的系統(tǒng)很少使用了。略過(guò)不看了先。

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

其他幾個(gè)有用的API

jdbc3.0規(guī)范提供的方法

插一條記錄,它能把主鍵返回來(lái)

PreparedStatement.getGeneratedKeys();

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

ps.executeUpdate();

ResultSetrs=st.getGeneratedKeys();

rs.getInt(1);

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

PreparedStatement.addBatch();

PreparedStatement.executeBatch();

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

可滾動(dòng)結(jié)果集與分頁(yè)特性

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

ResultSet.TYPE_SCROLL_SENSITIVE--對(duì)數(shù)據(jù)庫(kù)敏感的,就是說(shuō),數(shù)據(jù)庫(kù)中記錄發(fā)生了變化,結(jié)果集會(huì)覺(jué)察到(但某些數(shù)據(jù)庫(kù)不一定遵循這一規(guī)范,mysql就不遵循)

ResultSet.CONCUR_UPDATABLE--可更新的,就是說(shuō),改變結(jié)果集中的內(nèi)容可以影響到數(shù)據(jù)庫(kù)里

ResultSet.CONCUR_READ_ONLY--只讀的,

可滾動(dòng)的結(jié)果集

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分頁(yè)例如:

selectid,name,money,birthdayfromuserlimit150,10;

從user表中第150條記錄開(kāi)始,取10條記錄

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

jdbc元數(shù)據(jù)信息數(shù)據(jù)庫(kù)元數(shù)據(jù)信息、參數(shù)元數(shù)據(jù)信息

DatabaseMetaDatameta=connection.getMetaData();

通過(guò)DatabaseMetaData可以獲得數(shù)據(jù)庫(kù)相關(guān)的信息,如:

數(shù)據(jù)庫(kù)版本,數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)廠商信息,是否支持事務(wù),是否支持某種事務(wù)隔離級(jí)別,

是否支持滾動(dòng)結(jié)果集等。

ParameterMetaDatapmd=preparedStatement.getParameterMetaData();

通過(guò)ParameterMetaData可以獲得參數(shù)信息.

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代理模式:

組合優(yōu)先于繼承

攔截Connection.close()方法

動(dòng)態(tài)代理

調(diào)用處理器

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

數(shù)據(jù)源和連接池

DataSource用來(lái)取代DriverManger來(lái)獲取Connection

通過(guò)DataSource獲得Connection速度很快

通過(guò)DataSource獲得的Connection都是已經(jīng)被包裹過(guò)的(不是驅(qū)動(dòng)原來(lái)的連接),

他的close方法已經(jīng)被修改

一般DataSource內(nèi)部會(huì)用一個(gè)連接池來(lái)緩存Connection,這樣可以大幅度提高

數(shù)據(jù)庫(kù)的訪問(wèn)速度;

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

我們的程序只和DataSource打交道,不會(huì)直接訪問(wèn)連接池。

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

DBCP的應(yīng)用

1.加載三個(gè).jar

2.寫(xiě)dbcpconfig.properties配置文件

3.創(chuàng)建DataSource數(shù)據(jù)源

使用DBCP必須用的三個(gè)包

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

#***連接數(shù)量

maxActive=50

#***空閑連接

maxIdle=20

#最小空閑連接

minIdle=5

#超時(shí)等待時(shí)間以毫秒為單位

maxWait=60000

#JDBC驅(qū)動(dòng)建立連接時(shí)附帶的連接屬性格式必須為這樣:屬性名=property

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

connectionProperties=useUnicode=true;characterEncoding=utf-8

#指定由連接池所創(chuàng)建的連接的自動(dòng)提交auto-commit狀態(tài)

defaultAutoCommit=true

#driverdefault指定由連接池所創(chuàng)建的連接的只讀read-only狀態(tài)

#如果沒(méi)有設(shè)置該值,則setReadOnly方法不被調(diào)用。

defaultReadOnly=

#driverdefault指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別TransactionIsolation

#可用值為下列之一:這依賴(lài)于數(shù)據(jù)庫(kù)

#NONE,READ_UNCOMMITED,READ_COMMITTED

defaultTransactionIsolation=READ_COMMITTED

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

創(chuàng)建數(shù)據(jù)源

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使用這個(gè)方法創(chuàng)建數(shù)據(jù)源,需要一個(gè)Property參數(shù),參數(shù)中的鍵值對(duì)就為.properties文件中的配置

#可以直接load進(jìn)來(lái),省的寫(xiě)了

Propertiesprop=newProperties();

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

prop.load(is);

DataSourcemyDataSource=BasicDataSourceFactory.createDataSource(prop);

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

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

策略模式(采用接口的方式傳遞一個(gè)接口的參數(shù),通過(guò)匿名類(lèi)為各種需求實(shí)現(xiàn))

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

使用JdbcTemplate工具類(lèi),在spring框架中提供了一個(gè)JdbcTemplate工具類(lèi),這個(gè)類(lèi)對(duì)JDBCAPI進(jìn)行了很好的封裝

這個(gè)類(lèi)就像我們自己對(duì)JDBC進(jìn)行封裝一樣。只是代碼列健壯,功能更強(qiáng)大而已。

我們以后在實(shí)際項(xiàng)目中可以使用JdbcTemplate類(lèi)來(lái)完全替代直接使用JDBCAPI這與直接使用jdbcapi沒(méi)有太大性能區(qū)別

使用JdbcTemplate工具類(lèi)需要額外從spring開(kāi)發(fā)包中導(dǎo)入spring.jar和commons-logging.jar

關(guān)于jdbcTemplate查詢,更新相關(guān)使用方法見(jiàn)練習(xí)

如果想獲取connection,自由進(jìn)行操作,可以使用

jdbc.execute(newConnectionCallback()  {   publicObjectdoInConnection(Connectionconn)throwsSQLException,  DataAccessException  {}  });//拿到了Connction隨你怎么用了   -------------------------------------------------------------------  Spring的NameParameterJdbcTemplate  NameParameterJdbcTemplate內(nèi)部包含了一個(gè)JdbcTemplate,所以JdbcTemplate能做的事情它都能做  NameParameterJdbcTemplate相對(duì)于JdbcTemplate主要增加了參數(shù)可以命名的功能   publicObjectqueryForObject(Stringsql,MapparamMap,RowMapperrowMapper)  publicObjectqueryForObject(Stringsql,SqlParameterSourceparamSource,RowMapperrowMapper)

SqlParameterSource的兩個(gè)主要實(shí)現(xiàn)MapSqlParameterSource和BeanPropertyParameterSource

SimpleJdbcTemplate內(nèi)部包含了一個(gè)NamedParameterJdbcTemplate,所以NamedParameterJdbcTemplate

能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相對(duì)于NamedParameterJdbcTemplate主要

增加了JDK5.0的泛型技術(shù)和可變長(zhǎng)度參數(shù)支持

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

調(diào)用它里面的方法

getNamedParameterJdbcOperations()返回的是NamedParameterJdbcOperations其實(shí)現(xiàn)就是NamedParameterJdbcTemplate這個(gè)類(lèi)

getJdbcOperations()返回的是JdbcOperation其實(shí)現(xiàn)就是JdbcTemplate

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

Map參數(shù)源:采用鍵值對(duì)方式傳參(參數(shù)別名可任意,如: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));//這個(gè)方法當(dāng)查詢對(duì)象多于一個(gè)或?yàn)閚ull時(shí)會(huì)拋異常  return(User)u;  }

Bean屬性參數(shù)源使用方法(參數(shù)別名要與bean類(lèi)的屬性對(duì)應(yīng),如:money,:id)(通過(guò)&號(hào)也可以命名別名,不建議使用)

staticUserfindUser(Useruser)  {  NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);  Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";  SqlParameterSourceps=newBeanPropertySqlParameterSource(user);   Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(User.class));//這個(gè)方法當(dāng)查詢對(duì)象多于一個(gè)或?yàn)閚ull時(shí)會(huì)拋異常  return(User)u;  } //保存數(shù)據(jù)獲得主鍵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的概念:使用泛型技術(shù)與可變長(zhǎng)度的參數(shù)(JDK1.5版本以上)

//泛型技術(shù)(JDK1.5以上版本可使用)  //使用泛型技術(shù)與可變長(zhǎng)度的參數(shù)(JDK1.5版本以上)  staticUserfindUserSimple(Stringname)  {  SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());   Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";   //用這個(gè)泛型,返回結(jié)果就不用向下轉(zhuǎn)型了  //publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessException  Useru=simple.queryForObject(sql,  ParameterizedBeanPropertyRowMapper.newInstance(  User.class),name);//這個(gè)行映射器的參數(shù)是可變長(zhǎng)的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());   ///參數(shù)命名方法查詢NamedParameterJdbcTemplate  //兩種參數(shù)傳遞方法BeanPropertySqlParameterSource(user)、MapSqlParameterSource   //bean屬性參數(shù)源  staticUserfindUser(Useruser)  {  //Bean屬性參數(shù)源使用方法(參數(shù)別名要與bean類(lèi)的屬性對(duì)應(yīng),如:money,:id)(通過(guò)&號(hào)也可以命名別名,不建議使用)   Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";  SqlParameterSourceps=newBeanPropertySqlParameterSource(user);   Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(  User.class));//這個(gè)方法當(dāng)查詢對(duì)象多于一個(gè)或?yàn)閚ull時(shí)會(huì)拋異常  return(User)u;  }   //Map參數(shù)源  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));//這個(gè)方法當(dāng)查詢對(duì)象多于一個(gè)或?yàn)閚ull時(shí)會(huì)拋異常  return(User)u;  }   //泛型技術(shù)(JDK1.5以上版本可使用)  //使用泛型技術(shù)與可變長(zhǎng)度的參數(shù)(JDK1.5版本以上)  staticUserfindUserSimple(Stringname)  {  SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());   Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";   //用這個(gè)泛型,返回結(jié)果就不用向下轉(zhuǎn)型了  //publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessException  Useru=simple.queryForObject(sql,  ParameterizedBeanPropertyRowMapper.newInstance(  User.class),name);//這個(gè)行映射器的參數(shù)是可變長(zhǎng)的Object...  returnu;  }  }

“JDBC的概念是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI