Azure AD B2C(二)使用Azure AD B2C為ASP.NET Core 應用設置社交帳戶(郵箱)登錄/註冊

20200624更新

sorry,上周剛換了電腦,開發工具還沒裝好,導致代碼遲遲沒有上傳!

————-我是分割線————

github:https://github.com/yunqian44/Azure.Active.DirectoryB2C.WebApp.git

一,引言

  上次關於Azure AD B2C 講到一些概念,有介紹到,Azure AD B2C 也是一種身份驗證的解決方案,但是它運行客戶使用其首選的社交,企業或者本地賬戶標識對應用程序和API進行單一登錄訪問。同樣,Azure AD B2C 使用基於標準的身份驗證協議,包括 OpenID Connect、OAuth 2.0 和 SAML。 它與大多數第三方的 idp 進行集成。今天,介紹如何使用 Azure Active Directory B2C (Azure AD B2C) 在 ASP.NET Web 應用程序中進行用戶登錄和註冊。 應用程序可以使用 Azure AD B2C 通過開放式標準協議對社交帳戶、企業帳戶和 Azure Active Directory 帳戶進行身份驗證。

二,正文

2.1,創建B2C租戶

  Azure Portal 左側菜單 點擊“創建資源”,同時搜索框中輸入 “ Azure Active Directory B2C”。

   點擊 “創建” 按鈕

  選擇 “創建新的 Azure Active AD B2C 租戶”

   輸入 “組織名稱”,”域名”,“區域”,“資源組”等名稱

  Organization name:CnBate B2C

  Initial domain name:cnbateb2c

 

  繼續選擇 ”Azure Active Directory B2C “,選擇 ”Link an existing Azure AD B2C to my Azure subscription“ 連接Azure AD B2C租戶到當前自己的訂閱 

   選擇剛剛註冊的 B2C 租戶,

  Resource group      :CnBate_RG      

  點擊 ”create“

   將Azure AD B2C 添加到左側菜單,在“所有服務” 搜索框中,搜索“Azure AD B2C” ,將鼠標懸停在搜索結果上,然後在工具提示中選擇星形圖標。 “Azure AD B2C”現在會显示在 Azure 門戶中的“收藏夾”下。

 

 

 2.2,註冊應用程序

  在門戶工具欄中選擇“目錄 + 訂閱”圖標,然後選擇包含 Azure AD B2C 租戶的目錄,切換成功后,在Azure Portal的左側菜單上選擇 ”Azure AD B2C“,在 Azure AD B2C 頁面選擇 ” 應用程序(舊版)“,點擊 ” 添加按鈕“

—————–敲黑板了———————-

(這裏先說一下,一定要選擇”應用程序(舊版)“,文章的最後會說明為什麼)

  輸入應用程序的名稱。 例如,“WebApp”;包含Web應用/Web API和運行隱式流,選擇 ”是“;回復URL,暫時先填寫 ”https://jwt.ms“,因為此時我們還沒有新建ASP.NET Core 的web應用,此地址是用來檢查令牌的,可以用來測試。(截圖裡面填寫的 ”http://localhost:9020/sign-oidc“ 是因為我之前運行demo,我自己本地的一個Web應用的地址,所以大家暫時忽略這個)

 

 2.3,創建用戶流 

  選擇 ”策略“-》”用戶流”,點擊 ”新建用戶流“

 

 

  在“建議”選項卡上選擇“註冊和登錄”用戶流。

 

  輸入該用戶流的名稱 ”B2C_1_signupsignin1“;標識提供者 勾選 ”郵件註冊“;用戶特性和聲明 收集特性和返回聲明勾選 ”姓“,”名“,”城市“,用戶特性和聲明勾選的選項意思是在註冊期間要從用戶收集併發送的聲明和屬性。 例如,“城市”和“姓”,”名“ 所對應的屬性和聲明。

 

   選擇運行流,選擇前面已註冊的名為 WebApp 的 Web 應用程序。

   此時,我們可以看到一個標準模板的登錄註冊的頁面,點擊 ”Sign up now“,進行註冊。

 

   輸入有效的电子郵件地址,單擊“發送驗證碼”,輸入收到的驗證碼,然後選擇“驗證代碼”。

   查看驗證碼,並且對驗證碼進行校驗,並且輸入相應的 ”姓“,”名“,”城市“,以及 ”登錄密碼“,點擊 ”Create“

 

 

 令牌將返回到 https://jwt.ms 並显示出來。

 2.4,創建ASP.NET Core Web 應用

 安裝:Microsoft.AspNetCore.Authentication.AzureADB2C.UI

  需要註冊驗證服務,這個地方默認的是 “AzureADB2C”,AddAzureADB2C方法綁定Azure AD B2C身份驗證終結點,回調地址,租戶所在的自定義域,客戶端Id,以及登錄/註冊,重置密碼,編輯信息的策略Id,其實也就是剛剛在B2C租戶中新建工作流的名稱。

   註冊Azure AD B2C 認證服務

services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
           .AddAzureADB2C(options=> {
               options.Instance = Appsettings.app("Azure_AD_B2C", "Instance");
               options.ClientId = Appsettings.app("Azure_AD_B2C", "ClientId");
               options.CallbackPath = Appsettings.app("Azure_AD_B2C", "CallbackPath");
               options.Domain = Appsettings.app("Azure_AD_B2C", "Domain");
               options.SignUpSignInPolicyId = Appsettings.app("Azure_AD_B2C", "SignUpSignInPolicyId");
               options.ResetPasswordPolicyId = Appsettings.app("Azure_AD_B2C", "ResetPasswordPolicyId");
               options.EditProfilePolicyId = Appsettings.app("Azure_AD_B2C", "EditProfilePolicyId");
           });

  開啟認證中間件服務

// open authentication middleware
app.UseAuthentication();

  appsettings.json的配置文件

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Azure_AD_B2C": {
    "Instance": "https://cnbateb2c.b2clogin.cn/tfp",
    "ClientId": "39280bbe-bfda-46b8-91c4-f96376f363d9",
    "CallbackPath": "/signin-oidc",
    "Domain": "cnbateb2c.partner.onmschina.cn",
    "SignUpSignInPolicyId": "B2C_1_signupsignin1",
    "ResetPasswordPolicyId": "",
    "EditProfilePolicyId": ""
  }
}
"Instance": "https://<your-tenant-name>.b2clogin.cn/tfp",
"ClientId": "<web-app-application-id>",
"Domain": "<your-b2c-domain>"
"CallbackPath": "/signin-oidc",
"SignUpSignInPolicyId": "B2C_1_test",
"ResetPasswordPolicyId": "",
"EditProfilePolicyId": ""

 

 

   HomeController=》about 方法加上 [Authorize] 

  修改項目啟動端口

 再回到 Azure Portal,為剛剛註冊的Azure AD B2C租戶裏面的WebApp應用設置新的回調地址 “http://localhost:9020/signin-oidc”

 

 

 

 

 

 

 

 

 大功告成!

三,問題匯總

問題1,B2C 應用註冊可以選擇 “應用註冊”,而不是“應用註冊舊版”嗎?

  不可以,Run user flow 中不能選擇 “應用註冊” 裏面的應用,目前在中國區B2C使用應用註冊(預覽)支持以下2種類型的account type, 這2種賬號類型是用於devops場景,因此,不應該使用user flow 來驗證這個類型的用戶。因此,Run user flow中不能選擇應用註冊(預覽)裏面的應用,這是by design的。

問題2,應用註冊的終結點為什麼當前註冊的B2C租戶的域不一致?例如下圖,一個是 com結尾,一個是 “cn”結尾

 答,這是azure 中國區的一個bug,我在4月份就反饋過類似的問題,之前他們是把終結點鏈接的域名後綴寫成com了,但是5月份他們更新的時候,應該沒有注意域名後面的當前租戶的鏈接地址

四,結尾

 今天的文章大概介紹了如果在我們的Web項目中集成Azure AD B2C,通過使用第三方的社交賬號 “郵箱”進行註冊,登陸。下一篇繼續介紹如何使用Azure AD B2C 保護的API資源。

代碼稍等,我會整理一下,上傳到github中

github:https://github.com/yunqian44/Azure.Active.DirectoryB2C.WebApp.git

作者:Allen 

版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

使用IDEA+Gradle構建Spring5源碼並調試(手把手教程全圖解)

一、前言

  說一說我要寫這篇文章的初衷吧,前段時間有小夥伴在微信群求教怎樣構建spring源碼,他在網上找了n個教程跟着後面花了两天時間都沒構建好,正好我最近因工作原因從mac換成windows,開發環境要從零開始搭建和配置,想着也大概有一年多沒看過Spring源碼了,閱讀Spring源碼的好處我就不在此啰嗦了,我就藉此機會寫一篇構建Spring源碼的過程,希望能讓後面的朋友少走彎路,少踩坑。<br/>   開始之前,先說一下我的電腦是新的,也就是所有開發工具和環境都是最新下載和配置的,另外我沒使用梯&子走捷徑,也就是說本文的源碼構建速度是在正常使用網絡情況下,我自己達到的最佳速度,不代表任何人。本文使用到的開發工具及版本說明如下:

  • IntelliJ IDEA 2020.1
  • gradle-6.4.1
  • Spring-framework最新版(5.3.0-SNAPSHOT)

  現在,讓我們正式開始Spring源碼的構建之旅。

二、Spring源碼構建之旅

下載配置Gradle

  這個不是本文的重點又比較簡單,你得靠自己先去配置好,如果你實在不會,在文章後面留言,我下次專門給你們寫這個教程。

下載Spring源碼

1、在github上下載Spring最新版源碼,如下圖所示: 

2、下載完成以後解壓到你自己本地文件夾。 

  我知道因為不可描述原因,大家下載gradle和spring源碼可能比較耗時間,所以我把下載好的放在網盤了,需要的可以自己下載: Spring5源碼直通車 提取碼:srbm

修改配置

  重點來了,下載好源碼以後,我們要開始源碼構建了,在構建之前,我們先打開spring-framework-master,看我截圖的四個文件。下面來一一說明。 

 

1、import-into-idea.md:這是官方提供的spring源碼導入idea的步驟和注意說明,我已經翻譯過了,可以移步:IDEA導入Spring源碼調試必看

2、修改settings.gradle文件,下載依賴的網絡速度之不可描述原因,懂得人都懂,我們加上阿里雲的maven倉庫。

maven { url "https://maven.aliyun.com/repository/public" }

修改好之後如下圖所示:

3、修改gradle.properties文件,我都加了詳細註釋

version=5.3.0-SNAPSHOT
## 設置此參數主要是編譯下載包會佔用大量的內存,可能會內存溢出
org.gradle.jvmargs=-Xmx2048M
## 開啟 Gradle 緩存
org.gradle.caching=true
## 開啟并行編譯
org.gradle.parallel=true
## 啟用新的孵化模式
org.gradle.configureondemand=true
## 開啟守護進程 通過開啟守護進程,下一次構建的時候,將會連接這個守護進程進行構建,而不是重新fork一個gradle構建進程
org.gradle.daemon=true

  

修改好之後如下圖所示:

4、修改build.gradle文件,加上使用阿里雲倉庫,提高下載速度。

maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}

  

修改好之後如下圖所示:

 

準備構建

1、再次為了證明我是從零開始的,我把gradle的倉庫依賴截圖給大家看,gradle的本地倉庫依賴位置是C:\Users\admin.gradle\caches\modules-2\files-2.1或者D:\work\tools\gradle\gradle-6.4.1\caches\modules-2\files-2.1,具體位置看你自己的設置。我的倉庫現在是空的,沒有任何下載好的依賴,截圖如下: 

2、預編譯spring-oxm,根據import-into-idea.md要求,我們需要先預編譯spring-oxm和spring-core,使用命令./gradlew :spring-oxm:compileTestJava,構建速度和截圖如下:

 

3、同上,預編譯spring-core,使用命令./gradlew :spring-core:compileTestJava,如下圖所示:    

至此,準備工作就完成的差不多了,接下來我們需要導入到IDEA,繼續往下看。<br><br><br>

 

IDEA導入Spring源碼

1、下面開始使用idea導入Spring源碼,File -> New -> Project from Existing Souces… 

2、選擇spring-framework-master項目

 

3、選擇使用gradle編譯,點擊finish。 

 

4、可以發現IDEA會自動開始構建編譯spring源碼。 

 

5、不要着急,還有最後一步,選擇File -> Settings -> Gradle,如下圖所示調整: 

 

6、去給對象問候一聲,或者去抽根煙(吸煙有害健康),或者遠處眺望一會,稍安勿躁,等回來時發現,不要網上說的一個小時、40分鐘、20分鐘,只要8m22s就完成Spring源碼的構建編譯工作,怎麼樣?還可以吧? 

補充,這是另一個小夥伴按照我的方法后構建速度,9m3s。    

到這兒,使用IDEA+Gradle構建Spring5源碼就已經全部完成。

三、驗證

  實踐是檢驗真理的唯一標準,那麼怎樣驗證我們上面的構建是否成功呢,很簡單,寫個demo測試一下就好了,下面進入驗證過程。

1、在spring-framework-master項目下新建我們自己的測試module,如下圖所示: 

2、選擇使用gradle

3、輸入自己的module名

4、既然要驗證,那我們肯定需要依賴spring的模塊,我們在我們剛剛新建的模塊下build.gradle文件中修改使用阿里雲倉庫,同時依賴spring-context模塊。

implementation(project(":spring-context"))

修改后如下如所示:

5、刷新依賴,重新編譯,速度同樣飛快。 

6、我們先寫一個配置類

package com.mazhichu.spring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName: MazhichuConfig
* @Description: 配置
* @Author: Moore
* @Date: 2020-06-08 12:30
* @Version: V1.0
*/
@Configuration
@ComponentScan("com.mazhichu")
public class MazhichuConfig {
}

7、寫一個實體Bean

package com.mazhichu.spring.repository;

import org.springframework.stereotype.Repository;
/**
* @ClassName: Hello
* @Description: bean
* @Author: Moore
* @Date: 2020-06-08 12:30
* @Version: V1.0
*/
@Repository
public class Hello {
	public void hello(){
		System.out.println("Hello,ma_zhichu!");
	}
}

  

8、編寫測試類,運行,如下圖所示: 

總結

至此,使用IDEA+Gradle構建Spring5源碼並簡單調試的教程就到這兒,本文所有內容都來自本人親自實踐,如果對你實實在在有幫助,點贊就是最大的鼓勵,如果你在構建過程中遇到任何問題,也歡迎留言告訴我,我看到後會第一時間幫你解答。如果你期待更好的文章,歡迎關注我的公眾號“碼之初”,謝謝!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

[cpp]C++中的析構函數

C++中的析構函數

簡介

析構函數(Destructors),是對象的成員函數,沒有返回值也沒有參數,且一個類只有一個析構函數,當對象被銷毀的時候調用,被銷毀通常有這麼幾個情況。

  • 函數執行結束
  • 程序執行結束
  • 程序塊包含的局部變量
  • delete操作

什麼時候要自己寫析構函數?

編譯器會自動創建默認的析構函數,通常都沒有問題,但是當我們在類中動態分配了內存空間時,我們需要手段的回收這塊空間,防止內存溢出。就像這樣

class String 
{ 
private: 
	char *s; 
	int size; 
public: 
	String(char *); // constructor 
	~String();	 // destructor 
}; 
 
String::String(char *c) 
{ 
	size = strlen(c); 
	s = new char[size+1]; 
	strcpy(s,c); 
} 
 
String::~String() 
{ 
	delete []s; 
} 

私有的析構函數

可以將析構函數的訪問權限設置為private,設置時沒有問題的,但是一個問題就是,通常的手段就沒法調用析構函數了。

如下所示,程序結束后要調用析構函數,但是析構函數時私有的沒法調用,所以會編譯出錯。

#include <iostream> 
using namespace std; 
class Test { 
private: 
	~Test() {} 
}; 
int main() 
{ 
	Test t; 
} 

以下這樣不會有問題,因為沒有對象被建立,也不用析構

int main() 
{ 
    Test* t;                                          
} 

以下這樣也不會有問題,因為動態分配的內存需要程序員手段釋放,所以程序結束時沒有釋放內存,也沒有調用析構函數。這裏插一句,動態分配的內存如果不手動釋放,程序結束后也會不會釋放,但是現代操作系統可以幫我們釋放,因為這個動態分配的內存和這個進程有關,操作系統應該可以捕獲到這個泄露的內存從而釋放。(查資料看到的)

int main() 
{ 
    Test* t = new Test; 
} 

如果使用delete來刪除對象,會編譯出錯

int main() 
{ 
    Test* t = new Test;
    delete t;//編譯出錯,無法調用私有的析構函數 
}

可以利用Friend函數,進行對象的銷毀,因為Friend可以訪問私有成員,所以可以訪問析構函數。


#include <iostream> 

class Test { 
private: 
	~Test() {} 
	friend void destructTest(Test*); 
}; 

void destructTest(Test* ptr) 
{ 
	delete ptr; 
} 

int main() 
{ 
	Test* ptr = new Test; 
	destructTest(ptr); 

	return 0; 
} 

或者給類寫一個銷毀的方法,在需要銷毀的時候調用。

class Test { 
public:
    destroy(){delete this};
private: 
	~Test() {} 
};

那麼什麼時候需要使用私有的析構函數呢?當我們只希望動態分配對象空間(在堆上)時候,用私有析構,就防止了在棧上分配,因為在編譯階段就會出錯。

虛析構函數

當類用到多態的特性時候,使用虛析構函數。看如下的例子。

#include <iostream>
using namespace std;
class Base
{
public:
    Base(){
        cout << "Base Constructor Called\n";
    }
    ~Base(){
        cout << "Base Destructor called\n";
    }
};
class Derived1: public Base
{
public:
    Derived1(){
        cout << "Derived constructor called\n";
    }
    ~Derived1(){
        cout << "Derived destructor called\n";
    }
};
int main()
{
    Base *b = new Derived1();
    delete b;
}

例子里的析構函數都不是虛函數,當我們想用基類的指針來刪除派生類對象的時候,就出現了問題,“undefined behavior”,c++標準里規定,只由編譯器實現,通常這時不會報錯,會調用基類的析構函數。但這應該不是我們想要的,這會導致內存泄漏。所以要把析構函數置為虛函數。(msvc似乎不用給析構函數加virtual,默認就是虛的,gcc沒有默認還是要加的)

另外虛析構函數可以是純虛析構函數,但是要提供函數體,不然沒法析構,因為虛析構函數和一般的虛函數的overide還不一樣,虛析構函數要挨個執行,不提供函數體,會編譯出錯。

析構函數執行的順序

派生類,成員對象,基類這樣

class B
{public: virtual ~B(){cout<<"基類B執行了"<<endl; }
};

class D
{public:virtual ~D(){cout<<"成員D執行了"<<endl; }
} ;

class E
{public:virtual ~E(){cout<<"成員E執行了"<<endl; }
} ;

class A
{public:virtual ~A(){cout<<"基類A執行了"<<endl;}; 
};

class C:public A,B
{
    public:virtual ~C(){cout<<"派生類執行了"<<endl;};
    private:
        E e;
        D d;
};

int main()  
{  
    C *c;
    c=new C();
    delete c;
}   

結果為:

  • 派生類執行了
  • 成員D執行了
  • 成員E執行了
  • 基類B執行了
  • 基類A執行了

參考

  • [1]什麼時候使用虛函數https://stackoverflow.com/questions/461203/when-to-use-virtual-destructors
  • [2]析構函數https://www.geeksforgeeks.org/destructors-c/
  • [3]虛析構函數https://www.geeksforgeeks.org/virtual-destructor/
  • [4]純析構函數https://www.geeksforgeeks.org/pure-virtual-destructor-c/

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

Oracle調用Java方法(上)如何使用LoadJava命令和如何將簡單的Jar包封裝成Oracle方法

最近在工作中遇到了遇到了一個需求需要將TIPTOP中的數據導出成XML並上傳到FTP主機中,但是4GL這方面的文檔比較少最終決定使用Oracle調用Java的方法,在使用的過程中發現有很多的坑,大部分的博客只粗略的介紹了下導致耗費了很多時間,在這裏分兩個博文詳細的記錄一下這個功能,填一下坑,希望可以幫助到大家。

首先 每個Oracle版本對應的OJVM的版本是不一樣的我的Oracle 版本是 Database 11g Release 2 對應的是jdk1.6 所以寫Java代碼的時候要注意版本號,其次這個功能是默認關閉的所以需要先安裝OJVM,腳本安裝語法如下(使用sys用戶登陸sqlplus安裝):

安裝JVM運行環境

@?/javavm/install/initjvm.sql

卸載JVM運行環境

@?/javavm/install/rmjvm.sql

查詢OJVM是否安裝成功

SELECT * FROM DBA_REGISTRY WHERE COMP_ID = 'JAVAVM';

執行腳本時間比較長要耐心等待一會,安裝完成后需要根據Java文件類型來選擇導入語句
LoadJava參數有

  • -u(用於輸入用戶名及密碼)
  • -v(用於輸出詳細的反饋信息)
  • -resolve(對於沒有編譯的Java文件可以用resolve來編譯)
  • -f(不管之前是否已經導入過該Java類,都強制再次導入)

當導入Class文件時,可以用如下命令:

loadjava –u username/userpassword –v filename.class

當刪除Class文件時,可以用如下命令:

dropjava –u username/userpassword –v filename.class

當導入Java文件時,可以用如下命令:

loadjava –u username/userpassword –v -resolve filename.java

當刪除Java文件時,可以用如下命令:

dropjava –u username/userpassword –v filename.java

當導入jar文件時,可以用如下命令:

loadjava –u username/userpassword –v -resolve filename.jar

當刪除jar文件時,可以用如下命令:

dropjava –u username/userpassword –v -resolve filename.jar

如果是比較簡單的Java方法可以直接使用PL/SQL進行編寫,需要調用的方法必須是public static 修飾的(Java方法若需要用到其他價包,報ORA-29521找不到類的錯 將在下一個博客中說到)

create or replace and compile java source named JavaName as [Java代碼]

當使用這種方法的時候可以在PL/SQL 左邊的Java Sources 文件夾中找得到源碼並編輯,如果導入的是.Java或.Jar格式的就只能在Java Classes 文件夾中找得到並且不能用PL/SQL編輯.

如果導入正常的話使用下面的語句可以查詢當前用戶已經導入的Java類,查詢出來的狀態必須是”VALID”,否則Oracle則不能調用必須解決報錯信息重新導入才能調用

SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_TYPE LIKE 'JAVA%'

以上代碼都執行完成后就可以將Java代碼封裝成成Oracle 方法(function) ,存儲過程(Procedures) 這2個主要是返回值的區別 如果有返回值可以封裝成function ,沒有返回值可以封裝成Procedures,如果有多個返回值…emmmm Java沒有多個返回值=。= 我需要封裝成function則封裝的語句如下:

CREATE OR REPLACE FUNCTION FunctionName(str1  NVARCHAR2,
  str2   NVARCHAR2,
  str3   NVARCHAR2,
  str4  NVARCHAR2,
  str5   NVARCHAR2)
  RETURN NVARCHAR2 AS
  LANGUAGE JAVA NAME 'com/xxx/xxx/xxx/xxx.ClassName(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

這個語句需要注意2點其一就是Java方法的包名需要用“/”而分割類名用“.” 這個當時卡了很久算是一個坑,其二Java方法的傳入類型要和數據庫類型相對應例如: NVARCHAR2和String ,更詳細的對應關係可以看Oracle 官方的文檔

那如果需要傳入的是一大堆表數據呢? 其實這種類型對應並不支持複雜的類型,要想獲得複雜數據 需要在Jar包中加入JDBC包使用JDBC來建立查詢語句來獲取數據 獲取JDBC的Connection對象的時候可以可以這樣寫,不用寫數據庫鏈接名和賬號密碼,可以直接使用數據庫的連接。
Connection conn = DriverManager.getConnection(“jdbc:default:connection:”);

詳情也可以參照Oracle官方文檔中的這一單元:Using the Server-Side Internal JDBC Driver

本文主要介紹了如何導入和如何封裝Java方法,如果你的業務邏輯比較複雜需要用到第三方jar包來實現自己的業務邏輯,或者發生了ORA-29521: referenced name java/xxx/xxx/xxx could not be found錯誤那麼這些問題將在下一篇中說到。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

ABP (.Net Core 3.1版本) 使用MySQL數據庫遷移啟動模板項目(1)

最近要搭建新項目,因為還沒有用過.net core,所以想用.net core的環境搭建新項目,因為不熟悉.net core的架構,所以就下載了abp項目先了解一下。
但是自己太菜了,下載了模板項目,在啟動的過程中一波三折,其曲折真是無法用言語形容。(但是我沒有灰心!沒有什麼技術是在努力的情況下學不會的,是嘛)
在搜集信息的過程中,很多網友分享的資料都很有幫助,但是有一個問題的方法對於我這邊遇到的問題卻用不上,因為問題沒有得到解決。但是卻給了我不同的思路,從而讓問題得到解決,模板項目終於順利啟動。

先貼上我參考的帖子,正是因為有優秀的網友的分享,我才打開了abp模板項目的大門!(不多說了,遠程握手為敬吧,哈哈)

參考資料

ABP入門教程(一)啟動模版項目

ABP (.Net Core) 使用MySQL數據庫

按照參考資料的操作,只需要簡單幾步就可以把模板項目啟動起來,但是!不知道為何,任何新鮮的技術到了我這裏,就要費上N個步驟,花費九牛二虎之力,絞盡腦汁都還是一堆紅色報錯,滿屏紅讓我沮喪,讓我懷疑人生……

emmmm直接開始從步驟說起吧。

  1. abp模板下載

    abp模板下載

  2. VS2019打開項目解決方案(用VS2017應該也可以,不過要額外下載.net sdk 3.0安裝。)

  3. 找到【解決方案名.Web.Host】項目裏面的appsettings.json,修改數據庫連接字符串
    因為我本地的sqlserver沒有連接成功,缺配置工具,沒有選擇重裝。改換mysql配置。所以我的配置是

    "ConnectionStrings": { "Default": "server=localhost;uid=root;pwd=123;port=3306;database=ExtraModuleDb;" }

  4. 在【解決方案名.EntityFrameworkCore】用Nuget添加安裝引用(也可以參考上面的第二個鏈接,用命令執行)

    install-package pomelo.entityframeworkcore.mysql.design

    install-package pomelo.entityframeworkcore.mysql

  5. 在【解決方案名.EntityFrameworkCore】裏面找到DbContextConfigurer文件,修改數據庫配置連接

     `public static void Configure(DbContextOptionsBuilder<KYKWMSExtraModuleDbContext> builder, string connectionString)
     {
         builder.UseMySql(connectionString);
     }
    
     public static void Configure(DbContextOptionsBuilder<KYKWMSExtraModuleDbContext> builder, DbConnection connection)
     {
         builder.UseMySql(connection);
     }`
    
  6. 數據遷移

    最好先刪除【解決方案名.EntityFrameworkCore】下的【Migration】文件夾

    然後將【解決方案名.Web.Host】設為啟動項目,在程序包管理器控制台(Nuget控制台)里設定默認項目為EntityFrameworkCore。

    在程序包管理器控制台輸入命令: Add-Migration Init

    生成成功,會看到【解決方案名.EntityFrameworkCore】下的【Migration】文件夾下面多了三個文件。

    然後更新數據庫,abp會自動建庫。在程序包管理器控制台輸入命令: Update-Database -Verbose

    到了這裏呢,問題就來了,我正是被這個問題困擾了一個上午。

    好熟悉的錯誤:You have an error in your SQL syntax

    肉眼可見,datetime那裡帶了一個長度,而在mysql語句創建表的時候,datetime類型是不允許帶長度的。

    於是我的做法就是,手動把代碼裏面datetime(6)全部替換成datetime,再次在程序包管理器控制台輸入命令: Update-Database -Verbose

    但得到的結果仍然是You have an error in your SQL syntax。反覆操作 Add-Migration Init Update-Database -Verbose 后,依然沒辦法解決這個問題,我有一點無奈,同時有一點不甘心。我可是個老鳥啊,遇到未知的問題,解決問題的方式就只能是坐着嘆氣了么?! (肯定不是!)

    午休睡了一覺,下午起來接着解決這個問題。我看了一下,為什麼是添加 pomelo.entityframeworkcore.mysql 引用呢?這個產商不是官方Oracle的呢。以前的項目不都是添加MySql.Data嗎?帶着這個疑惑,於是我就嘗試着換 MySql.Data 去添加引用,添加引用的時候,發現它有一個EntityFrameworkCore的版本: MySql.Data.EntityFrameworkCore ,於是把兩個都安裝上。(一定是要兩個都安裝,只安裝 MySql.Data 是不完整的,至少在數據庫配置鏈接出錯的時候,是沒有提示,不知道應該改成UseMySQL才可用)

安裝好后,運行發現有報錯,原來數據庫配置連接裏面的MySql要大寫的才對。(其實報錯的時候會很疑惑,明明是MySql啊,為什麼不支持了呢?也不知道是要改大寫,把鼠標放上去選擇修復的時候,就變成大寫,錯誤就消失了。)

就這樣編譯成功!說明用官方的包也是可以用的!

接着重新重複第6步的命令:

刪除【Migration】文件夾下面的文件,在程序包控制台執行命令:

Add-Migration Init

Update-Database -Verbose

好了!看到表成功的在創建!

但是,不能開心太早!問題又來了!

字符串的長度太長了,最後一句提示varchar max length=65535。我還不知道這些代碼是怎麼生成的,要怎麼把最基礎的代碼改掉才不至於報低級的錯誤。所以在這裏我解決的方法就是手動去把【Migration】文件夾下面的文件,超出數據類型長度的全部手動修改。第一次沒有改全的,報一次錯改一次,後面基本都是數據類型長度超出的問題。全部改好了,再 Update-Database,最終數據庫成功創建好,項目也運行起來了。

emmmm,前端的因為還不太熟悉這種分離式的項目,vue.js還跑不起來,看不到整個項目的全貌。這裏就作為第一部分結束先。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

springboot mybatis plus多數據源輕鬆搞定 (上)

在開發中經常會遇到一個程序需要調用多個數據庫的情況,總得來說分為下面的幾種情況:

  1. 一個程序會調用不同結構的兩個數據庫。
  2. 讀寫分離,兩個數據結構可能一樣高,但是不同的操作針對不同的數據庫。
  3. 混合情況,既有不同的結構的數據庫,也可能存在讀寫分離的情況。

下面針對第一種情況,提供一個解決方案。

解決思路

因為兩個數據庫的功能和結構不一樣,所以可以根據功能和結構把DAO分為兩個package。然後再mapperscan中指定不同的package對接不同的數據源,即可達到多個數據源的共存。

配置yml中的數據源設置

spring:
  datasource:
    emanage:
      url: jdbc:mysql://127.0.0.1:3306/emanage?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&useAffectedRows=true
      username: root
      password: ******
      driver-class-name: com.mysql.cj.jdbc.Driver
    ehr:
      url: jdbc:mysql://127.0.0.1:3306/ehr?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&useAffectedRows=true
      username: root
      password: ********
      driver-class-name: com.mysql.cj.jdbc.Driver

為了不必要的干擾,我把druid數據源的配置部分給刪除了。

建立兩個datasource的配置

datasource1的 配置

@Configuration
@MapperScan(basePackages = {"com.emanage.ehr.mapper.emanage"},sqlSessionTemplateRef = "sqlTemplate1")
public class DataSourceConfig1 {
    @Bean(name = "datasource1")
    @ConfigurationProperties(prefix = "spring.datasource.emanage")
    public DruidDataSource druidDataSource1()
    {
        return DruidDataSourceBuilder.create().build();
    }


    @Bean(name = "sqlFactory1")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("datasource1") DruidDataSource dataSource)
            throws Exception
    {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/emanage/**Mapper.xml"));
        return factoryBean.getObject();
    }

    @Bean(name = "sqlTemplate1")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlFactory1") SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

datasource2的配置

@Configuration
@MapperScan(basePackages = {"com.emanage.ehr.mapper.ehr"},sqlSessionTemplateRef = "sqlTemplate2")
public class DataSourceConfig2 {
    @Bean(name = "datasource2")
    @ConfigurationProperties(prefix = "spring.datasource.ehr")
    public DataSource druidDataSource1()
    {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "sqlFactory2")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("datasource2") DataSource dataSource)
            throws Exception
    {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/ehr/**Mapper.xml"));
        return factoryBean.getObject();
    }
    @Bean(name = "sqlTemplate2")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlFactory2") SqlSessionFactory sqlSessionFactory)
    {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

兩個datasource的配置基本上一樣。就是建立datasource,sqlsessionFactory,sqlSessionTemplate的注入。然後通過mapperscan來指定具體什麼包採用什麼數據源。然後再對應包里就和以前單數據源一樣操作即可。

注意事項:

如果用myBatis, SqlSessionFactory 部分可以使用SqlSessionFactoryBean來生成。但是如果用mybatis plus一定要用MybatisSqlSessionFactoryBean 來生成SqlSessionFactory。否則會報錯 ,無法直接通過BaseMapper去調用查詢。
如果要再不同的包中混合上XML進行調用。需要在SqlSessionFactory的配置中設置factoryBean.setMapperLocations(resolver.getResources(“classpath*:mapper/ehr/**Mapper.xml”));

優缺點:

優點:
簡單,通過簡單的設置。就可以滿足大多數的情況。

  • 缺點 *:只適合多個數據源的結構完全不一樣,通過package可以分來的方式來調用,不能靈活的在一個package下面隨心所欲的調用數據源。

那麼問題來了:如果要在一個package下面,想調用哪個就調用哪個數據源怎麼辦呢?有時間了,下一篇文章寫寫另外的實現方式。

希望對初學者有價值,如果有疑問歡迎留言交流。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

Honda和GM發展氫燃料電池,最快2020生產

在鋰電池電動車發展趨穩定的現階段,也有另一派人支持發展氫動力燃料電動車。美國本田汽車(Honda)和通用汽車(GM)宣布將攜手發展氫動力燃料電池新系統,預計2020 年投產。

美國加州政策規定,自2018年起,各家汽車製造商要銷售一定比例之「零排放車」。看準美國對電動車需求將增加,兩公司於1月30日宣布,將共同出資成立公司,合作發展氫動力電池系統,廠址將設於通用美國密西根州的工廠內。而本田汽車目前於日本櫪木縣高根澤町的工廠,之後將逐步停產。

鋰電池電動車和氫燃料電動車各有其擁護者與利弊。雖然兩者都被列為「零汙染」汽車,但實際上鋰電池電動車環保與否還要追溯到發電的來源,而氫動力燃料電池則有甲烷和一氧化碳排放的疑慮。充電方面,電動車充電耗時;氫燃料補充速度和油槍一般,只是日後加氫站的設點還有待規劃,安全性的需求也更高。

本田和通用自2013年就已展開合作。本次協議各出資一半資金成立新公司,目標是降低氫燃料電池成本較高的難題,並在環保車競爭市場保有優勢。

(首圖來源:General Motors)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

受樂視影響,法拉第縮小工廠規模

根據路透社的報導,中國影視廠商樂視網旗下子公司,豪華電動車新創公司法拉第未來(Faraday Future),已經決定縮減在美國興建車廠的規模。組裝廠規模將由原來佔地300 萬平方英尺,大幅縮減至65 萬平方英尺,生產車款數量亦會由7 款大減至2 款。

報導指出,法拉第曾於2015 年表示,總投資金額達到13 億美元,在內華達州北拉斯維加斯的組裝廠年產可高達15 萬輛,而且2017 年底投產。不過根據目前的狀況顯示,法拉第目前該工廠得預定產能每年將少於1 萬輛,而且還必須延後到2019 年才開始正式量產。

由於受到前一段時間母公司樂視網財務困境的影響,法拉第工廠一度傳出高層離職、欠供應商貨款、甚至是停工歇業的消息。雖然,在母公司獲得人民幣168 億元的資金援助後,工廠重新啟動。不過,可能也是因為這樣的原因,使得樂事網不得不宣布縮小其工廠的規模與未來的生產能量。

在2017 年的CES 展上,法拉第推出首輛量產車款FF91 之後,由於具備高度智慧連網功能,以及搭載時下最熱門的自動駕駛技術。並且全車配備3D 雷達、10 個高感度相機、13 個長距離和短距離雷達以及12 個超聲波感測器,可以說性能超越市面上包括賓利、法拉利和特斯拉的所有電動車。但即便如此,分析師仍認為,法拉第FF91 的推出依舊是遠水救不了近火。

有統計指出,未來幾年內,樂視網在法拉第汽車上的資金缺口約在人民幣460 億元以上。而根據樂視網在2017 年1 月13 日發布的公告表示,引入包括融創中國在內的多家戰略投資,投資金額為人民幣168 億元的資金,則將汽車業務排除在外。換言之,樂事網的汽車豪賭,未來還需要再另籌資金。所以,在FF91 售價高達人民幣200 萬元,再加上樂視網資金仍有隱憂的情況下,法拉第工廠能不能順利在2019 年生產、上路,恐怕還有變數。

(合作媒體:。圖片出處:Faraday Future)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

必翔取得首款台產電動汽車生產執照

台灣的電動機車品牌Gogoro已經能從台北一路騎到高雄,還將進軍歐洲市場。而台灣首款本地生產的電動汽車也正式領取生產執照,將由在地廠商必翔集團負責產銷。

必翔集團在台成立三十餘年,早期曾投入農業機械研發,近期則以電動代步車、醫療用車等車款代工為主要業務。看好全球電動車市場蓬勃,必翔於2011年正式成立必翔電動汽車公司,並獲得中國廠商比亞迪(BYD)的肯定,合作發展電動汽車技術。

必翔在宜蘭縣建有電動汽車組裝廠,客戶行銷歐洲。日前,必翔已成功取得台灣首張電動汽車生產執照,預計將在今年第三季前量產問世。

除電動汽車公司外,必翔集團旗下另一子公司必翔電能為磷酸鋰鐵電池廠,廠房位於新竹,每月可生產100萬顆18650鋰鐵電池,集團整體可形成電動車產業的垂直整合。為提供日漸提升的電動車用電池需求,新竹廠房將陸續擴產到目前規模的10倍;公司也已申請掛牌上市,正在等待審核。

必翔集團也積極投入再生能源發展。必翔電動汽車的,由台灣永鑫能源負責開發、雲豹能源科技出資,完全採用美商First Solar的太陽能板,是First Solar在亞洲規模最大的屋頂型太陽能發電廠。

(照片:必翔公司廠房。來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

台灣盼衝電動車款,2017電動機車目標4萬輛

台灣有2,300萬人口與1,400萬輛掛牌機車,機車普及率極高。而電動機車在其中只佔6萬輛,還有龐大的市場空間。台灣政府希望提高電動車充電站的設置密度,藉此推動電動車需求成長,目標在今年銷售四萬輛、2021年達到20萬輛。

台灣在1999年開始推動電動機車,但整體市場需求在2015年本土品牌Gogoro加入後才逐漸明朗化。2016年,台灣電動機車的銷售量較2015年增加了一倍,達2萬輛,其中有1.3萬輛是Gogoro車款;其次則是中華汽車的電動機車,2016年銷量4,600輛。在需求類別方面,從自用車到物流、外送等,都有分布。

電動車充電設施若能廣泛鋪設,就能吸引更多駕駛加入電動車款行列,在世界各地都是不變的原則。台灣經濟部長李世光對此表示,未來將繼續推動電動車充電網絡建設,目標六都每1公里就設置一座電池交換站或充電站,同時也將加強偏鄉與觀光區的充電設施建設。

目前,台灣政府補助輕型電動機車每輛新台幣7,200元,重型電動機車每輛10,000元;各地方政府也有金額不等的加碼補助。優惠措施加上充電設施普及,預期將能更有效推動需求。2017年的銷售目標是較2016年再倍增的4萬輛

電動汽車銷量如何?先看Tesla

雖然台灣2016年電動機車的銷量達到2萬輛,但對比機車總銷量80萬輛而言,只佔2.5%,還有很大的發展空間。

而2016年台灣電動車市的另一大消息,非美商TESLA來台莫屬。Tesla電動汽車已經正式在台交車,一月有80輛完成交車手續,均為Model S。其中,又以 Model S 90D車款銷量最好。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化