基本データ型・参照型

基本データ型(プリミティブ型)

8つある。

  • boolean
    true / false

  • char
    1文字

  • byte
    -128〜127

  • short
    -32768〜32767

  • int
    -2147483648〜2147483647

  • long
    約-922京〜約922京

  • float
    浮動小数点数

  • double
    浮動小数点数

バイト数(メモリ使用領域)がそれぞれ決まっている。
具体的な「値」を格納するための変数を作るための型。
そのまま「値」が変数へ渡される。
nullを含まない。




参照型

基本データ型のように、値そのものを代入するのではなく、メモリ内の「その値が置いてある場所」を示すコードが変数へ代入される。
nullを含む。

JPAとは

Java Persistent APIの略。

Javaのオブジェクト世界とDBの世界を直接的につなげて、両間で自動変換を行う仕組み。
標準O/Rマッピングフレームワーク




特徴

  • JavaオブジェクトとDB・テーブルとの間の変換指定(マッピング指定)をアノテーションだけでできる。

  • Javaオブジェクトをそのまま読み書き・削除・検索できる。




要素

  • エンティティマネジャー(EntiytManager)
    エンティティを管理する。中心となる要素。

  • エンティティ
    DBのデータをクラスとして扱えるようにするためのアノテーション

  • 永続性コンテキスト
    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

と出てきてファイルを消せなかった。



解決法

  1. Project > Clean

  2. Projectファイルを右クリック

  3. Refresh




ファイルがProject内に表示されない

逆にファイルがProject内に表示されなくなった。



解決法

  1. File > Import > General

  2. 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) とは読み取り専用のトランザクション


トランザクション処理とは、
複数の処理を意味的に一つの処理として扱うこと。




Application(SampleDataJpaApplication.java

@EnableJpaRepositoriesは、JPAリポジトリを有効にするためのアノテーション