2021年9月11日 星期六

2021年8月9日 星期一

slf4j 搭 log4j2 並進行基本操作

利用 slf4j 搭配 log4j2 進行基本操作,主要展示輸出到 console 和輸出到檔案兩種方式

2021年8月2日 星期一

建立一個最基本的 mybatis

在 maven 專案下建立 mybatis,並完成對資料庫的新增/查詢/修改/刪除動作

2021年7月28日 星期三

透過 ojdbc6 連 oracle,並進行基本操作

建立一個 maven 的專案,設定 pom.xml 的 dependency,利用 maven 下載 ojdbc6 的函式庫,並透過 ojdbc6 連入 oracle 完成 INSERT/UPDATE/SELECT/DELETE 基本操作

2021年6月3日 星期四


在 OracleLinux 上安裝 oracle database (19c)

    oracle 是透過 oracle-database-preinstall 和 oracle-database-ee 的

    rpm 安裝,所以會少掉很多設定的地方,像是環境變數,新建 linux 的 group 和

    user 之類的部份。


環境:


    y04 是 linux 使用者的 id


    在 VMWare 下新安裝的 OracleLinux (OracleLinux-R8-U4-x86_64-dvd_iso)

    已安裝 JAVA JDK


    用到的檔案,下載到 \home\y04\Downloads,這個位置


        compat-libcap1-1.10-7.el7.x86_64.rpm

        

            http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm

        

        compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm


            http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libcap1-1.10-7.el7.x86_64.rpm


        oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm


            https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm    


        oracle-database-ee-19c-1.0-1.x86_64.rpm


            oracle 官網自行下載


過程(安裝 database)


    透過內建的 firefox 把下列檔案抓回來


        oracle database 要用到的套件


            http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm

            http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libcap1-1.10-7.el7.x86_64.rpm


        oracle preinstall 會幫忙處理一些新增 group 和 user 的動作


            https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm    

        

        oracle database 本體,直接到 oracle 官網自行下載


            oracle-database-ee-19c-1.0-1.x86_64.rpm


    以下所有操作均在 terminal 下執行


    關防火牆


        systemctl stop firewalld.service


    關防火牆的自動啟動


        systemctl disable firewalld.service


    檢查關閉狀態


        systemctl status firewalld.service

        dead 表示未啟動開啟啟動、inactive 表示現在是關閉


    安裝相依套件


        sudo yum install libstdc++-devel ksh glibc-devel libaio-devel


        sudo yum localinstall /home/y04/Downloads/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm


        sudo yum localinstall /home/y04/Downloads/compat-libcap1-1.10-7.el7.x86_64.rpm


    安裝 oracle database preinstall

    

        sudo yum localinstall /home/y04/Downloads/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm


    配置 oracle 帳號的環境變量 (preinstall 會在 linux 新增一個名字叫 oracle 的帳戶)


        su - root           //切換到 root 帳號

        passwd oracle       //重設 oracle 密碼為 123


        su - oracle         //切換到 oracle 帳號

        vi ~/.bash_profile  //用 vim 開 .bash_profile


        確認下面設定有在 .bash_profile


            export ORACLE_BASE=/opt/oracle

            export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1

            export PATH=$ORACLE_HOME/bin:$PATH

            export ORACLE_SID=ORCLCDB

            #防止安裝過程出現亂碼

            export LANG=en_US.UTF-8

            #設定Oracle使用者端字元集,必須與Oracle安裝時設定的字元集保持一致,

            export NLS_LANG=AMERICAN_AMERICA.AL32UTF8


        su - root //切換到 root 帳號


    安裝 oracle database


        sudo yum localinstall /home/y04/Downloads/oracle-database-ee-19c-1.0-1.x86_64.rpm


    配置腳本 (簡單檢查一下腳本內容,可以略過)


        su – root 

        cd /etc/init.d/

        vi oracledb_ORCLCDB-19c 


    執行腳本前置 (執行腳本之前的動作,主要是應對一些執行腳本過程中可能發生的問題)


        對應「java.library.path 系統變數遺漏或無效」

        (The java.library.path system variable is missing or invalid. Please set java.library.path with a correct value and retry the operation.)


            yum install libnsl


        對應「檔案 "/etc/oratab" 無法存取.」

        (File "etc/oratab" is not accessible)


            這個異常好像不會中斷腳本的執行

            解法參考(https://www.cnblogs.com/datalife/archive/2011/03/15/1985253.html)


            原因是安裝 oracle database 的時候,少 執行一個 root.sh


                cd /opt/oracle/product/19c/dbhome_1/

                ./root.sh


    執行腳本

        

        su – root

        cd /etc/init.d/

        ./oracledb_ORCLCDB-19c configure


重開機


過程(建立 database 到 client 可連入)


    改 listener.ora 為允許 client 連入


        修改 listener.ora 的內容,將原本的

        listener.ora 的位置應該在 \opt\oracle\product\19c\dbhome_1\network\admin


            LISTENER =

            (DESCRIPTION_LIST =

                (DESCRIPTION =

                (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

                )

            )

        

        改成


            LISTENER =

            (DESCRIPTION_LIST =

                (DESCRIPTION =

                (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))

                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

                )

            )


        然後啟動或重啟 listener


            lsnrctl status  //oracle database listener 查詢狀態

        >   lsnrctl start   //oracle database listener 啟動

            lsnrctl stop    //oracle database listener 停止

        >   lsnrctl reload  //oracle database listener 重啟


    啟動及設定 oracle


        su - oracle

        sqlplus / as sysdba


            --啟動 database

            --未啟動的錯誤 ORA-01034: ORACLE not available

            SQL>startup;

            SQL>alter database open;

            SQL>exit;


            --修改 datbase 的 sys 和 system 這兩個使用者的密碼,都改成 abc

            SQL>alter user system identified by "abc";

            SQL>alter user sys identified by "abc";


            --查當前 sid

            SQL>select instance from v$thread;                           --return ORCLCDB

            or

            SQL>select * from v$version;

            SQL>select sys_context('userenv','instance_name') from dual; --return ORCLCDB


    到這步應該外部就可以連入


        測試用的軟體 (DBeaver)

        host: 192.168.1.113                 //看你自己的 linux ip

        port: 1521                          //oracle default

        database (=sid=service): ORCLCDB    //前面步驟查的

        username: system                    //內建的

        password: abc                       //前面設的


    到這邊如果都順利的話就可以連入 oracle database 中了,接下來就是建立自己要用的測試資料庫


        su - oracle

        sqlplus / as sysdba

        

        -- 確認 database 啟動了

        SQL>startup;

        SQL>alter database open;        --or SQL>alter pluggable database all open;

        


        SQL>select * from v$version;                              --先查當前版本,讓 dual 有東西

        SQL>select sys_context ('USERENV', 'CON_NAME') from dual; --知道當前容器在 CDB$ROOT 


        SQL>select pdb from v$services;              --查有那些 pdb,應廳會有一個 ORCLPDB1

        or

        SQL>show pdbs;


        SQL>alter session set container=ORCLPDB1;   --把 session 指定到 PDB


        SQL>alter database open;

        SQL>create user y04 identified by "y04";    --在當前 session 中建立一個 y04 且密碼為 y04 的帳號

        SQL>grant dba to y04;                       --設定 y04 的資料庫權限,正常是不會直接給 dba 這個權限,不過我還不熟,先這樣吧


    然後外部就可以用 y04 了,一樣外部用 DBeaver 連入


        測試用的軟體 (DBeaver)

        host: 192.168.1.113                 //看你自己的 linux ip

        port: 1521                          //oracle default

        database (=sid=service): orclpdb1   //就是pdb,因為剛剛已經把 session 切到這個 pdb 了,所以要改用這個

        username: y04

        password: y04


    註1 本機 sqlplus 登入 y04 的方式


        sqlplus 帳號/密碼@host/database(=sid=service)

        sqlplus y04/y04@localhost/orclpdb1


    註2 .base_profile


        #oracle資料庫安裝目錄

        export ORACLE_BASE=/opt/oracle

        #oracle資料庫路徑

        export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1

        #oracle啟動資料庫範例名

        export ORACLE_SID=ORCLCDB

        #xterm視窗模式安裝

        export ORACLE_TERM=xterm

        #設定時間格式

        NLS_DATE_FORMAT="YYYY:MM:DDHH24:MI:SS"

        #新增系統環境變數

        export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH

        #新增系統環境變數

        export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

        #防止安裝過程出現亂碼

        #export LANG=en_US.gbk

        export LANG=en_US.UTF-8

        #設定Oracle使用者端字元集,必須與Oracle安裝時設定的字元集保持一致,

        export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

2018年6月21日 星期四

Swashbuckle (3) 顯示 webapi 方法上 xml 的摘要

設定在 swagger 頁面顯示的 xml 摘要資訊

環境:vs2017、.net framework 4.7、Swashbuckle 5.6.0

首先建立好一個 WebApi 專案和透過 Nuget 裝好 Swashbuckle,並且透過
http://localhost:xxxxx/swagger 能夠進到 Swashbuckle 的頁面。

本篇的目的在於讓 Api 上面的 xml 註解中的資訊出現在 swagger 的頁面上

在安裝好 swashbuckle 後開啟 App_Start 中的 SwaggerConfig.cs,這個檔案
應該在 Nuget 安裝好 Swashbuckle 時就自動產生。

取消 SwaggerConfig.cs 中的下面這一行的註解

    c.IncludeXmlComments(GetXmlCommentsPath());

在同一個 Class ( public class SwaggerConfig ) 下增加方法

   
 internal static string GetXmlCommentsPath()
 {
   //透過設定專案的屬性,設定在建置後生成 XmlDocument.xml,
   //此處是設定 Swagger 參考這份 xml
   return string.Format(@"{0}\App_Data\XmlDocument.xml",
   System.AppDomain.CurrentDomain.BaseDirectory); 
 }

圖上刪了很多原本是註解掉的部份



設定專案屬性,右鍵點專案 > 專案屬性 > 建置頁籤 > 輸出

有一個 XML 文件檔案,勾選並設定檔案的路徑,這個路徑需要和前一步設定
的 XML 路徑對應。


WebApi 的例子
  
/// <summary>
/// 人員
/// </summary>
public class Person
{
    /// <summary>
    /// 人員名稱
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 人員年紀
    /// </summary>
    public int Age { get; set; }
}

/// <summary>
/// 錯誤狀態
/// </summary>
public class ErrorStatus
{
    /// <summary>
    /// 狀態代碼
    /// </summary>
    public string StatusCode { get; set; }
    /// <summary>
    /// 狀態描述
    /// </summary>
    public string Description { get; set; }
}

 
public class PeopleController : ApiController
{
   /// <summary>
   /// 取得人員資料
   /// </summary>
   /// <remarks>
   /// 取得人員資料 api 的補充說明
   /// </remarks>
   /// <param name="id">人員 Id</param>
   /// <response code="200">成功</response>
   /// <response code="404">找不到</response>
   /// <response code="500">內部伺服器錯誤</response>
   [ResponseType(typeof(Person))]
   public IHttpActionResult Get(string id)
   {
      return Ok(new Person());
   }
}

如果設定了 [ResponseType(typeof(Person))] 因為他預設是在 Http Status 200
的時候所回傳的類別,所以需要同時設定 <response code="200">成功</response>
才會正常顯示 [ResponseType(typeof(Person))] 的部份

在傳入值或回傳值,切換到 Model 下時會顯示定義在 DataModel 上的 <summary> 訊息

執行專案,然後接下來進到 Swagger 頁面就可以看到 webapi 上設定的 xml 註解的資訊


在比較新版的 Swashbuckle 中,可以利用 SwaggerResponse 這個 attribute 來取代
<response code=""></response>

 
public class PeopleController : ApiController
{
  /// <summary>
  /// 取得人員資料
  /// </summary>
  /// <remarks>
  /// 取得人員資料 api 的補充說明
  /// </remarks>
  /// <param name="id">人員 Id</param>
  [SwaggerResponse(HttpStatusCode.OK, Description = "成功", Type = typeof(Person))]
  [SwaggerResponse(HttpStatusCode.NotFound, Description = "找不到")]
  [SwaggerResponse(HttpStatusCode.InternalServerError, Description = "內部伺服器錯誤", Type = typeof(ErrorStatus))]
  [ResponseType(typeof(Person))]
  public IHttpActionResult Get(string id)
  {
    return Ok(new Person());
  }
}