簡單地梳理下MyBatis相關的知識點,主要想讓自己重新撿起以前學的框架,如果能給廣大程序猿朋友有所幫助那就更好了。有疏漏的地方也歡迎大家評論指出。閑言少敘,進入正題。。。。。。。
MyBatis知識梳理
簡介(百度,隨便看看)
- MyBatis最早源自Apache基金會的一個開源項目iBatis,2010年這個項目有Apache software foundation遷移到了google code,並且改名為MyBatis。
- MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。
- MyBatis封裝了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。
- MyBatis使用簡單地XML或注解做配置和定義映射關系,將Java的POJOs(Plain Old Java Objects)映射成數據庫中的記錄。
MyBatis體系結構中的幾個關鍵部分
- 加載配置 —— 可以是XML配置文件方式,也可以是Java代碼的注釋。MyBatis將SQL的配置信息加載成為一個個的MappedStatement對象(包括了傳入參數映射配置,執行的SQL語句、結果映射配置) ,並將其存儲在內存中
- SQL解析 —— 當API接口層接收到調用請求時,會收到傳入SQL的ID和傳入對象(Map、JavaBean或者基本數據類型),MyBatis會根據SQL的ID找到對應的MappedStatement,然后根據傳入參數對象對MappedStatement進行解析,解析后可以得到最終要執行的SQL語句和參數。
- SQL執行 —— 將得到的SQL和參數拿到數據庫進行執行,得到操作數據庫的結果。
- 結果映射 —— 將結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數據類型,並將最終結果返回。
MyBatis的配置文件
- SqlMapConfig.xml(1個):主配置文件,用於指定數據庫連接參數和框架參數
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 7 <configuration> 8 <!-- 全局別名,之后映射文件引用可以使用PersonEntity代替com.maven.mybatis.entity.PersonEntity--> 9 <typeAliases> 10 <typeAlias type="com.maven.mybatis.entity.PersonEntity" alias="PersonEntity"/> 11 </typeAliases> 12 13 <environments default="development"> 14 <environment id="development"> 15 <transactionManager type="JDBC"/> 16 <dataSource type="POOLED"> 17 <property name="driver" value="com.mysql.jdbc.Driver"/> 18 <property name="url" value="jdbc:mysql://localhost:3306/test"/> 19 <property name="username" value="root"/> 20 <property name="password" value=""/> 21 </dataSource> 22 </environment> 23 </environments> 24 <!-- 指定映射定義文件 --> 25 <mappers> 26 <mapper resource="com/maven/mybatis/mapper/PersonEntityMapper.xml"/> 27 </mappers> 28 29 </configuration>
- SqlMap.xml(n個):映射定義文件,用於定義SQL語句和映射信息
!!注:namespace有重要作用,不要重復,調用此文件定義增刪改查操作是需要指定namespace;
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <mapper namespace="com.maven.mybatis.mapper.PersonEntityMapper"> 7 <select id="queryAll" resultType="PersonEntity"> 8 select * from t_person 9 </select> 10 11 <insert id="insert" parameterType="PersonEntity"> 12 insert into t_person(id, name) values(#{id}, #{name}) 13 </insert> 14 15 </mapper>
MyBatis框架主要API簡介
- SqlSessionFactoryBuilder:該對象負責根據MyBatis配置文件SqlMapConfig.xml構建SqlSessionFactory實例
- SqlSessionFactory:每一個MyBatis的應用程序都以一個SqlSessionFactory對象為核心。該對象負責創建SqlSession對象實例。
- SqlSession:該對象包含了所有執行SQL操作的方法,用於執行已映射的SQL語句。
MyBatis基本應用
- 搭建MyBatis技術環境
- 為工程添加MyBatis開發包和數據庫驅動包
-
- 在src下添加MyBatis配置文件SqlMapConfig.xml
- 修改SqlMapConfig.xml,指定數據庫連接參數
- 利用MyBatis API編程,獲取SqlSession實例
- 獲取SqlSession對象
String conf = "SqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(resource); //創建SqlSessionFactoryBuilder對象 SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); //通過SessionFactoryBuilder對象獲取SqlSessionFactory SqlSessionFactory sf = sfb.build(in); //創建Session SqlSession session = sf.openSession();
- 實現CRUD操作
- 添加操作
SqlMap.xml定義<!--parameterType因為前面定義過Alias所以不需要寫包名,否則要寫全包名加類名--> <insert id="insert" parameterType="PersonEntity"> insert into t_person(id, name) values(#{id}, #{name}) </insert>
id屬性:用於表示映射文件的sql,可以理解為MappedStatement的id
#{}:標識一個占位符
parameterType:指定輸入參數的類型
#{name}:其中name表示輸入的參數,參數名為name;如果輸入參數為簡單類型,#{}中參數可以任意。
Java代碼//NAMESPACE為SqlMapper.xml文件根標簽的namespace屬性 SqlSession session = sf.openSession();
//第一個參數:指映射文件的id值:namespace.id
//第二個參數:指映射文件中匹配parameterType類型的實參 session.insert(NAMESPACE + ".insert", person); session.commit(); session.close(); - 添加后返回主鍵
- mysql自增主鍵返回,mysql每次在調用完一個INSERT語句時會自動生成一個自增主鍵,可以通過函數LAST_INSERT_ID()獲取到插入記錄的自增主鍵。
<insert id="insert" parameterType="PersonEntity"> <!--查詢后將自增主鍵返回到實體對象-->
<selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO t_person(name) VALUES(#{name}) </insert>keyProperty屬性:配置返回user對象的屬性名
order屬性:配置相對於insert語句執行前或執行后
resultType:指定結果類型 - 非自增主鍵返回,使用UUID()函數。在INSERT語句之前執行UUID函數,再將結果插入到INSERT語句中作為主鍵(主鍵必須是字符串類型,長度至少是35位)
<insert id="insert" parameterType="PersonEntity"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT REPLACE(UUID(),'-','') </selectKey> INSERT INTO t_person(id, name) VALUES(#{id},#{name}) </insert>
- Oracle中自增主鍵返回
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT 序列名.nextVal() </selectKey>
- mysql自增主鍵返回,mysql每次在調用完一個INSERT語句時會自動生成一個自增主鍵,可以通過函數LAST_INSERT_ID()獲取到插入記錄的自增主鍵。
- 更新操作
SqlMap.xml定義
<update id="update" parameterType="PersonEntity"> update t_person set name=#{name} where id=#{id} </update >
Java代碼
SqlSession session = sf.openSession(); session.update(NAMESPACE + ".update", person); session.commit(); session.close();
-
刪除操作
SqlMap.xml定義
<delete id="delete" parameterType="int"> delete from t_person where id=#{id} </select>
Java代碼
SqlSession session = sf.openSession(); session.delete(NAMESPACE + ".delete", 100); session.commit(); session.close();
- 查詢操作
SqlMap.xml定義
<!--查詢單行記錄--> <select id="queryById" parameterType="int" resultType="PersonEntity"> select * from t_person </select> <!--查詢多行記錄--> <select id="queryAll" resultType="PersonEntity"> select * from t_person </select> <!--查詢返回Map類型查詢結果--> <select id="queryPerson" parameterType="int" resultType="java.util.HashMap"> select id, name from t_person where id=#{id} </select>
${}:表示拼接sql字符串,如select * from t_person where name like '%${value}%'
${value}:接受輸入參數的內容;如果傳入的類型是簡單類型,只能使用value
Java代碼
SqlSession session = sf.openSession(); /* //查詢單行記錄 PersonEntity person = (PersonEntity)session.selectOne(NAMESPACE + ".queryById", 100); //返回Map查詢結果 Map map = (Map)session.selectOne("queryPerson", 100); */ //查詢多行記錄 List<PersonEntity> personList = session.selectList(NAMESPACE + ".queryAll"); session.commit(); session.close();
- 添加操作
- MyBatis實現分頁查詢 —— 在使用SqlSession的selectList()方法時,指定一個RowBounds分頁器參數,即可查詢指定范圍的記錄。提示:MyBatis分頁是基於內存分頁,原理是查詢出所有記錄,然后基於jdbc的absolute()和next()方法定位獲取部分記錄,因此在遇到大量數據情況下,不推薦使用MyBatis自帶分頁功能。需要開發者指定分頁查詢的SQL語句或對MyBatis進行擴展使用。
- RowBounds(offset, limit)
- offset指定抓取記錄的起始行,從0開始
- limit指定抓取記錄的數量 - 使用方法:sqlSession.selectList(SQL的ID, 參數, RowBounds對象);
- RowBounds(offset, limit)
- Mapper映射器:是開發者創造綁定映射語句的接口,映射器接口的實例可以從SqlSession中獲得。
SqlSession session = sqlSessionFactory.openSession(); PersonMapper mapper = session.getMapper(PersonEntity.class); session.close();
PersonMapper接口定義:
public interface PersonMapper{ public List<PersonEntity> queryAll(); public PersonEntity queryById(int id); public void insert(Person person); public void update(Person person); public void delete(int id); //!提示:Mapper接口中的方法名要和SqlMap.xml中的SQL的id保持一致 }
遵循如下規范,MyBatis會自動給我們創建實現該接口的代理對象
- 在mapper.xml的namespace屬性值必須是mapper接口的全路徑
- mapper接口中的方法名必須和mapper.xml文件中的id值相同
- mapper接口中的輸入參數類型必須和mapper.xml中statement中的parameterType類型相同
- mapper接口中的方法的返回值類型和mapper.xml中statement中的resultType的類型相同 - ResultMap映射定義
在SqlMap.xml定義<select>操作時,如果查詢結果字段名和Java POJO屬於不一致時,需要使用<resultMap>元素顯示指定映射關系,例如
<select id="queryAll1" resultMap="personMap"> select id, name from t_person </select> <resultMap id="personMap" type="PersonEntity"> <result property="no" column="id" /> <result property="username" column="name" /> </resultMap>
- SqlMapConfig.xml核心配置文件介紹
- properties屬性
- 這個屬性標簽可以用來引用外部的properties的文件
- MyBatis會按一定順序來加載屬性:1)優先讀取properties標簽體內定義的屬性。2)然后讀取properties標簽中的resource或url屬性,並且會覆蓋已讀取的同名屬性。3)最后讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
<!-- 引用外部propertes文件替代硬編碼的jdbc配置 --> <properties resource="db.properties"></properties> <!-- 因為將來要和spring進行整合,這部分用不上了 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc的事務,由mybatis管理 --> <transactionManager type="JDBC"/> <!-- 數據庫連接池配置,由mybatis管理 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>
- settings(全局配置參數):在myBatis框架在運行時可以調整一些運行參數
- properties屬性
設置參數 |
描述 |
有效值 |
默認值 |
cacheEnabled |
該配置影響的所有映射器中配置的緩存的全局開關。 |
true | false |
true |
lazyLoadingEnabled |
延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。 |
true | false |
false |
aggressiveLazyLoading |
當啟用時,對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將會按需加載。 |
true | false |
true |
multipleResultSetsEnabled |
是否允許單一語句返回多結果集(需要兼容驅動)。 |
true | false |
true |
useColumnLabel |
使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。 |
true | false |
true |
useGeneratedKeys |
允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。 |
true | false |
False |
autoMappingBehavior |
指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。 |
NONE, PARTIAL, FULL |
PARTIAL |
autoMappingUnknownColumnBehavior |
Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target. NONE: Do nothing WARNING: Output warning log (The log level of 'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' must be set to WARN) FAILING: Fail mapping (Throw SqlSessionException) |
NONE, WARNING, FAILING |
NONE |
defaultExecutorType |
配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。 |
SIMPLE REUSE BATCH |
SIMPLE |
defaultStatementTimeout |
設置超時時間,它決定驅動等待數據庫響應的秒數。 |
Any positive integer |
Not Set (null) |
defaultFetchSize |
Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. |
Any positive integer |
Not Set (null) |
safeRowBoundsEnabled |
允許在嵌套語句中使用分頁(RowBounds)。 If allow, set the false. |
true | false |
False |
safeResultHandlerEnabled |
允許在嵌套語句中使用分頁(ResultHandler)。 If allow, set the false. |
true | false |
True |
mapUnderscoreToCamelCase |
是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 |
true | false |
False |
localCacheScope |
MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 |
SESSION | STATEMENT |
SESSION |
jdbcTypeForNull |
當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 |
JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER |
OTHER |
lazyLoadTriggerMethods |
指定哪個對象的方法觸發一次延遲加載。 |
A method name list separated by commas |
equals,clone,hashCode,toString |
defaultScriptingLanguage |
指定動態 SQL 生成的默認語言。 |
A type alias or fully qualified class name. |
org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls |
指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。 |
true | false |
false |
logPrefix |
指定 MyBatis 增加到日志名稱的前綴。 |
Any String |
Not set |
logImpl |
指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 |
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
Not set |
proxyFactory |
指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。 |
CGLIB | JAVASSIST |
JAVASSIST (MyBatis 3.3 or above) |
vfsImpl |
Specifies VFS implementations |
Fully qualified class names of custom VFS implementation separated by commas. |
Not set |
useActualParamName |
Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) |
|
-
- typeAliases(類型別名)
- 在映射文件中,會定義很多的statement,需要parameterType指定大量的類型,這些類型的全路徑太長,這個時候為了開發方便,可以為這些類型取一個別名(單個修改)
<!-- 指定類的別名 --> <typeAliases> <typeAlias alias="User" type="cn.konrad.mapper.User"/> </typeAliases> ------------------------------------------------------------------- <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM t_user WHERE id=#{id} </select>
- 批量修改(給一個包取名,定義之后,映射文件中大小寫均可,它會自動地到該包下找類)
<!-- 指定包的別名 --> <typeAliases> <package name="cn.konrad.mapper"/> </typeAliases> ---------------------------------------------------- <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM t_user WHERE uid=#{uid} </select>
- 對於普通的 Java 類型,有許多內建的類型別名。它們都是大小寫不敏感的,由於重載 的名字,要注意原生類型的特殊處理。
別名
映射的類型
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
decimal
BigDecimal
bigdecimal
BigDecimal
object
Object
map
Map
hashmap
HashMap
list
List
arraylist
ArrayList
collection
Collection
iterator
Iterator
- typeAliases(類型別名)
-
- typeHandler(類型處理器):在mybatis通過類型處理器來完成jdbc類型對Java類型的裝換
類型處理器 |
Java 類型 |
JDBC 類型 |
BooleanTypeHandler |
java.lang.Boolean, boolean |
數據庫兼容的 BOOLEAN |
ByteTypeHandler |
java.lang.Byte, byte |
數據庫兼容的 NUMERIC 或 BYTE |
ShortTypeHandler |
java.lang.Short, short |
數據庫兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler |
java.lang.Integer, int |
數據庫兼容的 NUMERIC 或 INTEGER |
LongTypeHandler |
java.lang.Long, long |
數據庫兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler |
java.lang.Float, float |
數據庫兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler |
java.lang.Double, double |
數據庫兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler |
java.math.BigDecimal |
數據庫兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler |
java.lang.String |
CHAR, VARCHAR |
ClobReaderTypeHandler |
java.io.Reader |
- |
ClobTypeHandler |
java.lang.String |
CLOB, LONGVARCHAR |
NStringTypeHandler |
java.lang.String |
NVARCHAR, NCHAR |
NClobTypeHandler |
java.lang.String |
NCLOB |
BlobInputStreamTypeHandler |
java.io.InputStream |
- |
ByteArrayTypeHandler |
byte[] |
數據庫兼容的字節流類型 |
BlobTypeHandler |
byte[] |
BLOB, LONGVARBINARY |
DateTypeHandler |
java.util.Date |
TIMESTAMP |
DateOnlyTypeHandler |
java.util.Date |
DATE |
TimeOnlyTypeHandler |
java.util.Date |
TIME |
SqlTimestampTypeHandler |
java.sql.Timestamp |
TIMESTAMP |
SqlDateTypeHandler |
java.sql.Date |
DATE |
SqlTimeTypeHandler |
java.sql.Time |
TIME |
ObjectTypeHandler |
Any |
OTHER 或未指定類型 |
EnumTypeHandler |
Enumeration Type |
VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引) |
EnumOrdinalTypeHandler |
Enumeration Type |
任何兼容的 NUMERIC 或 DOUBLE 類型,存儲枚舉的索引(而不是名稱)。 |
-
- objectFactory(對象工廠)
- plugins(插件)
- environments(環境集合屬性對象)
- environment(環境子屬性對象)
- transactionManager(事務管理器)
- dataSource(數據源)
- mappers(映射器)
- <mapper resource="" /> 相對於類路徑,如<mapper resource="cn/konrad/mybatis/UserMapper.xml"/>
- <mapper url="" /> 使用絕對路徑(完全限定路徑),如 <mapper url="file:///
D:\workSpace\mybatis\bin\cn\konrad\mapper\UserMapper.xml"/>
- <mapper class="" /> 使用mapper接口路徑,此方法要求mapper接口與映射文件名稱相同且存放在完全相同的目錄下,如 <mapper class="cn.konrad.mapper.UserMapper"/>
- MyBatis動態SQL:對SQL進行判斷、拼接、組裝
- if判斷
<!-- if判斷 --> <select id="findUsersByCriteria" parameterType="User" resultType="User"> SELECT * FROM t_user <!-- 這個where標簽會自動的刪除第一個AND --> <where> <if test="name!=null and name!=''"> AND name like '%${name}%' </if> <if test="age!=null and age!=''"> AND age=#{age} </if> </where> </select>
- Sql片段:當我們通過條件查詢用戶所有信息,和通過條件查詢所有用戶的數量
<!-- 定義sql片段 id屬性:表示sql片段的唯一標識 一定要基於單標操作定義sql片段,這樣這個sql片段的可重用性才高 在sql片段中不要包括where條件 --> <sql id="query_user_where"> <if test="name!=null and name!=''"> AND name like '%${name}%' </if> <if test="age!=null and age!=''"> AND age=#{age} </if> </sql> <!--引用sql片段--> <where> <!-- refid用來引用sql片段的id值,如果該sql片段不在本配置文件中需要加namespace的值 --> <include refid="query_user_where"></include> </where>
- foreach:向sql傳遞數組或list時,用foreach構建SQL
<delete id="deleteBatch"> delete from user where id in <foreach collection="array" item="id" index="index" open="(" close=")" separator=","> #{id} </foreach> </delete>
- collection :collection屬性的值有三個分別是list、array、map三種,分別對應的參數類型為:List、數組、map集合,我在上面傳的參數為數組,所以值為array
- item:表示在迭代過程中每次迭代到的位置(下標)- index:
- open:前綴
- close:后綴
- separator:分隔符,表示迭代時每個元素之間以什么分隔
- if判斷
- 一對一映射
- resultType實現較為簡單,對於多表映射中只要增加其他勒種屬性即可完成映射。 但是會新增一個子類,如果對查詢結果沒有要求可以用它。
- resultMap實現較為復雜,需要自定義resultMap。但
是不需要新增子類,用我們傳統的對象模型即可完成映射,並且支持延遲加載的功能,而resultType不支持。
<resultMap type="cn.chinasofti.entity.Orders" id="resultMapOrder"> <!-- 配置Order主類信息 --> <id column="id" property="id"/> <result column="note" property="note"/> <result column="createdate" property="createdate"/> <association property="user" javaType="User"> <id column="uid" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <result column="birthday" property="birthday"/> </association> </resultMap> <select id="findOrderUserWithResultMap" resultMap="resultMapOrder"> SELECT 語句 </select>
- association屬性:配置關聯的表
- javaType屬性:代表映射表中的實體對象的真實類型
- 一對多映射
<resultMap type="User" id="resultMapUser"> <!-- 配置User信息 --> <id column="_uid" property="id"/> <result column="username" property="username"/> <result column="birthday" property="birthday"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!-- 配置Orders集合信息 --> <collection property="orders" ofType="Orders"> <id column="_oid" property="id"/> <result column="createdate" property="createdate"/> <result column="note" property="note"/> </collection> </resultMap> <select id="findUserOrders" resultMap="resultMapUser"> SELECT 語句 </select>
- ofType屬性:申明的是集合中元素的類型
!注意:當兩個表的主鍵列名相同時,在配置的時候一定要為其配置一個別名,否者該類查詢出的集合中只有一條數據 - 多對多映射(與一對多類似,在映射的兩個映射文件中添加collection集合配置)
- 延遲加載:默認是沒有開啟延遲加載的,需要在核心配置文件中配置
<!-- 開啟延遲加載 --> <settings> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="false"></setting> </settings>
- 一級緩存:默認開啟,是基於SqlSession范圍的緩存
- 二級緩存:默認不支持二級緩存,是基於Mapper范圍的緩存
暫時就先寫到這,后續有補充的繼續修正。歡迎各位猴子(猿)們指正補充!