resultset接口的方法 resultset獲取數(shù)據(jù)
ibatis是如何找到dao層的介紹本質(zhì)還是很簡單的,原來用JDBC實現(xiàn)的時候,你得寫各種類,類里面寫好各種操作SQL的語句,現(xiàn)在用了XML以后,只不過是把這些信息保存...
ibatis是如何找到dao層的
介紹
本質(zhì)還是很簡單的,原來用JDBC實現(xiàn)的時候,你得寫各種類,類里面寫好各種操作SQL的語句,現(xiàn)在用了XML以后,只不過是把這些信息保存到XML中了,運行的時候還是會有類來執(zhí)行SQL語句的,這個類是怎么來的呢?是Mybatis框架利用:動態(tài)代理和反射機(jī)制這2種機(jī)制,來幫你把這個類給創(chuàng)建出來,簡單總結(jié)一下原理,你可以去看看mybatis的源碼,類不多,還是比較容易理清楚的,我?guī)湍憧偨Y(jié)一下大概流程
Mybatis的運行分為兩部分,第一部分是讀取配置文件緩存到Coufiguration對象,用以創(chuàng)建SqlSessionFactory,第二部分是SqlSession的執(zhí)行過程。
Mybatis實現(xiàn)的基本原理是利用:動態(tài)代理和反射機(jī)制。動態(tài)代理中用到JDK動態(tài)代理和CGLIB代理。這兩者的區(qū)別是,JDK動態(tài)代理是接口的,CGLIB代理是對于類的。Mybatis中這兩種代理都用到過,Mapper中用到的是JDK動態(tài)代理,在延遲加載的時候用到CGLIB代理。
(1)構(gòu)建SqlSessionFactory過程SqlSessionFactory是Mybatis的核心類,主要功能時提供創(chuàng)建Mybatis的核心接口SqlSession,我們需要創(chuàng)建SqlSessionFactory,為此我們提供配置文件和相關(guān)參數(shù)。通過SqlSessionFactoryBuilder去構(gòu)建。
首先通過org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML文件,讀取配置參數(shù),并將讀取的數(shù)據(jù)存入這個org.apache.ibatis.session.Configuration類中。其次使用Configuration對象去創(chuàng)建SqlSessionFactory。
(2)構(gòu)建ConfigurationConfiguration的作用;
1)讀取配置文件,包括基礎(chǔ)配置的XML文件和映射器的XML文件
2)初始化基礎(chǔ)配置,比如Mybatis的別名等,一些重要的類對象,例如,插件、映射器、ObjectFactory和typeHandler對象。
3)提供單例,為后續(xù)創(chuàng)建SqlSessionFactory服務(wù)并提供配置的參數(shù)。
4)執(zhí)行一些重要的對象方法,初始化配置信息。
(3)映射器的內(nèi)部組成一般而言映射器有三部分組成,MappedStatement、SqlSource和BoundSql。
MappedStatement:它保存了一個映射器的節(jié)點(select|delete|update)。包括許多我們配置的SQL、SQL的id、緩存信息、resultMap、paramterType、resultType、languageDriver等重要配置信息。
SqlSource:提供BoundSql的地方,它是MappedStatement的一個屬性。是一個接口,主要作用是根據(jù)參數(shù)和其它的規(guī)則組裝SQL。
BoundSql:建立SQL和參數(shù)的地方。常用用用三個參數(shù):SQL,parameterObject、parameterMappings。
(4)構(gòu)建SqlSessionFactorysqlsessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
(5)SqlSession運行過程
SqlSession是一個接口,使用它并不復(fù)雜。我們構(gòu)建SqlSessionFactory就可以輕松容易地拿到Sqlseesion了。
1)映射器的動態(tài)代理
Mapper映射是通過動態(tài)代理來實現(xiàn)的。映射器的xml命名空間對應(yīng)的便是這個接口的全路徑,那么它根據(jù)全路徑和方法名便能夠綁定起來,通過動態(tài)代理技術(shù),讓這個接口跑起來。
2)SqlSession下的四大對象
映射器其實就是一個動態(tài)代理對象,進(jìn)入到了MapperMethod的execute方法。它經(jīng)過簡單的判斷就進(jìn)入了SqlSession的刪除、更新、插入和選擇等方法。
Mapper的執(zhí)行其實就是通過Executor、StatementHandler、ParameterHandler和ResultHandler來完成數(shù)據(jù)操作和結(jié)果的返回。
Executor:執(zhí)行器,由它來調(diào)度StatementHandler、Parameterhandler、ResultHandler等來執(zhí)行對應(yīng)的SQL。
StatementHandler:使用數(shù)據(jù)的Statement執(zhí)行操作,它是四大對象的核心,起到承上啟下的作用。
ParameterHandler:用于SQL對參數(shù)的處理。
ResultHandler:進(jìn)行最后數(shù)據(jù)集(ResultSet)的封裝返回處理。
1)執(zhí)行器(Executor):它是一個真正執(zhí)行Java和數(shù)據(jù)交互的地方。在Mybatis中有三種執(zhí)行器。SIMPLE(簡單執(zhí)行器,這是默認(rèn)的)、REUSE(重用預(yù)處理語句)和Batch(執(zhí)行重用語句和批量更新,它是針對批量專用的執(zhí)行器)。
2)數(shù)據(jù)庫會話器(StatementHandler):專門來處理數(shù)據(jù)庫會話的。
3)參數(shù)處理器(ParameterHandler):對預(yù)編譯語句進(jìn)行參數(shù)處理。
4)結(jié)果處理器(ResultSetHandler):組裝結(jié)果集的返回。
(5)總結(jié)SqlSession是通過Executor創(chuàng)建StatementHandler來運行的,而StatementHandler要經(jīng)過下面的三步。Prepared預(yù)編譯SQL、parametersize設(shè)置參數(shù)和query/update執(zhí)行SQL。
其中parametersize是調(diào)用parameterHandler的方法去設(shè)置的,而參數(shù)是根據(jù)類型處理器typeHandler去處理。query/update方法通過resultHandler進(jìn)行處理結(jié)果的封裝,如果是update語句,它就返回整數(shù),否則它就通過typeHandler處理結(jié)果類型,然后用ObjectFactory提供的規(guī)則組裝對象,返回給調(diào)用者,這就是SqlSession執(zhí)行的過程。
result接口詳解
ResultSet接口提供了一整套的定位方法這些可以在記錄集中定位的任意一行,具體有:publicbooleanabsolute(introw);該方法的作用是將記錄集中的某一行設(shè)定為當(dāng)前行,亦即將數(shù)據(jù)庫游標(biāo)移動到指定的行,參數(shù)row指定了目標(biāo)行的行號,這是絕對的行號,由記錄集的第一行開始計算,不是相對的行號。
executeQuery()是干什么用的實現(xiàn)什么功能啊
使用JDBC連接數(shù)據(jù)庫需要四步,第一步加載驅(qū)動程序;
第二步,連接數(shù)據(jù)庫;
第三步,訪問數(shù)據(jù)庫;
第四步,執(zhí)行查詢;其中在第四步執(zhí)行查詢時,要用statement類的executeQuery()方法來下達(dá)select指令以查詢數(shù)據(jù)庫,executeQuery()方法會把數(shù)據(jù)庫響應(yīng)的查詢結(jié)果存放在ResultSet類對象中供我們使用。即語句:
Stringsql="select*from"+tableName;ResultSetrs=s.executeQuery(sql);
beanhandler是什么
是ResultSetHandler接口的實現(xiàn),負(fù)責(zé)將第一個ResultSet行轉(zhuǎn)換為JavaBean。這個類是線程安全的。
resultsetmetadata rsmd = rs.getmetadata;是什么意思
ResultSetMetaDatarsmt=rs.getMetaData();
得到結(jié)果集(rs)的結(jié)構(gòu),比如字段數(shù)、字段名等。
使用rs.getMetaData().getTableName(1))就可以返回表名
rs.getMetaData().getColumnCount()
取得列數(shù)
例子:
ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTABLE2");//得到查詢結(jié)果,一個數(shù)據(jù)集
ResultSetMetaDatarsmd=rs.getMetaData();
intnumberOfColumns=rsmd.getColumnCount();//得到數(shù)據(jù)集的列數(shù)
“Execute”,的作用是什么
“Execute”是JAVA語言的一種,作用是執(zhí)行動態(tài)的SQL語句或非運行時創(chuàng)建的PL/SQL塊,動態(tài)創(chuàng)建和執(zhí)行SQL語句。Execute語句的方法:方法executeQuery用于產(chǎn)生單個結(jié)果集的語句,例如SELECT語句。
被使用最多的執(zhí)行SQL語句的方法是executeQuery。
這個方法被用來執(zhí)行SELECT語句,它幾乎是使用最多的SQL語句。
方法executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語句以及SQLDDL(數(shù)據(jù)定義語言)語句,例如CREATETABLE和DROPTABLE。
INSERT、UPDATE或DELETE語句的效果是修改表中零行或多行中的一列或多列。
executeUpdate的返回值是一個整數(shù),指示受影響的行數(shù)(即更新計數(shù))。
對于CREATETABLE或DROPTABLE等不操作行的語句,executeUpdate的返回值總為零。使用executeUpdate方法是因為在createTableCoffees中的SQL語句是DDL(數(shù)據(jù)定義語言)語句。創(chuàng)建表,改變表,刪除表都是DDL語句的例子,要用executeUpdate方法來執(zhí)行。
你也可以從它的名字里看出,方法executeUpdate也被用于執(zhí)行更新表SQL語句。
實際上,相對于創(chuàng)建表來說,executeUpdate用于更新表的時間更多,因為表只需要創(chuàng)建一次,但經(jīng)常被更新。方法execute:用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者組合的語句。因為多數(shù)程序員不會需要該高級功能。execute方法應(yīng)該僅在語句能返回多個ResultSet對象、多個更新計數(shù)或ResultSet對象與更新計數(shù)的組合時使用。
當(dāng)執(zhí)行某個已存儲過程或動態(tài)執(zhí)行未知SQL字符串(即應(yīng)用程序程序員在編譯時未知)時,有可能出現(xiàn)多個結(jié)果的情況,盡管這種情況很少見。
因為方法execute處理非常規(guī)情況,所以獲取其結(jié)果需要一些特殊處理并不足為怪。
例如,假定已知某個過程返回兩個結(jié)果集,則在使用方法execute執(zhí)行該過程后,必須調(diào)用方法getResultSet獲得第一個結(jié)果集,然后調(diào)用適當(dāng)?shù)膅etXXX方法獲取其中的值。
要獲得第二個結(jié)果集,需要先調(diào)用getMoreResults方法,然后再調(diào)用getResultSet方法。
如果已知某個過程返回兩個更新計數(shù),則首先調(diào)用方法getUpdateCount,然后調(diào)用getMoreResults,并再次調(diào)用getUpdateCount。
對于不知道返回內(nèi)容,則情況更為復(fù)雜。
如果結(jié)果是ResultSet對象,則方法execute返回true;如果結(jié)果是Javaint,則返回false。如果返回int,則意味著結(jié)果是更新計數(shù)或執(zhí)行的語句是DDL命令。在調(diào)用方法execute之后要做的第一件事情是調(diào)用getResultSet或getUpdateCount。
調(diào)用方法getResultSet可以獲得兩個或多個ResultSet對象中第一個對象;或調(diào)用方法getUpdateCount可以獲得兩個或多個更新計數(shù)中第一個更新計數(shù)的內(nèi)容。豆瓣:https://www.douban.com
本文鏈接:http://xinin56.com/ruanjian/411.html