1. 程式人生 > >Mybatis框架--測試延遲加載

Mybatis框架--測試延遲加載

tis total 測試用例 val div 默認的配置 == batis integer

在學習mybatis的延遲加載時,對 lazyLoadingEnabledaggressiveLazyLoading 的區別並不理解,特別是對查詢的條件不同時,執行的查詢語句也不一樣,所以還是測試總結一下

Blog: 

    private Integer id;
    private String title;
    /*private Integer authorId;*/
    private Author author;
    private String state;
    private Boolean featured;
    private String style;
    
Author:

   
private Integer id; private String username; private String password; private String email; private String bio; private String favouriteSection; private String nickname; private String realname;

測試用例如下:

1.1 使用默認配置,不查詢任何屬性

test:

@Test
public void testSelectBlogByIdLazyLoading() { SqlSession session
= MyBatisUtil.getSqlsession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); System.out.println("查詢blog"); Blog blog = blogMapper.selectBlogById(1); session.close(); System.out.println("查詢結束"); }

console:

    查詢blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [[email protected]]
    ==> Preparing: select * from blog where id = ?

    ==> Parameters: 1(Integer)
    ====> Preparing: select * from author where id = ?
    ====> Parameters: 1(Integer)
    <==== Total: 1
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [[email protected]]
    Closing JDBC Connection [[email protected]]
    Returned connection 1263877414 to pool.
    查詢結束

result:
    使用默認的配置,並且不對blog進行任何屬性的查詢,但是仍然執行了對author表的查詢

1.2 使用默認配置,查詢blog的非author屬性

test:
@Test
public void testSelectBlogByIdLazyLoading() { SqlSession session = MyBatisUtil.getSqlsession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); System.out.println("查詢blog"); Blog blog = blogMapper.selectBlogById(1); session.close(); System.out.println("查詢blog的title屬性"); System.out.println(blog.getTitle());
System.out.println("查詢結束"); }

console:
  
    查詢blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [[email protected]]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    ====> Preparing: select * from author where id = ?
    ====> Parameters: 1(Integer)
    <==== Total: 1
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [[email protected]]
    Closing JDBC Connection [[email protected]]
    Returned connection 1263877414 to pool.
    查詢blog的title屬性
    My Colourful Garden
    查詢結束

result:
  
  使用默認配置,只對blog的非author屬性進行查詢,但是結果和test1.1一樣,都執行了對author表的查詢

1.3 使用默認配置,查詢blog的屬性(包括author屬性)

test:
    
    @Test
    public void testSelectBlogByIdLazyLoading() {
        
        SqlSession session = MyBatisUtil.getSqlsession();
        BlogMapper blogMapper = session.getMapper(BlogMapper.class);
        
        System.out.println("查詢blog");
        Blog blog = blogMapper.selectBlogById(1);
        session.close();
        
        System.out.println("查詢blog的title屬性");
        System.out.println(blog.getTitle());
System.out.println("查詢blog的author屬性");
System.out.println(blog.getAuthor().getUsername());
System.out.println(
"查詢結束"); } console:        查詢blog     Opening JDBC Connection     Created connection 1263877414.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from blog where id = ?     ==> Parameters: 1(Integer)     ====> Preparing: select * from author where id = ?     ====> Parameters: 1(Integer)     <==== Total: 1     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     查詢blog的title屬性
    My Colourful Garden
    查詢blog的author屬性
    helen     查詢結束 result:      使用默認配置,對blog屬性(包括author屬性)進行查詢,但是結果和test1.1以及test1.2一樣,都執行了對author表的查詢

2.1 配置 lazyLoadingEnabled:true; 不查詢任何屬性

 config:

<!-- 延遲加載 默認不開啟 --> <settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>

test:
  
  @Test
  public void testSelectBlogByIdLazyLoading() {

     SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
     System.out.println("查詢blog");
     Blog blog = blogMapper.selectBlogById(1);
     session.close();
System.out.println("查詢結束"); }

console:
  
    查詢blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [[email protected]]
    ==>  Preparing: select * from blog where id = ? 
    ==> Parameters: 1(Integer)
    <==      Total: 1
    Resetting autocommit to true on JDBC Connection [[email protected]]
    Closing JDBC Connection [[email protected]]
    Returned connection 1263877414 to pool.
    查詢結束

result:
  
  配置 lazyLoadingEnabled:true,並且不對blog進行任何屬性查詢,則session只執行對本表的查詢

2.2 配置 lazyLoadingEnabled:true; 查詢blog的非author屬性

 config:
 
   <!-- 延遲加載 默認不開啟 -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

test:
  
  @Test 
  public void testSelectBlogByIdLazyLoading() { 

     SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
     
     System.out.println("查詢blog");
     Blog blog = blogMapper.selectBlogById(1); 
     session.close();  

     System.out.println("查詢blog的title屬性");
     System.out.println(blog.getTitle());

System.out.println(
"查詢結束"); } console:        查詢blog     Opening JDBC Connection     Created connection 1263877414.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from blog where id = ?     ==> Parameters: 1(Integer)     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     查詢blog的title屬性
    Opening JDBC Connection
    Checked out connection 1263877414 from pool.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JD[email protected]]
    ==> Preparing: select * from author where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [[email protected]]
    Closing JDBC Connection [[email protected]]
    Returned connection 1263877414 to pool.
    My Colourful Garden
    查詢結束 result:      配置 lazyLoadingEnabled:
true,並且對blog進行非author查詢,則session先執行對本表的查詢,然後執行對author表的查詢

2.3 配置 lazyLoadingEnabled:true;查詢blog的屬性(包括author屬性)

config:
 
   <!-- 延遲加載 默認不開啟 -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

test:
  
  @Test 
  public void testSelectBlogByIdLazyLoading() { 

     SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
     
     System.out.println("查詢blog");
     Blog blog = blogMapper.selectBlogById(1); 
     session.close();

     System.out.println("查詢blog的title屬性");
     System.out.println(blog.getTitle());
System.out.println("查詢blog的author屬性");
System.out.println(blog.getAuthor().getUsername());

System.out.println(
"查詢結束"); } console:        查詢blog     Opening JDBC Connection     Created connection 1263877414.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from blog where id = ?     ==> Parameters: 1(Integer)     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     查詢blog的title屬性     Opening JDBC Connection     Checked out connection 1263877414 from pool.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from author where id = ?     ==> Parameters: 1(Integer)     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     My Colourful Garden
    查詢blog的author屬性
    helen     查詢結束 result:      配置 lazyLoadingEnabled:
true,並且對blog進行author查詢,則結果和test2.2一樣,session先執行對本表的查詢,然後執行對author表的查詢

3.1 配置lazyLoadingEnabled:true;aggressiveLazyLoading:false; 不查詢任何屬性

  config:

   <!-- 延遲加載 默認不開啟 -->
<!-- 默認是積極的懶加載 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

  test:

    @Test 
    public void testSelectBlogByIdLazyLoading() {

       SqlSession session = MyBatisUtil.getSqlsession();
       BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
       System.out.println("查詢blog");
       Blog blog = blogMapper.selectBlogById(1);
       session.close();
   System.out.println("查詢結束");    }


  console:
     查詢blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [[email protected]]
    ==>  Preparing: select * from blog where id = ? 
    ==> Parameters: 1(Integer)
    <==      Total: 1
    Resetting autocommit to true on JDBC Connection [[email protected]]
    Closing JDBC Connection [[email protected]]
    Returned connection 1263877414 to pool.
    查詢結束

  result:

    配置 lazyLoadingEnabled:true,aggressiveLazyLoading:false; 並且不對blog進行任何查詢,則session只執行對本表的查詢

3.2 配置lazyLoadingEnabled:true;aggressiveLazyLoading:false; 查詢非author屬性

 config:
 
   <!-- 延遲加載 默認不開啟 -->
  <!-- 默認是積極的懶加載 --> <settings> <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="false"/>
</settings> test:      @Test   public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();      BlogMapper blogMapper = session.getMapper(BlogMapper.class);           System.out.println("查詢blog");      Blog blog = blogMapper.selectBlogById(1);      session.close();

     System.out.println("查詢blog的title屬性");
     System.out.println(blog.getTitle());
System.out.println(
"查詢結束"); } console:        查詢blog     Opening JDBC Connection     Created connection 1263877414.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from blog where id = ?     ==> Parameters: 1(Integer)     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     查詢blog的title屬性
    My Colourful Garden     查詢結束 result:      配置 lazyLoadingEnabled:
true,aggressiveLazyLoading:false ;並且對blog進行非author查詢,則session只執行對本表的查詢

3.3 配置lazyLoadingEnabled:true;aggressiveLazyLoading:false; 查詢blog的屬性(包括author屬性)

config:
 
   <!-- 延遲加載 默認不開啟 -->
  <!-- 默認是積極的懶加載 --> <settings> <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="false"/> </settings>
test:      @Test   public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();      BlogMapper blogMapper = session.getMapper(BlogMapper.class);           System.out.println("查詢blog");      Blog blog = blogMapper.selectBlogById(1);      session.close();     
     System.out.println("查詢blog的title屬性");
System.out.println(blog.getTitle());
System.out.println("查詢blog的author屬性");
System.out.println(blog.getAuthor().getUsername());
System.out.println(
"查詢結束"); } console:        查詢blog     Opening JDBC Connection     Created connection 1263877414.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from blog where id = ?     ==> Parameters: 1(Integer)     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     查詢blog的title屬性     Opening JDBC Connection     Checked out connection 1263877414 from pool.     Setting autocommit to false on JDBC Connection [[email protected]]     ==> Preparing: select * from author where id = ?     ==> Parameters: 1(Integer)     <== Total: 1     Resetting autocommit to true on JDBC Connection [[email protected]]     Closing JDBC Connection [[email protected]]     Returned connection 1263877414 to pool.     My Colourful Garden     查詢blog的author屬性     helen     查詢結束 result:      配置 lazyLoadingEnabled:true;aggressiveLazyLoading:false; 並且對blog進行author查詢,則session先執行對本表的查詢,然後執行對author表的查詢

在默認配置下,無論是否對blog的屬性進行查詢,session都會執行對blog表和對author表兩條查詢語句,然後存入緩存中,供查詢結果調用,稱為不延遲加載;

在配置lazyLoadingEnabled:true 後,如果不對blog的任何屬性進行查詢,session只會執行查詢blog的語句;但是只要對blog的任意屬性進行查詢,就會查詢blog表和author表,然後放入緩存,共查詢結果調用,稱為積極的延遲加載;

在配置 lazyLoadingEnabled:true;aggressiveLazyLoading:false;後,如果不對blog的author屬性進行查詢,session只會執行查詢blog的語句;如果查詢了blog的author屬性,就會繼續查詢author,成為不積極的延遲加載

Mybatis框架--測試延遲加載