Mybatis注解
- 查找
@Select( "SELECT * FROM tt_user WHERE username Like #{id};") User findUserByName(String name); <!--以map為輸入參數查找--> @Select("select * from tt_user where username= #{name} and password=#{pass}") User findUserByUsernameAndPassword(HashMap map);
- 插入
@Insert("insert into tt_user values (#{id},#{username},#{password},#{email},#{age})") int AddUser(User user) throws IOException;
- 更改
@Update("update tt_user set username = #{username} where id = #{id}") void updateUserById(User user);
- 刪除
@Delete("delete from tt_user where id =#{id}") void deleteUserById(String id);
動態SQL語句
@SelectProvider(type = UserDaoSqlProvider.class,method = "findUserByName") List<User> findUserByName(String username) throws IOException;
public String findUserByName(String username){ //return "select * from tt_user where username like '" +username+"'"; String sql = new SQL() {{ SELECT("*"); FROM("tt_user"); if (username!=null&&!username.isEmpty()){ WHERE("username like "+username ); } }}.toString(); System.out.println("sql="+sql); return sql; }
Mybatis提供了一個匿名內部類
另一種寫法:
public String getxxx(){ return new SQL().UPDATE("PERSON") .SET("FULL_NAME = #{fullName}", "DATE_OF_BIRTH = #{dateOfBirth}") .WHERE("ID = #{id}") .toString(); } }
Mybatis對ORM層的優化
緩存
查了一次,結果保存在本地,下次查相同內容的時候就不用再去訪問數據庫了。
懶加載
Lazyloading:先加載主信息,在需要的時候再去加載關聯數據
Mybatis中ResultMap中的association和Collection標簽具有懶加載的功能
- 默認情況沒有懶加載
- 如何開啟懶加載呢?
在主配置文件中的configuration標簽下配置
<!--全局懶加載--> <settings> <!--開關--> <setting name="lazyLoadingEnabled" value="true"/> </settings>
- 局部懶加載配置
在從配置文件中的association或者collection里邊添加fetchType字段(fetch翻譯是拿、取)
<resultMap id="studentAndCourses" type="com.bamzhy.bean.Student"> <id column="id" property="id"></id> <collection property="courses" javaType="list" select="com.bamzhy.dao.UserDao.findcourseBySid" column="id" fetchType="eager"> <id column="cid" property="cid"></id> </collection> </resultMap>
- 全局懶加載和局部懶加載同時出現時,以局部懶加載優先
MyBatis緩存機制
- 一級緩存指的就是sqlsession,在sqlsession中有一個數據區域,是map結構,這個區域就是一級緩存區域。
- 查詢同一個對象(使用同一個session)時,第二次查詢并不會調用sql語句,而是從sqlsession中取數據。
- 開啟一級緩存:默認開啟
- 驗證一級緩存存在
我查了兩次,但是只執行了一次sql語句
現在在第一次查詢結束后關閉sqlSession,再重新new一個session出來,
執行查詢
果然,sql語句被執行了兩次,可以證明一級緩存的確存在
二級緩存
二級緩存指的就是同一個namespace下的mapper,二級緩存中,也有一個map結構,這個區域就是二級緩存區域。
- 開啟二級緩存
主配置文件里邊:
從配置文件:
注意點 cache對象需要實現序列化接口,否則會報Error serializing object
- 測試二級緩存
雖然我關閉了sqlsession,但仍然沒有執行兩次sql。
說明二級緩存的確存在
- 如果不關閉一級緩存,那么二級緩存就不生效。
比如我創建了一個sqlsession,不關閉,再創建一個sqlsession,那么二級緩存看見第一個sqlsession沒有關閉(一級緩存生效了),二級緩存他就不生效了。事實上這倆session不是同一個session,二級緩存也沒生效,這樣要執行兩次sql語句。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_37366958/article/details/79946193