mybatis慣用jdbcType資料型別
mybatis常用jdbcType資料型別
MyBatis 通過包含的jdbcType型別
BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED
TINYINT REAL VARCHAR BINARY BLOB NVARCHAR
SMALLINT DOUBLE LONGVARCHAR VARBINARY CLOB NCHAR
INTEGER NUMERIC DATE LONGVARBINARY BOOLEAN NCLOB
BIGINT DECIMAL TIME NULL CURSOR
<resultMap type="java.util.Map" id="resultjcm"> <result property="FLD_NUMBER" column="FLD_NUMBER" javaType="double" jdbcType="NUMERIC"/> <result property="FLD_VARCHAR" column="FLD_VARCHAR" javaType="string" jdbcType="VARCHAR"/> <result property="FLD_DATE" column="FLD_DATE" javaType="java.sql.Date" jdbcType="DATE"/> <result property="FLD_INTEGER" column="FLD_INTEGER" javaType="int" jdbcType="INTEGER"/> <result property="FLD_DOUBLE" column="FLD_DOUBLE" javaType="double" jdbcType="DOUBLE"/> <result property="FLD_LONG" column="FLD_LONG" javaType="long" jdbcType="INTEGER"/> <result property="FLD_CHAR" column="FLD_CHAR" javaType="string" jdbcType="CHAR"/> <result property="FLD_BLOB" column="FLD_BLOB" javaType="[B" jdbcType="BLOB" /> <result property="FLD_CLOB" column="FLD_CLOB" javaType="string" jdbcType="CLOB"/> <result property="FLD_FLOAT" column="FLD_FLOAT" javaType="float" jdbcType="FLOAT"/> <result property="FLD_TIMESTAMP" column="FLD_TIMESTAMP" javaType="java.sql.Timestamp" jdbcType="TIMESTAMP"/> </resultMap>
JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIMAL java.math.BigDecimal BIT boolean BOOLEAN boolean TINYINT byte SMALLINT short INTEGER int BIGINT long REAL float FLOAT double DOUBLE double BINARY byte[] VARBINARY byte[] LONGVARBINARY byte[] DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp CLOB Clob BLOB Blob ARRAY Array DISTINCT mapping of underlying type STRUCT Struct REF Ref DATALINK java.net.URL[color=red][/color]
轉:http://blog.csdn.net/ilovejava_2010/article/details/8180521
高階結果對映
MyBatis的建立基於這樣一個思想:資料庫並不是您想怎樣就怎樣的。雖然我們希望所有的資料庫遵守第三正規化或BCNF(修正的第三正規化),但它們不是。如果有一個數據庫能夠完美對映到所有應用程式,也將是非常棒的,但也沒有。結果集對映就是MyBatis為解決這些問題而提供的解決方案。例如,我們如何對映下面這條語句?
- <select id="selectBlogDetails" parameterType="int" resultMap="detailedBlogResultMap">
- select
- B.id as blog_id,
- B.title as blog_title,
- B.author_id as blog_author_id,
- A.id as author_id,
- A.username as author_username,
- A.passwordas author_password,
- A.email as author_email,
- A.bio as author_bio,
- A.favourite_section as author_favourite_section,
- P.id as post_id,
- P.blog_id as post_blog_id,
- P.author_id as post_author_id,
- P.created_on as post_created_on,
- P.sectionas post_section,
- P.subject as post_subject,
- P.draft as draft,
- P.body as post_body,
- C.id as comment_id,
- C.post_id as comment_post_id,
- C.nameas comment_name,
- C.comment as comment_text,
- T.id as tag_id,
- T.nameas tag_name
- from Blog B
- leftouterjoin Author A on B.author_id = A.id
- leftouterjoin Post P on B.id = P.blog_id
- leftouterjoin Comment C on P.id = C.post_id
- leftouterjoin Post_Tag PT on PT.post_id = P.id
- leftouterjoin Tag T on PT.tag_id = T.id
- where B.id = #{id}
- </select>
您可能想要把它對映到一個智慧的物件模型,包括由一個作者寫的一個部落格,有許多文章(Post,帖子),每個文章由0個或者多個評論和標籤。下面是一個複雜ResultMap 的完整例子(假定作者、部落格、文章、評論和標籤都是別名)。仔細看看這個例子,但是不用太擔心,我們會一步步地來分析,一眼看上去可能讓人沮喪,但是實際上非常簡單的
- <resultMapid="detailedBlogResultMap"type="Blog">
- <constructor>
- <idArgcolumn="blog_id"javaType="int"/>
- </constructor>
- <resultproperty="title"column="blog_title"/>
- <associationproperty="author"column="blog_author_id"javaType=" Author">
- <idproperty="id"column="author_id"/>
- <resultproperty="username"column="author_username"/>
- <resultproperty="password"column="author_password"/>
- <resultproperty="email"column="author_email"/>
- <resultproperty="bio"column="author_bio"/>
- <resultproperty="favouriteSection"column="author_favourite_section"/>
- </association>
- <collectionproperty="posts"ofType="Post">
- <idproperty="id"column="post_id"/>
- <resultproperty="subject"column="post_subject"/>
- <associationproperty="author"column="post_author_id"javaType="Author"/>
- <collectionproperty="comments"column="post_id"ofType=" Comment">
- <idproperty="id"column="comment_id"/>
- </collection>
- <collectionproperty="tags"column="post_id"ofType=" Tag">
- <idproperty="id"column="tag_id"/>
- </collection>
- <discriminatorjavaType="int"column="draft">
- <casevalue="1"resultType="DraftPost"/>
- </discriminator>
- </collection>
- </resultMap>
這個resultMap 的元素的子元素比較多,討論起來比較寬泛。下面我們從概念上概覽一下這個resultMap的元素。
resultMap
·constructor–例項化的時候通過構造器將結果集註入到類中
oidArg– ID 引數; 將結果集標記為ID,以方便全域性呼叫
oarg–注入構造器的結果集
·id–結果集ID,將結果集標記為ID,以方便全域性呼叫
·result–注入一個欄位或者javabean屬性的結果
·association–複雜型別聯合;許多查詢結果合成這個型別
o巢狀結果對映– associations能引用自身,或者從其它地方引用
·collection–複雜型別集合
o巢狀結果對映– collections能引用自身,或者從其它地方引用
·discriminator–使用一個結果值以決定使用哪個resultMap
ocase–基於不同值的結果對映
§巢狀結果對映–case也能引用它自身, 所以也能包含這些同樣的元素。它也可以從外部引用resultMap
è最佳實踐:逐步地生成resultMap,單元測試對此非常有幫助。如果您嘗試一下子就生成像上面這樣巨大的resultMap,可能會出錯,並且工作起來非常吃力。從簡單地開始,再一步步地擴充套件,並且進行單元測試。使用框架開發有一個缺點,它們有時像是一個黑合。為了確保達到您所預想的行為,最好的方式就是進行單元測試。這對提交bugs 也非常有用。
下一節,我們一步步地檢視這些細節。
id, result元素
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
這是最基本的結果集對映。id 和result 將列對映到屬性或簡單的資料型別欄位(String, int, double, Date等)。
這兩者唯一不同的是,在比較物件例項時id 作為結果集的標識屬性。這有助於提高總體效能,特別是應用快取和巢狀結果對映的時候。
Id、result屬性如下:
Attribute |
Description |
property |
對映資料庫列的欄位或屬性。如果JavaBean 的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis 將搜尋給定名稱的欄位。兩種情況下您都可以使用逗點的屬性形式。比如,您可以對映到“username”,也可以對映到“address.street.number”。 |
column |
資料庫的列名或者列標籤別名。與傳遞給resultSet.getString(columnName)的引數名稱相同。 |
javaType |
完整java類名或別名(參考上面的內建別名列表)。如果對映到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果對映到一個HashMap,那您應該明確指定javaType 來確保所需行為。 |
jdbcType |
這張表下面支援的JDBC型別列表列出的JDBC型別。這個屬性只在insert,update或delete 的時候針對允許空的列有用。JDBC 需要這項,但MyBatis 不需要。如果您直接編寫JDBC程式碼,在允許為空值的情況下需要指定這個型別。 |
typeHandler |
我們已經在文件中討論過預設型別處理器。使用這個屬性可以重寫預設型別處理器。它的值可以是一個TypeHandler實現的完整類名,也可以是一個類型別名。 |
支援的JDBC型別
MyBatis支援如下的JDBC型別:
BIT |
FLOAT |
CHAR |
TIMESTAMP |
OTHER |
UNDEFINED |
TINYINT |
REAL |
VARCHAR |
BINARY |
BLOB |
NVARCHAR |
SMALLINT |
DOUBLE |
LONGVARCHAR |
VARBINARY |
CLOB |
NCHAR |
INTEGER |
NUMERIC |
DATE |
LONGVARBINARY |
BOOLEAN |
NCLOB |
BIGINT |
DECIMAL |
TIME |
NULL |
CURSOR |
Constructor元素
<constructor>
<idArg column="id" javaType="int"/>
<arg column=”username” javaType=”String”/>
</constructor>
當屬性與DTO,或者與您自己的域模型一起工作的時候,許多場合要用到不變類。通常,包含引用,或者查詢的資料很少或者資料不會改變的的表,適合對映到不變類中。構造器注入允許您在類例項化後給類設值,這不需要通過public方法。MyBatis同樣也支援private屬性和JavaBeans的私有屬性達到這一點,但是一些使用者可能更喜歡使用構造器注入。構造器元素可以做到這點。
考慮下面的構造器:
public class User {
//…
public User(int id, String username) {
//…
}
//…
}
為了將結果注入構造器,MyBatis需要使用它的引數型別來標記構造器。Java沒有辦法通過引數名稱來反射獲得。因此當建立constructor 元素,確保引數是按順序的並且指定了正確的型別。
<constructor>
<idArg column="id" javaType="int"/>
<arg column=”username” javaType=”String”/>
</constructor>
其它的屬性與規則與id、result元素的一樣。
Attribute |
Description |
column |
資料庫的列名或者列標籤別名。與傳遞給resultSet.getString(columnName)的引數名稱相同。 |
javaType |
完整java類名或別名(參考上面的內建別名列表)。如果對映到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果對映到一個HashMap,那您應該明確指定javaType 來確保所需行為。 |
jdbcType |
支援的JDBC型別列表中列出的JDBC型別。這個屬性只在insert,update 或delete 的時候針對允許空的列有用。JDBC 需要這項,但MyBatis 不需要。如果您直接編寫JDBC程式碼,在允許為空值的情況下需要指定這個型別。 |
typeHandler |
我們已經在文件中討論過預設型別處理器。使用這個屬性可以重寫預設型別處理器。它的值可以是一個TypeHandler實現的完整類名,也可以是一個類型別名。 |
Association元素
<association property="author" column="blog_author_id" javaType=" Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
</association>
Association元素處理“has-one”(一對一)這種型別關係。比如在我們的例子中,一個Blog有一個Author。聯合對映與其它的結果集對映工作方式差不多,指定property、column、javaType(通常MyBatis會自動識別)、jdbcType(如果需要)、typeHandler。
不同的地方是您需要告訴MyBatis 如何載入一個聯合查詢。MyBatis使用兩種方式來載入:
·Nested Select:通過執行另一個返回預期複雜型別的對映SQL語句(即引用外部定義好的SQL語句塊)。
·Nested Results:通過巢狀結果對映(nested result mappings)來處理聯接結果集(joined results)的重複子集。
首先,讓我們檢查一下元素屬性。正如您看到的,它不同於普通只有select和resultMap屬性的結果對映。
Attribute |
Description |
property |
對映資料庫列的欄位或屬性。如果JavaBean 的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis 將搜尋給定名稱的欄位。兩種情況下您都可以使用逗點的屬性形式。比如,您可以對映到”username”,也可以對映到更復雜點的”address.street.number”。 |
column |
資料庫的列名或者列標籤別名。與傳遞給resultSet.getString(columnName)的引數名稱相同。 注意: 在處理組合鍵時,您可以使用column= “{prop1=col1,prop2=col2}”這樣的語法,設定多個列名傳入到巢狀查詢語句。這就會把prop1和prop2設定到目標巢狀選擇語句的引數物件中。 |
javaType |
完整java類名或別名(參考上面的內建別名列表)。如果對映到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果對映到一個HashMap,那您應該明確指定javaType 來確保所需行為。 |
jdbcType |
相關推薦mybatis慣用jdbcType資料型別mybatis常用jdbcType資料型別 MyBatis 通過包含的jdbcType型別 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL VARCHAR BINARY BL mybatis常用jdbcType資料型別MyBatis 通過包含的jdbcType型別 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYINT REAL VARCHAR BINARY BLOB NVARCHARSMALLINT DOUBLE LONGVARCHAR VARBIN mybatis常用jdbcType資料型別 對應java型別MyBatis 通過包含的jdbcType型別 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYINT REAL VARCHAR BINARY BLOB NVARCHARSMALLINT DOUBLE LONGVARCHAR VARBIN (轉)mybatis常用jdbcType資料型別Mybatis中javaType和jdbcType對應和CRUD例子 <resultMap type="java.util.Map" id="resultjcm"> <result property="FLD_NUMBER" column="FLD mybatis常用jdbcType資料型別對應java型別MyBatis 通過包含的jdbcType型別 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYINT REAL VARCHAR BINARY BLOB NVARCHARSMALLINT DOUBLE LO mybatis當傳入資料型別為Int時並且值為0時,會判斷為空字串一般在mybatis中插入或者修改時,會將欄位做非null和非空判斷,如下所示:<if test="operatype_enum != null and operatype_enum != ''">operatype_enum =#{operatype_enum} MyBatis JdbcType 與Oracle、MySql資料型別對應關係詳解1. Mybatis JdbcType與Oracle、MySql資料型別對應列表 Mybatis JdbcType Oracle MySql JdbcType ARRAY JdbcType B mybatis增加/更新日期型別資料時String到date的轉化實體裡面是String,但是表裡是date,臨時轉化 <update id="updateInventory" parameterType="com.docc.model.Inventory"> update BUS_INVENTORY set orgcode mybatis的jdbcType和javaType、oracle,MySQL的對應型別Mybatis中jdbcType和javaType的對應關係 1 JDBC Type Java Type 2 CHAR String 3 VARCHAR String 4 LONG Mybatis之Oracle增刪查改示例(含Date、Clob資料型別操作)oracle表結構 create table T_USERS ( ID NUMBER not null, NAME VARCHAR2(30), SEX VARCHAR2(3), BIRS DATE, MESSAGE CLOB MyBatis Generator(MBG)Oracle使用說明 公共同義詞 LONG資料型別Oracle使用說明公共同義詞 Public Synonyms如果要為具有公共同義詞的表生成物件,則應該實際上根據真實表生成物件,然後在執行時更改表名稱。MyBatis Generator自動支援。例如,假設有一個公共別名“FRED”指向“HR.EMPLOYEES”表。下表配 myBatis表單Date資料型別轉換異常再現 : 提交資料後異常 : 如果是新手,這種異常是最煩的了,什麼錯誤資訊都沒有,改個腿子...........但是老江湖就不一樣了,一瞄到400就知道是資料型別轉換異常,就能準確到異常大概位置了,,,,,, 話不多說, 這和異常有倆種解決方案 1. 使用註 (jdbcType)mybatis 查詢Oracle Date型別欄位只精確到年月日用mybatis generator生成程式碼後,執行查詢語句時,oracle裡的Date型別欄位只精確到年月日,後面時分秒都為零。 後來發現是jdbcType問題,改成 jdbcType="TIMESTAMP" 就可以。(原先預設生成時是jdbcType="DATE") mybatis如何操作text型別(mysql)資料呢?Mybatis在預處理語句中設定一個引數,或者從結果集中獲取一個值時,會使用型別處理器typeHandler將獲取的值以合適的方式轉換成Java型別。資料庫中的基本型別之所以能被轉化成JAVA型別,是因為Mybatis已經內建了這些型別的處理器, 另外。Myba mybatis中傳入基本型別引數,傳入多個基本資料型別mybatis3.2.6+spring4.0.2 關於傳入基本引數型別 以及多個基本型別引數的問題最近再練習框架,找到了一點心得分享出來,不對之處歡迎提出共勉1 引數型別string 一個引數方法:User getUserByName(String username);map mybatis 插入oracle xmltype型別的資料內容超過4000報錯資料庫表: create table BOOK ( book_id NUMBER not null, book_name XMLTYPE, book_price NUMBER ) JavaBean: public class Book { pr c理解提高(1)資料型別的本質分析資料型別本質分析 資料型別概念 “型別”是對資料的抽象 型別相同的資料有相同的表示形式、儲存格式以及相關的操作 程式中使用的所有資料都必定屬於某一種資料型別 資料型別的本質思考 思考資料型別和 Java中8種基本資料型別及其預設值Java語言中有8種基本資料型別,基本情況彙總如下: Java中8種基本資料型別總結 序號 資料型別 大小/位 封裝類 預設值 可表示資料 JAVA面試知識點總結--資料型別一、資料型別 基本資料型別 數值型別: 運算and型別轉換 自動裝拆箱and比較 bool redis安裝及其資料型別簡介Windows下安裝 redis的安裝十分簡單,首先從github上下載安裝包,地址:下載地址 下載完成後解壓到c盤,為了方便操作可以將解壓後的檔案重新命名為“redis”,然後開啟一個cmd 視窗使用cd命令切換目錄到 C:\redis 之後輸入redis-server.ex |