デバック

コード左端ダブルクリックでブレークポイント

 

変数の中身をチェック

 

・再開:次のブレークポイン行へ進むか、ブレークポイント行がなければ終了

 

・中断:ブレークポイント行で止まっているときはこのボタンが有効に

 

・終了:実行(デバック作業)を終了する

 

・ステップ・イン:メソッドの内容を確認するときなどに使用

 

・ステップ・オーバー:ブレークポイント行の有無に関係なく1行先に進む

 

・ステップ・リターン:メソッドから抜ける

 

・フレームにドロップ:現在のメソッドの先頭行に戻る

 

・ステップフィルターの使用:ステップ実行で特定のクラスやパッケージに進まない
↑細かいデバッグするならいるんだろうけど使う未来を思いつかない

変数の欄から右クリックでウォッチに入れると式の欄からトレースできる

 

変数の欄から値を代入できる。デバッグを停止したらクリアされる

Controller

@Controller←アノテーションつければok

public class MainController {}
(JSONXML などを返す WebAPI 用の Controller などには@RestControllerを使う)

@RequestMapping("/")は万能らしい?(一般的には特定のURLリクエストに対してマッピング)

@GetMappingと@PostMappingはGetとPost専用になる

 

public ModelAndView index(ModelAndView mav) {

mav.setViewName("index");←ファイル名指定

int a = 50, b = 100;

int ans = a + b;

mav.addObject("ans", ans);←ansという名前に変数ansを登録。th:text=${ans}で取れる

return mav;

}

 

 

サンプルコード

package com.example.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    @RequestMapping("/signUp")
    public ModelAndView formUser(@ModelAttribute("formModel")User user, ModelAndView mav) {
    	mav.setViewName("signUp");
    	mav.addObject("user", user);
    	return mav;
    }

    @RequestMapping(value = "/signUp", method = RequestMethod.POST)
    public ModelAndView createUser(@ModelAttribute("formModel") @Validated User user, BindingResult result ,ModelAndView mav) {
    	mav.setViewName("signUp");
    
    	if(!result.hasErrors()) {
    		userService.saveUser(user); // ユーザー情報をデータベースに保存
    		mav.addObject("user", user);
    		System.out.println("登録成功");
    	} else {
    		System.out.println("登録失敗");
    	}
        
        return mav; 
    }
}

| |<



>|Java|
package com.example.sample;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;


@Entity
@Table(name="users")
public class User {
	
	@Id
	@Column
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@NotNull
	private int id;
	
	@Getter
	@Setter
	@Column(name= "user_name", length = 255, nullable = false)
	@NotNull
	@NotBlank
	private String userName;
	
	@Getter
	@Setter
	@Column(length = 255, nullable = false)
	@NotNull
	@NotBlank
	private String password;
	
}

| |<

>|Java|
package com.example.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User saveUser(User user) {
        return userRepository.save(user); // ユーザー情報をデータベースに保存
    }
    
    public Iterable<User> getAllEntities() {
        return userRepository.findAll();
    }
}

spring まとめ

必要なもの
Eclipseオールインワン

MySQL

新規からspringスタータープロジェクト

・Spring Web
・Thymeleaf

・Validation

・Spring Security

・Spring Data JPA

MySQL Driver

Lombok

 

application.propertiesに↓記載

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://ホスト名/データベース名
spring.datasource.username=ユーザ名
spring.datasource.password=パスワード
spring.datasource.sql-script-encoding=utf-8
spring.jpa.database=MYSQL
spring.jpa.hibernate.ddl-auto=none

 

ValidationMessages.propertiesファイルを作成
jakarta.validation.constraints.ヴァリデーション名.message = 警告文

 

-ControllerClass-

RequestMappingでurl毎の処理

 

-Model-

MySQLをSpring Data JPAでつなぐ

EntityClass

ServiceClass

RepositoryInterface (JpaRepositoryをextends)

 

-View-

ThymeleafテンプレートとHTML,CSS,JavaScriptでがんばろ

 

入力内容チェック

Validationで整合性チェック。JavaScriptは送信前に不適切だったら通知する。

 

build.gradle
dependencies {} パッケージ追加時はこの中へ

 

 

 

 

 

 

 

 

spring

MySQLにデータベース、テーブル作成
CREATE DATABASE データベース名;
CREATE TABLE users (id int(11) AUTO_INCREMENT PRIMARY KEY, userName VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

アプリケーションプロパティに
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://ホスト名/データベース名
spring.datasource.username=ユーザ名
spring.datasource.password=パスワード
spring.datasource.sql-script-encoding=utf-8

Lombokはキャメルケースを期待し、jpaはスネークケースを期待する

Bindingresultは他もインスタンス割り当てしてないとエラー

 

jakarta.validation.constraints.NotBlank.message = 空白は認めません!
.messageがいる

書き込み式SQLメモ

CONCAT('追加する名前', カラム名) 
DATE_FORMAT(カラム名, '&y年%m月%d日') アルファベットを大文字にすると英語、小文字にすると日本的
ROUND(値, 切り捨てる小数点以下桁) 小数点以下全てならそこ省略可

ORDER BY の後複数の項目について降順で並べる場合 DESCはその数だけ必要

GROUP BYした項目に条件を付けるときはWEHER句ではなくHAVING句

比較演算子の左辺は必ず集計列

集計列を取り出すときに対応するカラムも一緒に取り出す

WHEREは普通の条件、HAVINGはグループの条件

COUNT(*)と(カラム名)は非NULLを数えるか数えないかの違い

複数のカラムでグループ化すると両方満たすものがグループ

CASE WHEN 条件式1 THEN 値1 WHEN 条件式2 THEN 値2 ELSE 値3 END

CASE (集計)列 WHEN 条件式1 THEN 値1 WHEN 条件式2 THEN 値2 ELSE 値3 END

CASEは演算子なので前に, がいる。上から条件に当てはまらなかったら下にいく。

FROM テーブル1名 AS テーブル1略名 INNER JOIN テーブル2名 AS テーブル2略名 ON テーブル1名.列名=テーブル2.列名2  内部結合

結合する条件の列名が同名ならONではなくてUSING(列名)でもいい

INNER JOIN などは複数テーブルでも入れ子でできる

WHERE 列名 演算子 (サブクエリ) サブクエリはWHERE限定というわけではない

FROM句にサブクエリを使う場合、それにASでエイリアスをつける必要あり 

ビューの定義 CREATE VIEW 名前 AS サブクエリで仮想テーブル(ビュー)をつくって結合する

AVGなど集計関数を直接使って比較はできない。サブクエリで結果を返してからメインクエリで比較する。

EXISTSの使い方????????????????

INとEXISTSの違い INはカラム指定する値を返し、EXISTSはカラム無指定真偽を返す

SELECT 命令1 UNION SELECT 命令2 列の数とデータ型は等しくする。合わないならNULLを足して記述。 
ORDER BYはソートキー名が合わない場合があるので数字でする。これはUNIONじゃなくてもできるが分かりづらいので非推奨 
重複は排除される。重複チェックをせずに全て出すのはUNION ALL

EXCEPT 差
INTERSECT 共通

INSERT INTO テーブル名 VALUES (値); (全テーブルへ挿入)

INSERT INTO テーブル名 (列名, ...) VALUES (値, ...) (列指定)

INSERT INTO テーブル名 (列名, ...) SELECT 列名, ... で選択結果を挿入できる

UPDATE テーブル名 SET カラム名=値

REPLACE(カラム名, '置き換え元', '置き換え先');

相関サブクエリ WHERE NOT EXISTS (SELECT * FROM テーブル名1 WHERE テーブル名1.カラム名1 = テーブル名2.カラム名1)

DELETE FROM テーブル名 WHERE

TRUNCATE TABLE テーブル名 高速に全削除。ログも残さない。

BEGIN でトランザクション開始。 ROLLBACKすると取り消せる。COMMITでコミット。

CREATE TABLE テーブル名(列名 データ型 列フラグ, ...)

AUTO_INCREMENT(自動連番)
DEFAULT(値が未指定の場合のデフォルト値)
[NOT]NULL (NULLを許容するorしない)

PRIMARY KEY (重複をゆるさないandNULLは不可)
id INT AUTO_INCREMENT PRIMARY KEY(主キーの作成。列フラグとの置き換え可)

UNIQUE(重複を許さないandNULLは許容)
PREFERNECES テーブル名(列名, ...) (外部参照制約)

DROP TABLE テーブル名