日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

当开启了延迟加载的开关,对象是怎么变成代理对象的?

發布時間:2024/4/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当开启了延迟加载的开关,对象是怎么变成代理对象的? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 = ? )

?

總結

以上是生活随笔為你收集整理的当开启了延迟加载的开关,对象是怎么变成代理对象的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。