MyBatis學習筆記 - 第002天

MyBatis

2.1.1 environment

MyBatis 支持配置多個 dataSource 環境,可以將應用部署到不同的環境上,如 DEV(開發環境),TEST(測試換將),QA(質量評估環境),UAT(用戶驗收環境),PRODUCTION(生產環境),可以通過將默認 environment 值設置成想要的environment id 值。
  在上述的配置中,默認的環境 environment 被設置成 development。當需要將程序部署到生產服務器上時,你不需要修改什么配置,只需要將默認環境 environment 值設置成生產環境的 environment id 屬性即可。
  有時候,我們可能需要在相同的應用下使用多個數據庫。比如我們可能有 SHOPPING-CART 數據庫來存儲所有的訂單明細;使用 REPORTS 數據庫存儲訂單明細的合計,用作報告。
如果你的應用需要連接多個數據庫,你需要將每個數據庫配置成獨立的環境,并且為每一個數據庫創建一個SqlSessionFactory。

2.1.2 數據源 DataSource

dataSource 的類型可以配置成其內置類型之一,如 UNPOOLED,POOLED,JNDI。

  • 如果將類型設置成 UNPOOLED,MyBatis 會為每一個數據庫操作創建一個新的連接,并關閉它。該方式適用于只有小規模數量并發用戶的簡單應用程序上。
  • 如果將屬性設置成 POOLED,MyBatis 會創建一個數據庫連接池,連接池中的一個連接將會被用作數據庫操作。一旦數據庫操作完成,MyBatis 會將此連接返回給連接池。在開發或測試環境中,經常使用此種方式。
  • 如果將類型設置成 JNDI,MyBatis 從在應用服務器向配置好的 JNDI 數據源 dataSource 獲取數據庫連接。在生產環境中,優先考慮這種方式。

2.1.3 事務管理器 TransactionManager

MyBatis 支持兩種類型的事務管理器: JDBC and MANAGED.

  • JDBC 事務管理器被用作當應用程序負責管理數據庫連接的生命周期(提交、回退等等)的時候。當你將TransactionManager 屬性設置成 JDBC,MyBatis 內部將使用 JdbcTransactionFactory 類創建TransactionManager。例如,部署到 Apache Tomcat 的應用程序,需要應用程序自己管理事務。
  • MANAGED 事務管理器是當由應用服務器負責管理數據庫連接生命周期的時候使用。當你將TransactionManager 屬性設置成 MANAGED 時, MyBatis 內部使用 ManagedTransactionFactory 類創建事務管理器TransactionManager。例如,當一個 JavaEE的應用程序部署在類似 JBoss, WebLogic,GlassFish 應用服務器上時,它們會使用 EJB 進行應用服務器的事務管理能力。在這些管理環境中,你可以使用 MANAGED 事務管理器。
    (Managed 是托管的意思,即是應用本身不去管理事務,而是把事務管理交給應用所在的服務器進行管理。)

2.1.4 類型別名 typeAliases

在 SQLMapper 配置文件中,對于 resultType 和 parameterType 屬性值,我們需要使用 JavaBean 的完全限定名。

   <typeAliases> 
        <!-- 
        <typeAlias alias="User" type="com.kygo.mybatis.entity.User"/> 
        --> 
        <package name="com.kygo.mybatis.entity"/>   
   </typeAliases> 

2.1.5 類型處理器 typeHandlers

創建一個自定義的類型處理器

  1. MyBatis 提供了抽象類 BaseTypeHandler<T> ,我們可以繼承此類創建自定義類型處理器。
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>
{
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
PhoneNumber parameter, JdbcType jdbcType) throws
SQLException
{
ps.setString(i, parameter.getAsString());
}
@Override
public PhoneNumber getNullableResult(ResultSet rs, String
columnName)
throws SQLException
{
return new PhoneNumber(rs.getString(columnName));
}
@Override
public PhoneNumber getNullableResult(ResultSet rs, int
columnIndex)
throws SQLException
{
return new PhoneNumber(rs.getString(columnIndex));
}
@Override
public PhoneNumber getNullableResult(CallableStatement cs, int
columnIndex)
throws SQLException
{
return new PhoneNumber(cs.getString(columnIndex));
}
}
  1. 我們使用 ps.setString()和 rs.getString()方法是因為 phone 列是 VARCHAR 類型。
  2. 一旦我們實現了自定義的類型處理器,我們需要在 mybatis-config.xml 中注冊它:
<typeHandlers>
<typeHandler handler="com.mybatis3.typehandlers. PhoneTypeHandler" />
</typeHandlers>

2.1.6 全局參數設置 Settings

<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25000" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode ,toString" />
</settings>

3 映射

一對多映射

UserDao.xml

    <resultMap type="Order" id="OrderResult">
        <result property="id" column="orderid"/>
        <result property="makeDate" column="makeDate"/>
        <result property="address" column="address"/>
        <association property="user" resultMap="UserResult"  />
    </resultMap> 
    <resultMap type="User" id="UserResult">
        <id column="userid" property="id" />
        <result column="username" property="username" />
        <result column="email" property="email" />
        <result column="nickname" property="nickname" />
        <result column="gender" property="gender" />
        <collection property="orders" resultMap="OrderResult" />
    </resultMap>
    <select id="findByUsernameWithOrders" parameterType="String" resultMap="UserResult">
        select u.*, o.*
        from tb_user as u inner join tb_order as o
        on u.userid = o.userid and u.username=#{username}
    </select>

<collection>元素被用來將多行課程結果映射成一個課程 Course 對象的一個集合。 和一對一映射一樣,我們可以使用嵌套結果 ResultMap 和嵌套 Select 語句兩種方式映射實現一對多映射。

出現問題

表和表的主鍵id要區分

關系型數據庫

數據完整性

  • 1.實體完整性(主鍵/唯一約束/唯一索引)
  • 2.引用完整性(外鍵)
  • 3.域(字段)完整性(數據類型/非空約束/檢查約束/默認值)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容