当开启了延迟加载的开关,对象是怎么变成代理对象的?
DefaultResultSetHandler.createResultObject()
DefaultResultSetHandler.createResultObject()既然是代理對象,那么必須要有一種創建代理對象的方法。我們有哪些實現動態代理的方式?
這個就是為什么settings 里面提供了一個ProxyFactory 屬性。MyBatis 默認使用JAVASSIST 創建代理對象。也可以改為CGLIB,這時需要引入CGLIB 的包。
【問題】CGLIB 和JAVASSIST 區別是什么?
測試一下,我們把默認的JAVASSIST 修改為CGLIB,再打印這個對象。
【問題】
1、resultType 和resultMap 的區別?
2、collection 和association 的區別?
MBG 與Example
https://github.com/mybatis/generator
我們在項目中使用MyBaits 的時候,針對需要操作的一張表,需要創建實體類、Mapper 映射器、Mapper 接口,里面又有很多的字段和方法的配置,這部分的工作是非常繁瑣的。而大部分時候我們對于表的操作是相同的,比如根據主鍵查詢、根據Map查詢、單條插入、批量插入、根據主鍵刪除等等等等。當我們的表很多的時候,意味著有大量的重復工作。所以有沒有一種辦法,可以根據我們的表,自動生成實體類、Mapper映射器、Mapper 接口,里面包含了我們需要用到的這些基本方法和SQL 呢?
給大家看一個類文件(DBToJavaVO.java),這個是我以前到一個公司的時候,項目里面用的Hibernate+Oracle,當時是我第一次用Hibernate。我發現PO 類和VO 類的格式基本上都是一樣的,屬性跟表字段一一對應,主要有幾個區別:
1、類里面的屬性都是表里面的字段,然后定義getter()、setter()方法;
2、數據庫字段的下劃線命名,要改成駝峰命名。
3、PO 上面要加@Table、@Id、@Column 的注解;VO 不用;
4、數據庫的常見類型,要改成Java 類型,比如varchar,要對應成Java 的String類型。
當時我就靈機一動,能不能寫一個根據數據庫的表自動生成PO 和VO 類的工具呢?
這樣新建表的時候就不用一個一個寫字段,一個一個加注解了。于是我就寫了這個類。后來我才知道有個東西叫Hibernate 逆向工程。
MyBatis 也提供了一個這樣的東西,叫做MyBatis Generator,簡稱MBG。我們只需要修改一個配置文件,使用相關的jar 包命令或者Java 代碼就可以幫助我們生成實體類、映射器和接口文件。不知道用MyBatis 的同學有沒有跟當年的我一樣,還是實體類的一個一個字段,接口的一個一個方法,映射器的一條一條SQL 去寫的。
MBG 的配置文件里面有一個Example 的開關,這個東西用來構造復雜的篩選條件的,換句話說就是根據我們的代碼去生成where 條件(類似于Tom 老師的自動生成where 條件的方式)。
原理:在實體類中包含了兩個有繼承關系的Criteria,用其中自動生成的方法來構建查詢條件。把這個包含了Criteria 的實體類作為參數傳到查詢參數中,在解析Mapper映射器的時候會轉換成SQL 條件。
實例:查詢bid=1 的Blog,通過創建一個Criteria 去構建查詢條件:
BlogMapper mapper = session.getMapper(BlogMapper.class); BlogExample example = new BlogExample(); BlogExample.Criteria criteria = example.createCriteria(); criteria.andBidEqualTo(1); List<Blog> list = mapper.selectByExample(example);生成的語句:
select 'true' as QUERYID, bid, name, author_id from blog WHERE ( bid = ? )?
總結
以上是生活随笔為你收集整理的当开启了延迟加载的开关,对象是怎么变成代理对象的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis-一对一的关联查询有两种配
- 下一篇: mybatis-翻页