MyBatis主要涉及兩個核心對象:SqlSessionFactory和SqlSession
1.MyBatis核心對象
-
SqlSessionFactory
SqlSessionFactory它是單個資料庫映射關系經過編譯後的記憶體鏡像,其主要作用是建立SqlSession.
通過xml建構出SqlSessionFactory執行個體的代碼如下:
//讀取配置檔案
InputStream inputstream=Resources.getResourcesAsStream("配置檔案位置");
//根據配置檔案建構SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputstream);
SqlSessionFactory對象是線程安全的,它一旦被建立,在整個應用執行期間都會存在.
-
SqlSession
SqlSession是應用程式與持久層之間執行互動操作的一個單線程對象,其主要作用是執行持久化操作.
SqlSession對象包含了資料庫中所有執行SQL操作的方法,由于其底層封裝了JDBC連接配接,是以可以直接使用其執行個體來執行已映射的SQL語句.每一個線程都應該有一個自己的SqlSession執行個體,并且該執行個體是不能被共享的.同時,SqlSession執行個體也是線程不安全的,是以其使用範圍最好在一次請求或一個方法中,決不能将其放在一個類的靜态字段、執行個體字段或任何類型的管轄範圍(如Servlet的HttpSession)中使用.使用完SqlSession對象之後,要及時的關閉它,通常可以将其放在finally塊中關閉
SqlSession sqlSession =SqlSessionFactory.openSession();
try{
//此處執行持久化操作
}finally{
sqlSession.close();
}
方法名 | 描述 |
<T>T selectOne(String statement); | 查詢方法.參數statement是在配置檔案中定義的<select>元素的id.使用該方法後會傳回執行SQL語句查詢結果的一條泛型對象 |
<T>T selectOne(String statement,Object parameter); | 查詢方法.參數statement是在配置檔案中定義的<select>元素的id.parameter是查詢所需要的參數.使用該方法後會傳回執行SQL語句查詢結果的一條泛型對象 |
<E> List<E> selectList(String statement); | 查詢方法.參數statement是在配置檔案中定義的<select>元素的id.使用該方法後會傳回執行SQL語句查詢結果的泛型對象的集合 |
<E> List<E> selectList(String statement,Object parameter); | 查詢方法.參數statement是在配置檔案中定義的<select>元素的id.parameter是查詢所需要的參數.使用該方法後會傳回執行SQL語句查詢結果的泛型對象的集合 |
<E> List<E> selectList(String statement,Object parameter,RowBounds rowBounds); | 查詢方法.參數statement是在配置檔案中定義的<select>元素的id.parameter是查詢所需要的參數.rowBounds是用于分頁的參數對象,使用該方法後會傳回執行SQL語句查詢結果的泛型對象的集合 |
void select(String statement,Object parameter,ResultHandler handler); | 查詢方法.參數statement是在配置檔案中定義的<select>元素的id.parameter是查詢所需要的參數.ResultHandler 對象用于處理查詢傳回的複雜結果集,用于多表查詢 |
int insert(String statement); | 插入方法,參數statement是在配置檔案中定義的<insert>元素的id,使用該方法後會傳回執行SQL語句所影響的行數 |
int insert(String statement,Object parameter); | 插入方法,參數statement是在配置檔案中定義的<insert>元素的id,parameter是插入所需的參數,使用該方法後會傳回執行SQL語句所影響的行數 |
int update(String statement); | 更新方法 ,參數statement是在配置檔案中定義的<update>元素的id,使用該方法後會傳回執行SQL語句所影響的行數 |
int update(String statement,Object parameter); | 更新方法 ,參數statement是在配置檔案中定義的<update>元素的id,parameter是更新所需的參數,使用該方法後會傳回執行SQL語句所影響的行數 |
int delete(String statement,); | 删除方法,參數statement是在配置檔案中定義的<delete>元素的id,使用該方法後會傳回執行SQL語句所影響的行數 |
int delete(String statement,Object parameter); | 删除方法,參數statement是在配置檔案中定義的<delete>元素的id,parameter是删除所需的參數,使用該方法後會傳回執行SQL語句所影響的行數 |
void commit(); | 送出事務的方法 |
void rollback(); | 復原事務的方法 |
void close(); | 關閉SqlSession對象 |
<T> T getMapper(Class<T> type) | 該方法會傳回Mapper接口的代理對象,該對象關聯了SqlSession對象,開發人員可以使用該對象直接調用方法操作資料庫.參數Type是Mapper 的接口類型 |
Connection getConnection(); | 擷取JDBC資料庫連接配接對象的方法 |
2.MyBatis的主要配置檔案
2.1主要元素

注意:<configuration>的子元素必須按照圖中由上到下的順序進行配置,否則解析配置檔案時會報錯
2.2 <properties>元素
<properties>是一個配置屬性的元素,該元素通常用于将内部的配置外在化,即通過外部的配置來動态地替換内部定義的屬性
(1)建立db.properties的配置檔案
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
(2)mybatis-config.xml中配置<properties>
<properties resource="db.properties"/>
(3)修改配置檔案中的連接配接資訊,具體如下:
<dataSource type="POOLED">
<!--資料庫驅動-->
<property name="driver" value="${jdbc.driver}"/>
<!--連接配接資料庫的url-->
<property name="url" value="${jdbc.url}"/>
<!--連接配接資料庫的使用者名-->
<property name="username" value="${jdbc.username}"/>
<!--連接配接資料庫的密碼-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
2.3 <settings>元素
<settings>用于修改MyBatis運作時的行為,例如開啟二級緩存、開啟延時加載等
設定參數 | 描述 | 有效值 | 預設值 |
cacheEnabled | 該配置影響所有映射器中配置的緩存全局開關 | true|false | false |
lazyLoadingEnabled | 延遲加載的全局開關.開啟時,所有關聯對象都會延遲加載.特定關聯關系中可以通過設定fetchType屬性來覆寫該項的開關狀态 | true|false | false |
aggressivelazyLoading | 關聯對象屬性的延遲加載開關.當啟用時,對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性都會按需加載 | true|false | true |
multipleResultSetsEnabled | 是否允許單一語句傳回多結果集 | true|false | true |
useColumnLabel | 使用列标簽代替列名 | true|false | true |
useGeneratedKeys | 允許JDBC支援自動生成主鍵 | true|false | false |
autoMappingBehavior | 指定MyBatis應如何自動映射列到字段或屬性.NONE表示取消自動映射;PARTIAL隻會自動映射沒有定義嵌套結果集映射的結果集;FULL會自動映射任意複雜的結果集(無論是否嵌套) | NONE|PARTIAL|FULL | PARTIAL |
defaultExecutorType | 配置預設的執行器.SIMPLE就是普通的執行器;REUSE執行器會重用預處理語句(prepared statements);BATCH執行器将重用語句并執行批量更新 | SIMPLE|REUSE|BATCH | SIMPLE |
defaultStatementTimeout | 設定逾時時間,它決定驅動等待資料庫相應的秒數.當沒有設定的時候,它取得就是驅動預設的時間 | 任何正整數 | 沒有設定 |
mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規則(camelcase)映射 | true|false | false |
jdbcTypeForNull | 當沒有為參數提供特定的JDBC類型時,為空值指定JDBC類型. | NULL|VARCHAR|OTHER | OTHER |
2.4 <typeAliases>元素
<typeAliases>元素用于為配置檔案中的Java類型設定别名,别名的設定與XML配置相關,其使用的意義在于減少全限定類名的備援
當POJO類過多時,通過自動掃描包的形式自定義别名,示例如下:
<!--使用自動掃描包來定義别名-->
<typeAliases>
<package name="com.itcast.pojo">
</typeAliases>
需要注意的是,上述方式的别名隻适用于沒有使用注解的情況.如果在程式中使用了注解,則别名為其注解的值,具體如下:
@Alias(value="user")
public class User{
//User的屬性和方法
...
}
别名 | 映射的類型 |
_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 |
2.5 <typeHandler>元素
typeHandler的作用是将預處理語句中傳入的參數從javaType(Java類型)轉換為jdbcType(JDBC類型),或者從資料庫取出結果時将jdbcType轉換為javaType.
類型處理器 | Java類型 | JDBC類型 |
<typeHandler>元素就是用于在配置檔案中注冊自定義的類型處理器,它的使用方式有兩種,如下
- 注冊一個類的類型處理器
<typeHandlers>
<!--以單個類的形式配置-->
<typeHandler handler="com.itcast.type.CustomtypeHandler"/>
</typeHandlers>
- 注冊一個包中所有的類型處理器
<typeHandlers>
<!--注冊一個包中所有的typehandler,系統在啟動時會自動掃描包下的所有檔案-->
<package name="com.itcast.type"/>
</typeHandlers>
2.6 <objectFactory>元素
<objectFactory>的作用就是執行個體化目标類,既可以通過預設的構造方法執行個體化,也可以在參數映射存在的時候通過參數構造方法來執行個體化.
2.7 <plugins>元素
<plugins>元素的作用就是配置使用者所開發的插件
2.8 <environments>元素
<environments>元素用于對環境進行配置.MyBatis的環境就是資料源的配置,即配置多種資料庫.
<enviroments default="development">
<enviroment id="development">
<!--使用JDBC事務管理-->
<transactionManager type="JDBC">
<!--配置資料源-->
<dataSource type="POOLED">
<!--資料庫驅動-->
<property name="driver" value="${jdbc.driver}"/>
<!--連接配接資料庫的url-->
<property name="url" value="${jdbc.url}"/>
<!--連接配接資料庫的使用者名-->
<property name="username" value="${jdbc.username}"/>
<!--連接配接資料庫的密碼-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</enviroment>
</enviroments>
在MyBatis中,可以配置兩種類型的事務管理器,分别是JDBC和MANAGED,關于這兩個事務管理器的描述如下:
- JDBC:此配置直接使用了JDBC的送出和復原設定,它依賴于從資料源得到的連接配接來管理事務的作用域.
- MANAGED:此配置從來不送出或復原一個連接配接,而是讓容器來管理事務的整個生命周期,在預設情況下,它會關閉連接配接,但一些容器并不希望這樣,為此可以将closeConnection屬性設定為false來阻止它預設的關閉行為.
對于資料源的配置,MyBatis提供了UNPOOLED、POOLED和JNDI三種資料源類型,具體如下:
- UNPOOLED
配置此資料源類型後,在每次被請求時會打開和關閉連接配接。
屬性 | 說明 |
driver | JDBC驅動的Java類的全限定類名 |
url | 資料庫的URL位址 |
username | 登入資料庫的使用者名 |
password | 登入資料庫的密碼 |
defaultTransactionsolationLevel | 預設的連接配接事務隔離級别 |
- POOLED
此資料源利用"池"的概念将JDBC連接配接對象組織起來,避免了在建立新的連接配接執行個體時所需要初始化和認證的時間.
屬性 | 說明 |
poolMaximumActiveConnections | 在任意時間正在使用的連接配接數量,預設值:10 |
poolMaximumldleConnections | 任意時間可能存在的空閑連接配接數 |
poolMaximumCheckoutTime | 在被強制傳回前,池中連接配接被檢出(checked out)時間,預設值:20000毫秒,即20秒 |
poolTimeToWait | 如果擷取連接配接花費的時間較長,它會給連接配接池列印狀态日志并重新嘗試擷取一個連接配接(避免在誤配置的情況下一直處于無提示的失敗),預設值:20000毫秒,即20秒 |
poolPingQuery | 發送到資料庫的偵測查詢,用于檢驗連接配接是否處在正常工作秩序中,預設是"NO PING QUERY SET",這會導緻多數資料庫驅動失敗時帶有一定的錯誤消息 |
poolPingEnabled | 是否啟用偵測查詢.若開啟,必須使用一個可執行的SQL語句設定poolPingQuery屬性(最好是一個非常快的SQL),預設值:false |
poolPingConnectionsNotUsedFor | 配置poolPingQuery的使用頻度.可以被設定成比對具體的資料庫連接配接逾時時間,來避免不必要的偵測,預設值:0(表示所有連接配接每一時刻都被偵測,隻有poolPingEnabled的屬性值為true時适用) |
- JNDI
此資料源可以在EJB或應用伺服器等容器中使用.容器可以集中或在外部配置資料源,然後放置一個JNDI上下文的引用.
屬性 | 說明 |
initial_context | 此屬性主要用于在initialcontext中尋找上下文(即initialcontext.lookup(initial_context))該屬性為可選屬性,在忽略時,data_source屬性會直接從initialcontext中尋找 |
data_source | 此屬性表示引用資料源執行個體位置的上下文的路徑.如果提供了initial_context配置,那麼程式會在其傳回的上下文中進行查找;如果沒有提供,則直接在initialcontext中查找. |
2.9 <mappers>元素
在配置檔案中,<mappers>元素用于指定MyBatis映射檔案的位置,一般可以使用以下4種方法引入映射器檔案,具體如下:
- 使用類路徑引入
<mappers>
<mappers resource="com/itcast/mapper/UserMapper.xml"/>
</mappers>
- 使用本地檔案路徑引入
<mappers>
<mappers url="file:///D:/com/itcast/mapper/UserMapper.xml"/>
</mappers>
- 使用接口類引入
<mappers>
<mapper class="com.itcast.mapper.UserMapper"/>
</mappers>
- 使用包名引入
<mappers>
<package name="com.itcast.mapper"/>
</mappers>
3. MyBatis的映射檔案
3.1 主要元素
3.2 <select>元素
<select>元素用于映射查詢語句,它的作用是從資料庫中讀取出資料,并組裝資料給業務開發人員.
<select id="findCustomerById" parameterType="Integer"
resultType="com.itcast.po.Customer">
select * from t_customer where id=#{id}
</select>
上述語句中的唯一辨別為findCustomerById,它接收一個Integer類型的參數,并傳回一個Customer類型的對象.
屬性 | 說明 |
id | 表示命名空間中的唯一辨別符,常與命名空間組合起來使用.組合後如果不唯一,會抛異常 |
parameterType | 該屬性表示傳入SQL語句的參數類的全限定類名或者别名,它是一個可選屬性,因為MyBatis可以通過TypeHandler推斷出具體傳入語句的參數,預設值是unset(依賴于驅動) |
resultType | 從SQL語句中傳回的類型的類的全限定類名或者别名.如果是集合類型,那麼傳回的應該是集合可以包含的類型,而不是集合本身.傳回時可以使用resultType或者resultMap之一 |
resultMap | 表示外部resultMap的命名引用.傳回時可以使用resultType或者resultMap之一 |
flushCache | 表示在調用SQL語句之後,是否需要MyBatis青空之前查詢的本地緩存和二級緩存.其值為布爾類型(true|false),預設值為false,如果設定為true,則任何時候隻要SQL語句被調用,都會清空本地緩存和二級緩存. |
useCache | 用于控制二級緩存的開啟和關閉.其值為布爾類型(true|false),預設值為true,表示将查詢結果存入二級緩存中 |
timeout | 用于設定逾時參數,機關為妙.逾時将抛出異常 |
fetchSize | 擷取記錄的總條數設定,其預設值是unset(依賴于驅動) |
statementType | 用于設定MyBatis使用哪個JDBC的Statement工作,其值為STATEMENT、PREPARED(預設值)或CALLABLE,分别對應JDBC中的statement、PreparedStatement和CallableStatement |
resultSetType | 表示結果集的類型,其值可設定為FORWARD_ONLY,SCROLL_SENSITIVE或SCROLL_INSENSITIVE,預設值是unset(依賴于驅動) |
3.3 <insert> 元素
<insert> 元素用于映射插入語句,在執行完元素中定義的SQL語句後,會傳回一個表示插入記錄數的整數.
<insert
id="addCustomer"
parameterType="com.itcast.po.Customer"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
屬性 | 說明 |
keyProperty | (僅對insert和update有用)作用是将插入或更新操作時的傳回值指派給PO類的某個屬性,通常會設定為主鍵對應的屬性.如果需要設定聯合主鍵,可以在多個值之間用逗号隔開 |
keyColumn | (僅對insert和update有用)用于設定第幾列是主鍵,當主鍵列不是表中的第一列時需要設定,在設定聯合主鍵時,值可以用逗号隔開 |
useGeneratedKeys | (僅對insert和update有用)此屬性會使MyBatis使用JDBC的getGeneratedKeys()方法來擷取由資料庫内部産生的主鍵,如MySQL和SQLServer等自動遞增的字段,其預設值為false |
如果使用的資料庫支援主鍵自動增長,那麼可以通過keyProperty屬性指定PO類的某個屬性接收主鍵傳回值(通常會設定到id屬性上),然後将useGeneratedKeys的屬性值設定為true,案例如下:
<insert id="addCustomer" parameterType="com.itcast.po.Customer"
keyProperty="id" useGeneratedKeys="true">
insert into t_customer(username,jobs,phone)
values(#{username},#{jobs},#{phone})
</insert>
使用上述配置執行插入後,會傳回插入成功的行數,以及插入行的主鍵值,為了驗證此配置,測試下:
@Test
public void addCustomerTest(){
//擷取sqlsession
SqlSession sqlSession =MybatisUtils.getSession();
Customer customer =new Customer ();
customer.setUsername("rose");
customer.setJobs("student");
customer.setphone("18911961081");
int rows=sqlSession.insert("com.itcast.mapper."
+"CustomerMapper.addCustomer",customer);
//輸出插入資料的主鍵id值
System.out.println(customer.getId());
if(rows>0){
System.out.println("成功插入了"+rows+"調資料");
}esle{
System.out.println("執行插入操作失敗");
}
sqlSession.commit();
sqlSession.close();
}
}
如果使用的資料庫不支援主鍵自動增長,或者支援增長的資料庫取消了主鍵自增的規則時,也可以使用MyBatis提供的另一種方式來自定義生成主鍵
<insert id="insertCustomer" parameterType="com.itcast.po.Customer">
<selectKey keyProperty="id" resultType="Integer" order="BEFORE">
select if(max(id) is null,1,max(id)+1 as newId from t_customer)
</selectKey>
insert into t_customer(id,username,jobs,phone)
value(#{id},#{username},#{jobs},#{phone})
</insert>
在執行上述示例代碼時,<selectKey>元素會首先運作,它會通過自定義的語句來設定資料表中主鍵(如果t_customer表中沒有記錄,則将id設定為1,否則就将id的最大值加1,來作為新的主鍵),然後再調用插入語句
<selectKey>元素在使用時可以設定以下幾種屬性
<selectKey
keyProperty="id"
resultType="Integer"
order="BEFORE"
statementType="PREPARED">
在上述<selectKey>幾個屬性中,order屬性可以被設定為BEFORE或AFTER.如果設定為BEFORE,那麼它會首先執行<selectKey>元素中的配置來設定主鍵,然後執行插入語句;如果設定為AFTER,那麼它會先執行插入語句,然後執行<selectKey>元素中的配置内容.
3.4 <update>元素和<delete>元素
<update
id="updateCustomer"
parameterType="com.itcast.po.Customer"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteCustomer"
parameterType="com.itcast.po.Customer"
flushCache="true"
statementType="PREPARED"
timeout="20">
<update>和<delete>元素在執行完之後,也會傳回一個表示影響記錄條數的整數
<!--更新資訊-->
<update id="updateCustomer" parameterType="com.itcast.po.Customer">
update t_customer
set username=#{username},jobs=#{jobs},phone=#{phone}
where id=#{id}
</update>
<!--删除資訊-->
<delete id="deleteCustomer" parameterType="Integer">
delete from t_customer where id=#{id}
</delete>
3.5 <sql>元素
<sql>元素的作用是定義可重用的SQL代碼片段,然後在其它語句中引用這一代碼片段.
<sql id="customerColumn">id,username,jobs,phone</sql>
這一代碼片段可以包含在其它語句中使用,具體如下:
<select id="findCustomerById" parameterType="Integer"
resultType="com.itcast.po.Customer">
select <include refid="customerColumns"/>
from t_customer
where id=#{id}
</select>
在上述代碼中,使用<include>元素的refid屬性引用了自定義的代碼片段,refid的屬性值為自定義代碼片段的id
<!--定義表的字首名-->
<sql id="tablename">
${prefix}customer
</sql>
<!--定義要查詢的表-->
<sql id="someinclude">
from
<include refid="${include_target}"/>
</sql>
<!--定義查詢列-->
<sql id="customerColumns">
id,username,jobs,phone
</sql>
<!--根據id查詢客戶資訊-->
<select id="findCustomerById" parameterType="Integer"
resultType="com.itcast.po.Customer">
select
<include refid="customerColumns"/>
<include refid="someinclude">
<property name="prefix" value="t_"/>
<property name="include_target" value="tablename"/>
</include>
where id=#{id}
</select>
上述代碼中,定義了3個代碼片段,分别為表的字首名,要查詢的表和需要查詢的列.前2個代碼片段中,分别擷取了<include>子元素和<property>中的值,其中,第一個代碼片段中的"${prefix}"會擷取name為prefix的值"t_",擷取後組成的表名為"t_customer";而第2個代碼片段中的"${include_target}"會擷取name為include_target的值"tablename",由于tablename為第1個SQL片段的id值,是以最後要查詢的表為"t_customer"
3.6 <resultMap>元素
<resultMap>元素表示結果映射集,作用是定義映射規則、級聯的更新以及定義類型轉化器等
<resultMap>元素中包含了一些子元素,它的元素結構如下所示:
<!--resultMap的元素結構-->
<resultMap type="" id="">
<constructor> <!--類在執行個體化時,用來注入結果到構造方法中-->
<idArg/> <!--ID參數;标記結果作為ID-->
<arg/> <!--注入到構造方法的一個普通結果-->
</constructor>
<id/> <!--用于表示哪個列是主鍵-->
<result/> <!--注入到字段或JavaBean屬性的普通結果-->
<association property=""/> <!--用于一對一關聯-->
<collection property=""/ > <!--用于一對多關聯-->
<discriminator javaType=""> <!--使用結果值來決定使用哪個結果映射-->
<case value=""/> <!--基于某些值的結果映射-->
</discriminator>
</resultMap>
<resultMap>元素的type屬性表示需要映射的POJO,id屬性是這個resultMap的唯一辨別.它的子元素<constructor>用于配置構造方法(當一個POJO中未定義無參的構造方法時,就可以使用<constructor>元素進行配置)子元素<id>用于表示哪個列是主鍵,而<result>用于表示POJO和資料表中普通列的映射關系.<association>和<collection >用于處理多表時的關聯關系,而<discriminator>元素主要用于處理一個單獨的資料庫查詢傳回很多不同資料類型屆國際的情況
案例:資料庫表中的列和需要傳回的對象的屬性可能不會完全一緻,此時可以使用<resultMap>元素進行處理
(1)在資料庫中,建立一個t_user表,并插入幾條測試資料
USE mybatis;
CREATE TABLE t_user;
t_id INT PRIMARY KEY AUTO_INCREMENT,
t_name VARCHAR(50),
t_age INT
);
INSERT INTO t_user(t_name,t_age)VALUES('Lucy',25);
INSERT INTO t_user(t_name,t_age)VALUES('Lili',20);
INSERT INTO t_user(t_name,t_age)VALUES('Jim',20);
(2)在com.itcast.po包中,建立類User,在類中定義id,name和age屬性,以及對應的getter/setter方法和toString()方法
(3)在com.itcast.mapper包下,建立映射檔案UserMapper.xml,并在映射檔案中編寫映射查詢語句
<mapper namespace="com.itcast.mapper.UserMapper">
<resultMap type="com.itcast.po.User" id="resultMap">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
<result property="age" column="t_age"/>
</resultMap>
<select id="findAllUser" resultMap="resultMap">
select * from t_user
</select>
</mapper>
<resultMap>的子元素<id><result>的property屬性表示User類的屬性名,column屬性表示資料表t_user的列名<select>元素的resultMap屬性表示引用上面定義的resultMap
(4)測試類,findAllUserTest()
@Test
public void findAllUserTest(){
//擷取sqlsession
SqlSession sqlSession =MybatisUtils.getSession();
//SqlSession 執行映射檔案中定義的SQL,并傳回映射結果
List<User> list=
sqlSession .selectList("com.itcast.mapper.UserMapper.findAllUser");
for(User user:list){
System.out.println(user);
}
//關閉sqlSession
sqlSession.close();
}