A. hibernate主鍵生成主鍵後可以自己定義主鍵嗎

1、
主鍵由外部程序負責生成,在 save() 之前必須指定一個。Hibernate不負責維護主鍵生成。與Hibernate和底層資料庫都無關,可以跨資料庫。在存儲對象前,必須要使用主鍵的setter方法給主鍵賦值,至於這個值怎麼生成,完全由自己決定,這種方法應該盡量避免。
<id name="id" column="id">
<generator class="assigned" />
</id>
「ud」是自定義的策略名,人為起的名字,後面均用「ud」表示。
特點:可以跨資料庫,人為控制主鍵生成,應盡量避免。
2、increment
由Hibernate從資料庫中取出主鍵的最大值(每個session只取1次),以該值為基礎,每次增量為1,在內存中生成主鍵,不依賴於底層的資料庫,因此可以跨資料庫。
<id name="id" column="id">
<generator class="increment" />
</id>
Hibernate調用org.hibernate.id.IncrementGenerator類裡面的generate()方法,使用select max(idColumnName) from tableName語句獲取主鍵最大值。該方法被聲明成了synchronized,所以在一個獨立的java虛擬機內部是沒有問題的,然而,在多個JVM同時並發訪問資料庫select max時就可能取出相同的值,再insert就會發生Dumplicate entry的錯誤。所以只能有一個Hibernate應用進程訪問資料庫,否則就可能產生主鍵沖突,所以不適合多進程並發更新資料庫,適合單一進程訪問資料庫,不能用於群集環境。
官方文檔:只有在沒有其他進程往同一張表中插入數據時才能使用,在集群下不要使用。
特點:跨資料庫,不適合多進程並發更新資料庫,適合單一進程訪問資料庫,不能用於群集環境。
3、hilo
hilo(高低位方式high low)是hibernate中最常用的一種生成方式,需要一張額外的表保存hi的值。保存hi值的表至少有一條記錄(只與第一條記錄有關),否則會出現錯誤。可以跨資料庫。
<id name="id" column="id">
<generator class="hilo">
<param name="table">hibernate_hilo</param>
<param name="column">next_hi</param>
<param name="max_lo">100</param>
</generator>
</id>
<param name="table">hibernate_hilo</param> 指定保存hi值的表名
<param name="column">next_hi</param> 指定保存hi值的列名
<param name="max_lo">100</param> 指定低位的最大值
也可以省略table和column配置,其默認的表為hibernate_unique_key,列為next_hi
<id name="id" column="id">
<generator class="hilo">
<param name="max_lo">100</param>
</generator>
</id>
hilo生成器生成主鍵的過程(以hibernate_unique_key表,next_hi列為例):
1. 獲得hi值:讀取並記錄資料庫的hibernate_unique_key表中next_hi欄位的值,資料庫中此欄位值加1保存。
2. 獲得lo值:從0到max_lo循環取值,差值為1,當值為max_lo值時,重新獲取hi值,然後lo值繼續從0到max_lo循環。
3. 根據公式 hi * (max_lo + 1) + lo計算生成主鍵值。
注意:當hi值是0的時候,那麼第一個值不是0*(max_lo+1)+0=0,而是lo跳過0從1開始,直接是1、2、3……
那max_lo配置多大合適呢?
這要根據具體情況而定,如果系統一般不重啟,而且需要用此表建立大量的主鍵,可以吧max_lo配置大一點,這樣可以減少讀取數據表的次數,提高效率;反之,如果伺服器經常重啟,可以吧max_lo配置小一點,可以避免每次重啟主鍵之間的間隔太大,造成主鍵值主鍵不連貫。
特點:跨資料庫,hilo演算法生成的標志只能在一個資料庫中保證唯一。
4、seqhilo
與hilo類似,通過hi/lo演算法實現的主鍵生成機制,只是將hilo中的數據表換成了序列sequence,需要資料庫中先創建sequence,適用於支持sequence的資料庫,如Oracle。
<id name="id" column="id">
<generator class="seqhilo">
<param name="sequence">hibernate_seq</param>
<param name="max_lo">100</param>
</generator>
</id>

特點:與hilo類似,只能在支持序列的資料庫中使用。
5、sequence
採用資料庫提供的sequence機制生成主鍵,需要資料庫支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL這種不支持sequence的資料庫則不行(可以使用identity)。
<generator class="sequence">
<param name="sequence">hibernate_id</param>
</generator>
<param name="sequence">hibernate_id</param> 指定sequence的名稱
Hibernate生成主鍵時,查找sequence並賦給主鍵值,主鍵值由資料庫生成,Hibernate不負責維護,使用時必須先創建一個sequence,如果不指定sequence名稱,則使用Hibernate默認的sequence,名稱為hibernate_sequence,前提要在資料庫中創建該sequence。
特點:只能在支持序列的資料庫中使用,如Oracle。
6、identity
identity由底層資料庫生成標識符。identity是由資料庫自己生成的,但這個主鍵必須設置為自增長,使用identity的前提條件是底層資料庫支持自動增長欄位類型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle這類沒有自增欄位的則不支持。
<id name="id" column="id">
<generator class="identity" />
</id>
例:如果使用MySQL資料庫,則主鍵欄位必須設置成auto_increment。
id int(11) primary key auto_increment
特點:只能用在支持自動增長的欄位資料庫中使用,如MySQL。
7、native
native由hibernate根據使用的資料庫自行判斷採用identity、hilo、sequence其中一種作為主鍵生成方式,靈活性很強。如果能支持identity則使用identity,如果支持sequence則使用sequence。
<id name="id" column="id">
<generator class="native" />
</id>
例如MySQL使用identity,Oracle使用sequence
注意:如果Hibernate自動選擇sequence或者hilo,則所有的表的主鍵都會從Hibernate默認的sequence或hilo表中取。並且,有的資料庫對於默認情況主鍵生成測試的支持,效率並不是很高。
使用sequence或hilo時,可以加入參數,指定sequence名稱或hi值表名稱等,如
<param name="sequence">hibernate_id</param>
特點:根據資料庫自動選擇,項目中如果用到多個資料庫時,可以使用這種方式,使用時需要設置表的自增欄位或建立序列,建立表等。
8、uuid
UUID:Universally Unique Identifier,是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。按照開放軟體基金會(OSF)制定的標准計算,用到了乙太網卡地址、納秒級時間、晶元ID碼和許多可能的數字,標準的UUID格式為:
xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
其中每個 x 是 0-9 或 a-f 范圍內的一個十六進制的數字。
<id name="id" column="id">
<generator class="uuid" />
</id>
Hibernate在保存對象時,生成一個UUID字元串作為主鍵,保證了唯一性,但其並無任何業務邏輯意義,只能作為主鍵,唯一缺點長度較大,32位(Hibernate將UUID中間的「-」刪除了)的字元串,佔用存儲空間大,但是有兩個很重要的優點,Hibernate在維護主鍵時,不用去資料庫查詢,從而提高效率,而且它是跨資料庫的,以後切換資料庫極其方便。
特點:uuid長度大,佔用空間大,跨資料庫,不用訪問資料庫就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。
9、guid
GUID:Globally Unique Identifier全球唯一標識符,也稱作 UUID,是一個128位長的數字,用16進製表示。演算法的核心思想是結合機器的網卡、當地時間、一個隨即數來生成GUID。從理論上講,如果一台機器每秒產生10000000個GUID,則可以保證(概率意義上)3240年不重復。
<id name="id" column="id">
<generator class="guid" />
</id>
Hibernate在維護主鍵時,先查詢資料庫,獲得一個uuid字元串,該字元串就是主鍵值,該值唯一,缺點長度較大,支持資料庫有限,優點同uuid,跨資料庫,但是仍然需要訪問資料庫。
注意:長度因資料庫不同而不同
MySQL中使用select uuid()語句獲得的為36位(包含標准格式的「-」)
Oracle中,使用select rawtohex(sys_guid()) from al語句獲得的為32位(不包含「-」)
特點:需要資料庫支持查詢uuid,生成時需要查詢資料庫,效率沒有uuid高,推薦使用uuid。
10、foreign
使用另外一個相關聯的對象的主鍵作為該對象主鍵。主要用於一對一關系中。
<id name="id" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="domain.User" constrained="true" />
該例使用domain.User的主鍵作為本類映射的主鍵。
特點:很少使用,大多用在一對一關系中。
11、select
使用觸發器生成主鍵,主要用於早期的資料庫主鍵生成機制,能用到的地方非常少。
12、其他注釋方式配置
注釋方式與配置文件底層實現方式相同,只是配置的方式換成了注釋方式
自動增長,適用於支持自增欄位的資料庫
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
根據底層資料庫自動選擇方式,需要底層資料庫的設置
如MySQL,會使用自增欄位,需要將主鍵設置成auto_increment。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
使用表存儲生成的主鍵,可以跨資料庫。
每次需要主鍵值時,查詢名為"hibernate_table"的表,查找主鍵列"gen_pk"值為"2"記錄,得到這條記錄的"gen_val"值,根據這個值,和allocationSize的值生成主鍵值。
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ud")
@TableGenerator(name = "ud",
table = "hibernate_table",
pkColumnName = "gen_pk",
pkColumnValue = "2",
valueColumnName = "gen_val",
initialValue = 2,
allocationSize = 5)
使用序列存儲主鍵值
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ud")
@SequenceGenerator(name = "ud",
sequenceName = "hibernate_seq",
allocationSize = 1,
initialValue = 2)
13、小結
1、為了保證對象標識符的唯一性與不可變性,應該讓Hibernate來為主鍵賦值,而不是程序。
2、正常使用Hibernate維護主鍵,最好將主鍵的setter方法設置成private,從而避免人為或程序修改主鍵,而使用assigned方式,就不能用private,否則無法給主鍵賦值。
2、Hibernate中唯一一種最簡單通用的主鍵生成器就是uuid。雖然是個32位難讀的長字元串,但是它沒有跨資料庫的問題,將來切換資料庫極其簡單方便,推薦使用!
3、自動增長欄位類型與序列

資料庫

自動增長欄位

序列

MySQL



Oracle



DB2





MS SQL Server



Sybase



HypersonicSQL



PostgreSQL



SAP DB



HSQLDB



Infomix



4、關於hilo機制注意:
hilo演算法生成的標志只能在一個資料庫中保證唯一。
當用戶為Hibernate自行提供連接,或者Hibernate通過JTA,從應用伺服器的數據源獲取資料庫連接時,無法使用hilo,因為這不能保證hilo單獨在新的資料庫連接的事務中訪問hi值表,這種情況,如果資料庫支持序列,可以使用seqhilo。
5、使用identity、native、GenerationType.AUTO等方式生成主鍵時,只要用到自增欄位,資料庫表的欄位必須設置成自動增加的,否則出錯。
6、還有一些方法未列出來,例如uuid.hex,sequence-identity等,這些方法不是很常用,且已被其他方法代替,如uuid.hex,官方文檔里建議不使用,而直接使用uuid方法。
7、Hibernate的各版本主鍵生成策略配置有略微差別,但實現基本相同。如,有的版本默認sequence不指定序列名,則使用名為hibernate_sequence的序列,有的版本則必須指定序列名。
8、還可以自定義主鍵生成策略,這里暫時不討論,只討論官方自帶生成策略。
你們都是有經驗的開發人員
分類: 5.理.理論學習
標簽: Hibernate
好文要頂 關注我 收藏該文

starskyhu
關注 - 5
粉絲 - 86
+加關注
4
0
« 上一篇:SSH開發環境整合搭建
» 下一篇:POJO網路

posted @ 2016-05-19 15:57 starskyhu 閱讀(36887) 評論(1) 編輯 收藏

評論

#1樓 2017-05-31 16:40 | 蘇塵_博客園
文章說的很清楚,非常感謝。
支持(1)反對(0)

刷新評論刷新頁面返回頂部
注冊用戶登錄後才能發表評論,請 登錄 或 注冊,訪問網站首頁
【推薦】50萬行VC++源碼: 大型組態工控、電力模擬CAD與GIS源碼庫
【推薦】搭建微信小程序 就選騰訊雲
【推薦】報表開發有捷徑:快速設計輕松集成,數據可視化和交互

最新IT新聞:
· 一夜之間全世界WIFI都不安全了,你該怎麼辦?
· 九個問題,搞清楚Facebook的廣告系統是如何運作的
· 你的通知欄有救了,工信部牽頭成立了統一推送聯盟
· 北京首條中低速磁浮列車年底試運營 最高時速80km/h
· 蘋果重申iPhone X的Face ID數據只會存儲在本地並加密
» 更多新聞...

最新知識庫文章:

· 實用VPC虛擬私有雲設計原則
· 如何閱讀計算機科學類的書
· Google 及其雲智慧
· 做到這一點,你也可以成為優秀的程序員
· 寫給立志做碼農的大學生

» 更多知識庫文章...
昵稱:starskyhu
園齡:2年7個月
粉絲:86
關註:5
+加關注

< 2017年10月 >









24 25 26 27 28 29 30
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
搜索

常用鏈接
我的隨筆
我的評論
我的參與
最新評論
我的標簽
更多鏈接
我的標簽
java(83)
spring(30)
Maven(25)
茶餘飯後(21)
jdbc(20)
設計模式(17)
javaweb(14)
Linux(13)
IDE(13)
Git(13)
更多
隨筆分類(427)
1.域.業務領域(15)
2.術.解決方案(38)
3.陣.技術應用(3)
4.法.手段方法(17)
5.理.理論學習(311)
6.器.工具使用(3)
7.題.習題鞏固(10)
A.雜七雜八(30)
隨筆檔案(442)
2017年10月 (1)
2017年9月 (20)
2017年8月 (9)
2017年7月 (10)
2017年6月 (43)
2017年5月 (22)
2017年4月 (15)
2017年3月 (9)
2017年2月 (12)
2017年1月 (2)
2016年11月 (58)
2016年10月 (14)
2016年9月 (4)
2016年6月 (9)
2016年5月 (20)
2016年4月 (62)
2016年3月 (70)
2016年2月 (62)
文章分類(2)
1.域.業務領域
2.術.解決方案
4.陣.技術應用
5.法.手段方法
6.理.理論學習(1)
7.器.工具使用
8.題.習題鞏固
A.雜七雜八(1)
文章檔案(2)
2016年2月 (2)
相冊
大學時代-&程序員
最新評論
1. Re:JAVA必背面試題和項目面試通關要點
@Wang6doudou謝謝 共勉...
--starskyhu
2. Re:JAVA必背面試題和項目面試通關要點
非常好
--Wang6doudou
3. Re:事務&資料庫連接池
@大肥肥就是我自我的一個學習復習大綱吧 沒有具體的細化...
--starskyhu
4. Re:事務&資料庫連接池
有點流水賬,每到關鍵點就跳過了。
--大肥肥就是我
5. Re:Hibernate各種主鍵生成策略與配置詳解
文章說的很清楚,非常感謝。
--蘇塵_博客園
閱讀排行榜
1. JAVA必背面試題和項目面試通關要點(39743)
2. Hibernate各種主鍵生成策略與配置詳解(36881)
3. [轉載]SSH框架搭建詳細圖文教程(25505)
4. Oracle 11g安裝步驟詳談(18934)
5. java經典小程序(10978)
評論排行榜
1. [轉載]SSH框架搭建詳細圖文教程(6)
2. javaSE知識點匯總(3)
3. java面試第一天(3)
4. 使用myeclipse建立maven項目(重要)(2)
5. (一)使用springAPI以及自定義類 實現AOP-aop編程(2)
推薦排行榜
1. JAVA必背面試題和項目面試通關要點(5)
2. Hibernate各種主鍵生成策略與配置詳解(4)
3. javaBean為什麼要實現Serializable介面?(2)
4. Eclipse快捷鍵大全(2)

B. 小程序開發藍牙搜索ibeacon,只能獲取到uuids,怎樣獲取sn

搜索不到藍牙 的一般原因及處理方法:一,一般都會認為 打開藍牙之後,手機就能搜索到藍牙,並且成功與之連接,其實這是錯誤的。若要手機搜索到藍牙,藍牙就必須進入一個特殊的狀態:配對狀態。

C. 微信小程序如何獲取本機藍牙mac地址

流程是這樣的:先初始化藍牙適配器,然後獲取本機藍牙適配器的狀態,然後開始搜索,當停止搜索以後在開始搜索,就會觸發藍牙是配置狀態變化的事件,搜索完成以後獲取所有已經發現的藍牙設備,就可以將devices中的設備Array取出來了。然後就可以得到所有已經連接的設備了,至於鏈接功能,還沒有真機可測,所以沒有測試。

我的電腦上藍牙連接的設備:

以下是案例代碼

  • // pages/bluetooth/bluetooth.js

  • Page({

  • data:{},

  • onLoad:function(options){

  • // 頁面初始化 options為頁面跳轉所帶來的參數

  • },

  • //初始化藍牙適配器

  • openBluetooth:function(){

  • wx.openBluetoothAdapter({

  • success: function(res){

  • console.log(res.errMsg)

  • // success

  • wx.showToast({

  • title:"初始化藍牙適配器成功",

  • ration:2000

  • })

  • },

  • })

  • },

  • //關閉藍牙模塊

  • closeBluetooth:function(){

  • wx.openBluetoothAdapter()

  • wx.closeBluetoothAdapter({

  • success: function(res){

  • // success

  • console.log("success"+res)

  • }

  • })

  • },

  • //獲取本機藍牙適配器狀態

  • getBluetoothAdapterState:function(){

  • wx.getBluetoothAdapterState({

  • success: function(res){

  • // success

  • console.log("res:"+res)

  • console.log("errMsg:"+res.errMsg)

  • }

  • })

  • },

  • //監聽藍牙適配器狀態變化事件

  • onBluetoothAdapterStateChange:function(){

  • wx.onBluetoothAdapterStateChange(function(res) {

  • console.log(`adapterState changed, now is`, res)

  • })

  • },

  • // 開始搜尋附近的藍牙外圍設備

  • :function(){

  • wx.({

  • success: function (res) {

  • console.log(res)

  • }

  • })

  • },

  • // 停止搜尋附近的藍牙外圍設備

  • stopBluetoothDevicesDiscovery:function(){

  • wx.stopBluetoothDevicesDiscovery({

  • success: function (res) {

  • console.log(res)

  • }

  • })

  • },

  • //獲取所有已發現的藍牙設備

  • getBluetoothDevices:function(){

  • wx.getBluetoothDevices({

  • success: function(res){

  • // success

  • console.log(res)

  • },

  • })

  • },

  • //監聽尋找到新設備的事件

  • onBluetoothDeviceFound:function(){

  • wx.onBluetoothDeviceFound(function(res) {

  • // callback

  • console.log(res)

  • })

  • },

  • //根據 uuid 獲取處於已連接狀態的設備

  • getConnectedBluetoothDevices:function(){

  • wx.getConnectedBluetoothDevices({

  • success: function (res) {

  • console.log(res)

  • }

  • })

  • },

  • //連接低功耗藍牙設備

  • createBLEConnection:function(){

  • wx.createBLEConnection({

  • deviceId: 'AC:BC:32:C1:47:80',

  • success: function(res){

  • // success

  • console.log(res)

  • },

  • fail: function(res) {

  • // fail

  • },

  • complete: function(res) {

  • // complete

  • }

  • })

  • },

  • //斷開與低功耗藍牙設備的連接

  • closeBLEConnection:function(){

  • wx.closeBLEConnection({

  • deviceId: 'AC:BC:32:C1:47:80',

  • success: function (res) {

  • console.log(res)

  • }

  • })

  • },

  • //監聽低功耗藍牙連接的錯誤事件,包括設備丟失,連接異常斷開等等

  • onBLEConnectionStateChanged:function(){

  • wx.onBLEConnectionStateChanged(function(res) {

  • console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)

  • })

  • },

  • //獲取藍牙設備所有 service(服務)

  • getBLEDeviceServices:function(){

  • wx.getBLEDeviceServices({

  • deviceId: '48:3B:38:88:E3:83',

  • success: function(res){

  • // success

  • console.log('device services:', res.services.serviceId)

  • },

  • fail: function(res) {

  • // fail

  • },

  • complete: function(res) {

  • // complete

  • }

  • })

  • },

  • //獲取藍牙設備所有 characteristic(特徵值)

  • getBLEDeviceCharacteristics:function(){

  • wx.getBLEDeviceCharacteristics({

  • deviceId: '48:3B:38:88:E3:83',

  • serviceId: 'serviceId',

  • success: function(res){

  • // success

  • },

  • fail: function(res) {

  • // fail

  • },

  • complete: function(res) {

  • // complete

  • }

  • })

  • }

  • })

D. 微信小程序 怎麼用第三方js庫 jquery

方法一:rpn.js:使用rpn.js實現eval函數功能
操作鏈接:網頁鏈接

方法二:
(1)使用Underscore.js:操作鏈接:網頁鏈接

(2)使用Immutable.js:操作鏈接:網頁鏈接

(3)使用UUID、Base64、Chance:操作鏈接:網頁鏈接

擴展微信小程序框架功能(1)——Promise

ES6 對 Promise 有了原生的支持,但微信開發者工具更新版本(0.11.112200)後, 移除了開發者工具對 ES6 中Promise 特性原生的支持, 需要引入第三方的 Promise 庫。


擴展微信小程序框架功能(2)——Generator
Generator函數是ES6提供的一種非同步編程解決方案,語法行為與傳統函數完全不同。

擴展微信小程序框架功能(3)——函數功能增強
Underscore.js 和 Lodash 是最常用的JavaScript庫。

擴展微信小程序框架功能(4)——Immutable.js
Immutable.js 是 Facebook 開發的不可變數據集合。Immutable
Data(不可變數據)一旦創建就不能被修改。通過使用Immutable
Data,可以更容易的處理緩存、回退、數據變化檢測等問題,應用開發更簡單。

擴展微信小程序框架功能(5)——Rex
Rex 是 JavaScript 狀態容器,提供可預測化的狀態管理。

擴展微信小程序框架功能(6)—日期時間
Moment.js是一個JavaScript的日期、時間處理工具類,其對於JavaScript的日期時間處理功能非常強悍和全面。可以用在瀏覽器環境中使用,也可以在Node.js中。

擴展微信小程序框架功能(7)——正則表達式
XRegExp 是一個開源的 JavaScript庫,提供一個參數化、可擴展的支持各種瀏覽器的正則表達式的實現庫,支持附加語法、標志以及方法。

擴展微信小程序框架功能(8)——Xml處理
x2js是一個 實現 XML 與 JavaScript 對象之間相互轉換的工具庫。

擴展微信小程序框架功能(9)——加解密
node-uuid可以快速地生成符合規范 的 UUID。js-base64可以實現Base64編碼和解碼。crypto-js可以非常方便地在 JavaScript 進行加解密。

擴展微信小程序框架功能(10)——測試輔助
Chance是一個 JavaScript 隨機數生成工具。Mock.js可以生成隨機數據,攔截 Ajax 請求。

方法三:moment
操作鏈接:網頁鏈接

E. MIT App Inventor 2

如果你寫程序遇到困難,或許我可以幫你,但是程序還是要自己寫。

F. 微信小程序里上傳圖片到雲存儲,用什麼樣的寫法才能讓第二次上傳的圖片不覆蓋上一次的呢

你把圖片的名稱更換一下不就好了,希望能幫到你

G. 我自己寫了個Android小程序可是一開就崩潰,求告知由哪些錯誤導致。mainactivity代碼如下:

樓主,這個問題我前幾天剛碰到過,剛剛調完。你不要在程序中寫這版一句requestWindowFeature(Window.FEATURE_NO_TITLE);,把它換為
ActionBar actionBar=getSupportActionBar();
actionBar.hide();這兩句就行權了,這樣你在標題欄就被隱藏起來,而且你點擊Menu鍵也不會出錯了!你試一下,我的API也是19,我這樣寫就解決了。我的應用是一定要extends ActionBarActivity,所以最後只能找到這種方法,不能把它改為extends Activity.

H. 怎樣使用微信小程序的第三方js庫

方法一:rpn.js:使用rpn.js實現eval函數功能
操作鏈接:網頁鏈接

方法二:
(1)使用Underscore.js:操作鏈接:網頁鏈接

(2)使用Immutable.js:操作鏈接:網頁鏈接

(3)使用UUID、Base64、Chance:操作鏈接:網頁鏈接

擴展微信小程序框架功能(1)——Promise

ES6 對 Promise 有了原生的支持,但微信開發者工具更新版本(0.11.112200)後, 移除了開發者工具對 ES6 中Promise 特性原生的支持, 需要引入第三方的 Promise 庫。


擴展微信小程序框架功能(2)——Generator
Generator函數是ES6提供的一種非同步編程解決方案,語法行為與傳統函數完全不同。

擴展微信小程序框架功能(3)——函數功能增強
Underscore.js 和 Lodash 是最常用的JavaScript庫。

擴展微信小程序框架功能(4)——Immutable.js
Immutable.js 是 Facebook 開發的不可變數據集合。Immutable
Data(不可變數據)一旦創建就不能被修改。通過使用Immutable
Data,可以更容易的處理緩存、回退、數據變化檢測等問題,應用開發更簡單。

擴展微信小程序框架功能(5)——Rex
Rex 是 JavaScript 狀態容器,提供可預測化的狀態管理。

擴展微信小程序框架功能(6)—日期時間
Moment.js是一個JavaScript的日期、時間處理工具類,其對於JavaScript的日期時間處理功能非常強悍和全面。可以用在瀏覽器環境中使用,也可以在Node.js中。

擴展微信小程序框架功能(7)——正則表達式
XRegExp 是一個開源的 JavaScript庫,提供一個參數化、可擴展的支持各種瀏覽器的正則表達式的實現庫,支持附加語法、標志以及方法。

擴展微信小程序框架功能(8)——Xml處理
x2js是一個 實現 XML 與 JavaScript 對象之間相互轉換的工具庫。

擴展微信小程序框架功能(9)——加解密
node-uuid可以快速地生成符合規范 的 UUID。js-base64可以實現Base64編碼和解碼。crypto-js可以非常方便地在 JavaScript 進行加解密。

擴展微信小程序框架功能(10)——測試輔助
Chance是一個 JavaScript 隨機數生成工具。Mock.js可以生成隨機數據,攔截 Ajax 請求。

方法三:moment
操作鏈接:網頁鏈接

I. 如何在小程序中使用template

一、定義模板
1、新建一個template文件夾用來管理項目中所有的模板;
2、新建一個courseList.wxml文件來定義模板;
3、使用name屬性,作為模板的名字。然後在內定義代碼片段。
注意:
a.可以看到一個.wxml文件中可以定義多個模板,只需要通過name來區分;
b.模板中的數據都是展開之後的屬性。
<template name="courseLeft">
<navigator url="../play/play?courseUuid={{courseUuid}}&isCompany={{isCompany}}">
<view class="item mr26">
<image src="{{imagePath}}" mode="aspectFill"></image>
<view class="course-title">
<text class="title">{{courseName}}</text>
<text class="author">- {{teacherName}}</text>
</view>
<view class="course-info clearfix">
<view class="fl"><text class="play">{{playCount}}</text></view>
<view class="fr"><text class="grade">{{score}}</text></view>
</view>
<view wx:if="{{studyProgress}}" class="tip-completed">{{studyProgress}}</view>
</view>
</navigator></template><template name="courseRight">
<navigator url="../play/play?courseUuid={{courseUuid}}&isCompany={{isCompany}}">
<view class="item">
<image src="{{imagePath}}" mode="aspectFill"></image>
<view class="course-title">
<text class="title">{{courseName}}</text>
<text class="author">- {{teacherName}}</text>
</view>
<view class="course-info clearfix">
<text class="play fl">{{playCount}}</text>
<text class="grade fr">{{score}}</text>
</view>
<view wx:if="{{studyProgress}}" class="tip-completed">{{studyProgress}}</view>
</view>
</navigator></template>

二、使用模板
1、使用 is 屬性,聲明需要的使用的模板

<import src="../../templates/courseList.wxml"/>

2、將模板所需要的 data 傳入,一般我們都會使用列表渲染。

<block wx:for="{{courseList}}">
<template is="{{index%2 === 0 ? 'courseLeft' : 'courseRight'}}" data="{{...item}}"></template></block>

注意:
a.可以通過表達式來確定使用哪個模板is="{{index%2 === 0 ? 'courseLeft' : 'courseRight'}}"
或者通過wx:if來確定。index是數組當前項的下標。

<template wx:if="{{index%2 === 0}}" is="courseLeft" data="{{...item}}"></template>
<template wx:else is="courseRight" data="{{...item}}"></template>

b. data 是要模板渲染的數據,data="{{...item}}" 寫法是ES6的寫法,item是wx:for當前項,... 是展開運算符,在模板中不需要再{{item.courseName}} 而是直接{{courseName}} 。
三、模板樣式
1、在新建模板的時候同時新建一個courseList.wxss 的文件,與CSS同樣的寫法控制樣式。
2、在需要使用模板的頁面 .wxss文件中import進來;或者直接在app.wxss中引入,這樣只需要一次引入,其他文件就不用引入了。
@import url("../template/courseList.wxss");

J. 微信掃碼登錄怎用js獲取code,求實用代碼

小程序有相應的介面可以獲取code,公眾號開發則需要授權,後端獲取。