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
創建一個自定義的類型處理器
- 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));
}
}
- 我們使用 ps.setString()和 rs.getString()方法是因為 phone 列是 VARCHAR 類型。
- 一旦我們實現了自定義的類型處理器,我們需要在 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.域(字段)完整性(數據類型/非空約束/檢查約束/默認值)