1. 程式人生 > >ssm--mybatis3

ssm--mybatis3

延遲載入
延遲載入(lazyLoading):
	在需要用到資料時才載入,不需要用到資料時就不載入資料,也叫懶載入,按需載入。應用場景:一對多,多對多
立即載入(eager):
	無論資料是否有用,立刻載入。應用場景:一對一,多對一
實現延遲載入案例:
<resultMap id="accountUser" type="com.baidu.domain.Account">
    <!--配置主表的實體類屬性-->
    	.....
    <!--配置從表的實體類屬性-->
    <collection ofType="com.baidu.domain.User"
property="users" column="aid" select="com.baidu.dao.IUserDao.findUserById">
..... </collection> </resultMap> <select id="findAccount" resultMap="accountUser"> select * from account </select> <select id="findUserById" resultType="com.baidu.domain.User"
parameterType="int">
select * from user where uid = #{aid} </select> collection select : 指定從表的sql(namespace + methodName) collection column : 指定主表的外來鍵,並由它對從表的引數賦值 association也有select屬性,用法類似,但沒什麼作用
<properties></properties>
<!--配置settings-->
<settings>
	<!--配置支援延遲載入-->
<setting name="lazyLoadingEnabled" value="true"></setting> //延遲載入的全域性開關 <setting name="aggressiveLazyLoading" value="false"></setting> //侵略性延遲載入 </settings> <typeAliases></typeAliases> 延遲載入的全域性開關:設定為true,表示支援延遲載入配置 侵略性延遲載入: 設定為true,表示任何方法的呼叫都會載入該物件的所有屬性。相當於延遲載入只對這個物件生效第一次,只要一觸發一次按需載入,就會立刻載入完這個物件的所有資料;設定為false,表示該物件的所有屬性都會按需載入,通常都設定為false。
mybatis快取(cache)
一級快取:
	一級快取是sqlSession範圍,不需要配置直接就可以使用,當用戶第一次查詢資料後,mybatis一級快取就會將該資料的物件儲存在sqlSession範圍,當再次查詢這條資料,就把這個物件直接從快取中返回。只要sqlSession不呼叫以下方法,sqlSession的快取就一直存在: sqlSession.clearCache(), sqlSession.commit(),sqlSession.close(), 增刪改(DML)語句,也就是說執行這些方法都會清空一次sqlSession快取

二級快取:
	二級快取是mapper對映級別的快取,多個SqlSession去操作同一個Mapper對映的sql語句,多個SqlSession可以共用二級快取,二級快取是跨SqlSession的。由同一個SqlSessionFactory物件生產的同一種SqlSession物件共用二級快取,
SqlSession session1 = factory.openSession(); 
SqlSession session2 = factory.openSession(); 
session1.getMapper(IUserDao.class);
session2.getMapper(IUserDao.class);


一二級快取注意:
	1.使用二級快取時,所快取的類必須實現java.io.Serializable 介面,使用序列化方式來儲存物件,否則報錯。
	2.一級快取儲存的是物件;二級快取儲存的是序列化資料,不是物件。
使用一級快取:user1 == user2 //true,地址值相等 ; 使用二級快取: user 1 == user 2 //false,地址值不相等
配置二級快取:
	第一步:在SqlMapConfig.xml檔案開啟二級快取
	<settings>
        <!--開啟二級快取的支援-->
        <setting name="cacheEnabled" value="true"></setting>
	</settings>	
	第二步:配置相關mapper的對映檔案
	<cache/>
	第三步:配置statement的useCache屬性,目前已知只有select標籤支援useCache屬性
	<select id="queryUser" resultType="User" useCache="true">
        select * from user
	</select>
	使用註解開發時,只要跟介面對應的包下存在跟IUserDao介面同名IUserDao.xml對映配置檔案,無論這個配置檔案是否使用,都會報錯。
<!--對映單個介面-->
<mapper class="com.baidu.dao.IUserDao"></mapper>
<!--掃描包下的所有介面-->
<package name="com.baidu.dao"></package>
註解開發
1.增
@Insert(value={"insert into user values(#{id},#{username})"}) 	//標準寫法
void insertUser(User user);
2.刪
@Delete({"delete from user where id = #{id}"})	//註解的屬性是value,並且只有一個屬性,可以省略
void deleteUser(Integer id);
3.改
@Update("Update user set username = #{username} where id = #{id}")  //註解陣列的值只有一個,{}省略
void updateUser(User user);
4.查
@Select("select * from user)
List<User> selectUser();
實體類屬性跟資料庫欄位不匹配
處理方式一:起別名
處理方式二:
@Results(id="resultMap",value={
	@Result(id=true,column="id",property="myId"),
	@Result(column="username",property="myUsername") //最後一個","可有可無
})
@Select("select * from user)
List<User> selectUser();
多表查詢:
	多對一,一對一:
public class User{
	privatre Account account;
}
@Results(id="resultMap",value={
	@Result(id=true,column="id",property="myId"),
	@Result(column="username",property="myUsername"),
	@Result(column="id",property="account",[email protected](
	select="com.baidu.dao.IAccountDao.findAccount",fatchType=""))
})
@Select("select * from user)
List<User> selectUser();	//domain.user
<!------------------------->
 @Select("select * from account where uid = #{uid}")
Account findAccount(Integer id);
    
 @Results > id : 唯一標識,供其他註解引用,使用@ResultMap(value="resultMap")註解引用
 @Results > value : Result[]用來指定實體類跟資料庫的對應關係
 @Result > id : 指定主表主鍵
 @Result > column : 指定資料庫的列名
 @Result > property : 指定實體類的屬性
 <!--多表關係-->
 @Result > column : 主表的外來鍵對應的資料庫的列名
 @Result > property : 指定從表對應的實體類的屬性
    @result > one : one = @One{
    select="指定用來多表查詢的sqlStatement"
    fetchType = FetchType.LAZY (延遲載入) / FetchType.EAGER (立即載入)
    }
    @result > many : many = @Many{ ... }  //一對多,多對多
    @One預設fetchType是立即載入,@Many預設fetchType是延遲載入
註解開發實現二級快取:
	第一步:在SqlMapConfig.xml配置使用二級快取
	<setting name="cacheEnabled" value="true"></setting>
	第二步:在IUserDao介面名上加@CacheNamespace(blocking=true)註解
	@CacheNamespace(blocking=true)
	public interface IuserDao{}