基本データ型・参照型
基本データ型(プリミティブ型)
8つある。
boolean
true / falsechar
1文字byte
-128〜127short
-32768〜32767int
-2147483648〜2147483647long
約-922京〜約922京float
浮動小数点数double
浮動小数点数
バイト数(メモリ使用領域)がそれぞれ決まっている。
具体的な「値」を格納するための変数を作るための型。
そのまま「値」が変数へ渡される。
nullを含まない。
参照型
基本データ型のように、値そのものを代入するのではなく、メモリ内の「その値が置いてある場所」を示すコードが変数へ代入される。
nullを含む。
JPAとは
Javaのオブジェクト世界とDBの世界を直接的につなげて、両間で自動変換を行う仕組み。
標準O/Rマッピングフレームワーク。
特徴
要素
エンティティマネジャー(EntiytManager)
エンティティを管理する。中心となる要素。永続性コンテキスト
EntiytManagerの配下にあり、エンティティの状態を表す。
EntiytManagerがエンティティを受け取り、様々なDB処理を一括して行う。
EntiytManagerで用意されてる基本的なメソッド
- persist(新規登録)
- merge(更新)
- remove(削除)
- find(検索)
永続性コンテキストとは
インスタンスは、プログラムが終了すると、同時にすべて消滅する。 なぜ?→laravelわからなかったところまとめメモ - プログラミングMEMO
例えば、文書作成プログラムがあり、入力した文書(インスタンス)が、プログラム終了と同時に消滅してしまう。
そこで、インスタンスの状態を半永久的に保存し、いつでも復元できるようにすることが必要となる。このことを永続化という。
生成したインスタンスの保存 = 永続化
EntiytManagerのメソッドで操作したエンティティは一旦、永続性コンテキストに配置される。
例えば、エンティティに対して新規登録の操作をしても、その時点ではDBへ書き込みはされず、「このエンティティはDBに新規登録するデータだよ」というマークをつけて永続性コンテキストに配置はれるだけ。
これが、オブジェクトの永続化になる。
EntiytManagerによって、DBへの格納が可能になった状態であることを意味する。
O/Rマッピング(O/Rマッパー)
オブジェクト(Object)のそれぞれのデータを、リレーショナルデータベース(RelationalDatabase)のレコードを構成する個々の項目に関連付ける仕組みのこと。
Eclipse Clean・Refreshの役割
前の記事でわからなかったことを調べてみました。
Clean(クリーン)
クリーンビルドのこと。
修正・ビルドを繰り返している場合、ビルドを行った時点では、修正していないソースはコンパイルされない。そのため、すべてのソースコードをコンパイルし直す際にクリーンを行う。
javaのclassファイルなどの成果物を削除して、コンパイルし直す。
Refresh(リフレッシュ)
Eclipse外で中身を変更した時、それをEclipse内に反映させたい時などに使う。
ついでに出てきた用語説明
ビルド
書いたプログラムを本番環境で動作させるまで。
ソースなどから最終的な実行ファイルを作成する。
デプロイ
コンパイルしたプログラムやclassファイルなどをwebサーバー上に配置して、クライアントから実行可能な状態にすること。
SpringBoot DB接続 つまずき
エラーで、NullPointerExceptionが出てきた。
原因は、planRepositoryがnullだから。
@Autowiredでインジェクションされてない?
気づいたら、planRepositoryが@Autoworedになっていた!あらまぁ。
しかし、NullPointerExceptionのエラーは健在。
解決方法
PlanServiceImpl.javaの
this.planRepository = planRepository;
と
TopTableController.javaの
PlanService planService = new PlanServiceImpl();
を削除。
NullPointerExceptionエラーは出なくなった。
java.sql.SQLSyntaxErrorException: Unknown column 'planinfo0_.adopt_sign' in 'field list'
と、新たなエラー。
解決方法
PlanInfo.javaに
@Table(name = "テーブル名")
を追加したら解決。
これは、エンティティ名と実テーブル名が異なる時に入れるもの。
さらに、新たなエラー。
Loading class `com.mysql.jdbc.Driver'. This is deprecated.
解決方法
application.propertiesのdriverClassNameを
com.mysql.cj.jdbc.Driver
に変更。
SLLがどーたらっていうエラー登場。
解決方法
application.propertiesのurlに
?useSSL=false
を追加。
DIコンテナ・@Autowired・@Component
DIコンテナ
DIとは「Dependency Injection」を省略したもの。意味は「依存性の注入」。
DIは、オブジェクト間の依存関係を作成する。
依存関係とは、クラス外でインスタンスを生成して、外から渡すこと。
DIコンテナとは、DIした時に、毎回依存性のあるものを生成、注入、生成... という繰り返しをなくすために、
その依存性を定義して、コンテナという形で保存しておけば、
コンテナを渡すだけで、依存関係が整っているものをGetできる仕組み。
つまり、Diコンテナ = DIした依存関係が管理されたもの。
@Autowired
直訳すると「自動紐付け」。
インジェクションしてもらうための設定。
DIコンテナがその変数の型に代入できるクラスを、@Componentの付いているクラスから探し出し、インジェクション(注入)してくれる。
普通、DIはどのフィールドにどのBeanを代入するかを設定によって明示する必要があるが、
@Autowiredを使うと、DIすべきBeanを自動的に判断して代入してくれる。
@Autowiredと@Componentはセット。
@Component
インターフェイスに対応した実クラスをコンポーネント化(部分化)。
DIコンテナにbeanとして登録したいクラスへ付与する。
@Component = bean定義を省略する
@Autowired = DIコンテナからbeanを引っ張り出して注入する
Eclipse 小さい解決編
ファイルが消せない
Eclipseでファイルを消去しようとしたら、
Resource is out of sync with the file system
と出てきてファイルを消せなかった。
解決法
Project > Clean
Projectファイルを右クリック
Refresh
ファイルがProject内に表示されない
逆にファイルがProject内に表示されなくなった。
解決法
File > Import > General
Existing Projects into Workspaceを選択
ロードできないというエラー
SpringBootを起動させようとしたら、
Applicationが見つからないか、ロードできない
とエラーが出てきた。
解決法
Project > Clean
で解決した。
なんでだろ?
SpringBoot DBの利用
pom.xmlに以下のコードを追加。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.2</version>
</dependency>
エンティティクラスの作成(City.java)
@がつくのはアノテーションと呼ばれる。
PlanInfo.javaに@Entityを加える。
@EntityはDBのデータをクラスとして扱えるようにする。
@Idは、プライマリキーを意味する。
@GeneratedValueは、値を自動的に生成してくれる。
@Columnは、このメンバ変数はテーブルのこの列に対応していますよ、という意味(name=で実際の列名を指定する)。
nullable=falseをつけると NOT NULLの意味になる。
DBの情報に「Null」がNoになっていたら、false。
Yesだったら、true を指定する。
ex)@Column(name="START_DATE")
implementsされているSerializableとは、保存可能なオブジェクト。
private static final long serialVersionUID = 1L;
は、「シリアルバージョンUID」というもの。
シリアライズ = オブジェクトを保存すること。
デシリアライズ = 再読み込みする機能。
デシリアライズする際に、変更されている可能性がある(保存→再読み込み の間に変更があるかも)。
そこで、保存する際に、UIDを保存→再読み込みされた時のUIDを取得→両者比較→異なった時に例外を投げる
エンティティクラスを作成するには、
@Entity
@Id
public ~() {}
の三つがセットになる。
JpaRepositoryインターフェイスの作成(CityRepository.java)
extends JpaRepository<扱うエンティティクラス, プライマリーキーの型>
このインターフェイスの中には基本的に何も入れない。
JpaRepositoryは、データベースにアクセスするために必要らしい。
Controllerをいじる(SampleController.java)
@Autowired private PlanService planService;
@Autowiredは、自動で初期化されるフィールド。
コンストラクタやフィールドの右辺に、フィールドの初期化処理を書かなくてよくなる?
@ResponseBodyとは、戻り値で直接レスポンスのコンテンツを返すことができる。
つまり、これがついてるメソッドにアクセスしたら、レスポンスが返ってくるということ。
ちなみに、
@RestController = @Controller + @ResponseBody
と、いうことらしい。
@Transactionalは、宣言的にトランザクション制御を記述できる。
(readOnly = true)
とは読み取り専用のトランザクション。
トランザクション処理とは、
複数の処理を意味的に一つの処理として扱うこと。