ssm--mybatis3
阿新 • • 發佈:2018-12-09
延遲載入
延遲載入(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{}