ざっくりJava〜通信、DB操作〜

#WEBページを表示させる

```java
import java.net.*;
import java.io.*;

URL url = new URL("http://sample.com"); //URLクラスをインスタンス化
InputStream is = url.openStream(); //データを取り出すストリームを取得
InputStreamReader isr = new InputStreamReader(is);
int data = isr.read(); //ストリームから１バイトずつ情報を取り出す
while(data != -1){
  System.out.print((char) data);
  data = isr.read();
  }
  isr.close();
}
```

#Socketを使ってWEBページを取得する
socketは低水準なAPI。ポート番号やヘッダ情報など細かく指定して通信する。
##TCP/IPを使って接続する
###必要な情報
相手のIPアドレス・・・ホスト名でもいい
相手のポート番号・・・相手に繋げるポート番号

```java
import java.net.*;
import java.io.*;

Socket sck = new Socket("google.com",80);
InputStream is = sck.getInputStream(); //socketから入力ストリームを取得
OutputStream os = sck.getOutputStream(); //socketから出力ストリームを取得
os.write("GET /index.html HTTP/1.0¥r¥n".getBytes()); //HTTP要求を送信
os.write("¥r¥n".getBytes());
os.flush();
InputStreamReader isr = new InputStreamReader(is);
int i = isr.read();
while(i != -1){
  System.out.print((char) i);
  i = isr.read();
}
sck.close(); //ソケットを閉じる
```

#ServerSocketを使う
指定したポート番号で待ち受けることができる。
複数相手から接続を待つ場合にはスレッドを使う。

```java
import java.net.*;

ServerSocket sv = new ServerSocket(29648); //引数に待ち受けるポート番号を指定
Socket sc = sv.accept();  //呼び出す。（ずっと待ち続ける）
sc.getOutputStream().write("Welcome".getBytes); //接続されたら応答
sc.getOutputStream.flush();
sc.close();

```

#DBを使う
JavaにはJDBCというデータベース操作専用のAPIがある。
これを使えば、DBの種類が変わっても都度コードを書き換える必要がない。
##仕組み

```
Javaプログラム　➡　JDBC API ➡　各DBドライバ（JARファイル）　➡　各DB
```
※JDBCドライバのJARファイルには必ずクラスパスを通す事

##使い方
```java
import java.sql.*; //java.sqlをインポートする

//事前準備をする
try{
    Class.forName("com.mysql.jdbc.Driver"); //JDBCドライバの有効化（MySQLの場合）
}catch(ClassNotFoundException e){
    e.printStackTrace();  //JDBCドライバJARファイルが見つからない場合の処理
}

Connection cn = null;
try{
String url = "jdbc:mysql://localhost/jdbctestdb"; //サーバ名とDB名を指定
String user = "testuser";
String password = "testpass";

  cn = DriverManager.getConnection(url, user, password); //接続の確立。引数は（JDBCのURL,接続ID、パスワード）

  /****************************
     DBの実際の処理を記述していく
  ******************************/

}catch(SQLException e){
  e.printStackTrace(); //接続やSQL処理失敗時の処理
}finally{
  try{
    if (cn != null){
      cn.close();
    }
  }catch (SQLException e2){
    // 例外処理
  }
}
```
※try-catchで自動的にガーベジコレクション（GC）がConnectionをクローズしてくれるが、いつGCが呼び出されるかわからないので、ちゃんとcloseしておく。

##DBの実際の処理

```java:更新系
//1.SQLのひな形作成
PreparedStatement stmt = cn.prepareStatement("DELETE FROM SAMPLETABLE WHERE ID <= ? OR NAME = ?");

//2.ひな型へ値を流し込んで送信
stmt.setInteger(1,10);
stmt.setString(2,"きむ");
int r = stmt.executeUpdate();

//3.処理結果を判定
if(r != 0){
  System.out.println(r+"件を削除しました。");
}else{
  
}

```

```java:検索系
//1.SQLのひな形作成
PreparedStatement stmt = cn.prepareStatement("SELECT * FROM SAMPLETABLE WHERE ID <= ?");

//2.ひな型へ値を流し込んで送信
stmt.setInteger(1,10);
ResultSet rst = stmt.executeQuery();  //executeQueryで送信し、ResultSetインスタンスで取得

//3.処理結果を処理
while(rst.next()){ //nextで結果を１行ずつ取得していく
  System.out.println(rst.getString("NAME")); //文字列を取得する場合はgetString
}
}
```

##トランザクション

```java
import java.sql.*; 

try{
    Class.forName("com.mysql.jdbc.Driver"); 
}catch(ClassNotFoundException e){
    e.printStackTrace();  
}

Connection cn = null;

try{
String url = "jdbc:mysql://localhost/jdbctestdb"; 
String user = "testuser";
String password = "testpass";

  cn = DriverManager.getConnection(url, user, password); 

　cn.setAutoCommit(false); //手動コミットモードにする

  /****************************
     DBの実際の処理を記述していく
  ******************************/

  cn.commit(); //コミットした時点でそれまでのSQLがすべて送信される

}catch(SQLException e){
  e.printStackTrace();
  try{
    cn.rollback(); //エラーになったらそれまでのSQL実行をすべて戻す
  }catch(SQLException e2){
    e2.printStackTrace(); //ロールバック失敗時の処理
  }
}finally{
  try{
    if (cn != null){
      cn.close();
    }
  }catch (SQLException e2){
    // 例外処理
  }
}
```

#ヒープとスタック
javaを実行するのはJVM。
JVMはOSから割り当ててもらったメモリ領域をやりくりしながらプログラムを実行している。
メモリ領域は用途によって「ヒープ」と「スタック」の２種類がある。
newされた時にはヒープ領域の１部が割り当てられる。
もし、膨大な量のメモリを消費するアプリケーションの場合、ヒープ容量が不足する場合がある。
そうすると、newしようとしても「OutOfMemoryError」というエラーが発生して強制的にプログラムが停止してしまう。
その場合は、自分でヒープ領域を設定できる。

#ガベージコレクション（GC）
不要なインスタンスを解放するのがガベージコレクション。
無駄なヒープを解放して領域を増やすが、ヒープ領域自体が大きすぎるとGCが無駄なゴミを探すのが大変になり、その分時間がかかってしまい、重くなる。
GCが起動している間は、全ての処理が完全に一時停止する。
GCは「どの変数にも参照されていないインスタンス」を解放する。
ヒープが解放されずに溜まっていくとメモりリークにつながり、フリーズ状態が頻発する．
必ず、使わなくなったインスタンスは明示的に破棄した方が良い。


#その他
##ライセンスの種類
お金のかからない「オープンソースソフトウェア」とお金のかかる「商用」があるが、
オープンソースの中でもライセンスがいくつかある。
「フリーソフト＝何しても自由」なわけじゃない

```
GPL , LGPL ・・・GPL系ライセンスといわれ、このライセンスを使って開発したソフトにはソースコード公開とGPLライセンスにする必要がある。　
BSD , MIT ,Apache　・・・　BSD系ライセンスといわれ、著作権表示など行えば後は自由。
PublicDomain ・・・　何しても良い。自由。
```