① 機能単位でチームを分ける
「MVCのレイヤーでチームを分ける」方法(ViewチームとControllerチームを分ける等)は、初学者には責務の境界がわかりにくく混乱を招きがちです。代わりに「タスク機能チーム」「コメント機能チーム」のように機能単位で分けることで、チームが「自分たちの機能」を一気通貫で担当できます。
② MVP(Minimum Viable Product)に絞る
システム全体を作ろうとすると、3ヶ月では完成しないリスクがあります。「優先すべき5機能だけを作る」と決めることで、全チームが完成体験を確実に得られます。何を作るかは受講生自身が決めることで、当事者意識と主体性も育ちます。
③ 学習ステップに合った技術選択
Spring Bootなどのモダンフレームワークは便利ですが、魔法が多すぎて「なぜ動くのかわからない」状態になりやすいです。JSP+Servlet+素のJavaという構成は記述量は増えますが、リクエストの流れ・データの受け渡し・DB操作の仕組みがすべて「見える」ため、初学者の理解に最も向いています。
// ✅ 正しい接続方法(これだけ守ればOK)
Connection con = DBUtil.getConnection();
② 全JSPの先頭に認証チェックを必ず入れる
<%-- 全JSPの先頭に必ず記述 --%>
<%@ include file="/common/auth_check.jsp" %>
③ GET・POST ともにJSP直呼び。データ取得・更新はHttpClientでServletを呼ぶ
ブラウザはHTTPメソッドにかかわらず常にJSPを呼び出します。JSP内でServletへのリクエストを行い、返却されたJSONを処理します。直接Servletにフォーム送信するパターンは使いません。
実行順は WHERE → GROUP BY → HAVING → SELECT → ORDER BY
プログラミング編
INNER JOIN:両テーブルに一致するレコードだけ取得
ON t1.company_id = t2.company_id で結合条件を指定
LEFT OUTER JOIN:左テーブル全件+一致しなければNULL
「未登録・未設定の人も漏れなく取りたい」ときに使う
PreparedStatement:?(プレースホルダ)でSQL実行
SQLインジェクション防止の必須手段。文字列結合は絶対NG
-- ✅ 今日の最重要SQLパターン集
-- ①絞り込み(LIKE・IN・BETWEEN)
SELECT * FROM m_company WHERE company_name LIKE '%株式会社%';
SELECT * FROM m_company WHERE company_id IN (1, 3, 5);
SELECT * FROM m_company WHERE company_id BETWEEN 2 AND 6;
-- ②並べ替え(ORDER BY)
SELECT * FROM m_company ORDER BY area_id ASC, company_id DESC;
-- ③集計(GROUP BY + COUNT)
SELECT area_name, COUNT(*) AS cnt FROM m_company
GROUP BY area_name HAVING COUNT(*) >= 2;
-- ④内部結合(INNER JOIN)
SELECT t1.person_lname, t2.company_name
FROM m_person t1 INNER JOIN m_company t2 ON t1.company_id = t2.company_id;
-- ⑤PreparedStatement(Javaコード)
String sql = "SELECT * FROM m_company WHERE company_name = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, inputName);
ResultSet rs = pstmt.executeQuery();
class Calculator {
// 引数が2つのバージョン
static int add(int a, int b) {
return a + b;
}
// 引数が3つのバージョン(オーバーロード)
static int add(int a, int b, int c) {
return a + b + c;
}
// 引数の型がdoubleのバージョン(オーバーロード)
static double add(double a, double b) {
return a + b;
}
}
// 呼び出し側:同じ名前addで、引数によって自動的に適切なメソッドが選ばれる
System.out.println(Calculator.add(1, 2)); // → 3(2引数int版)
System.out.println(Calculator.add(1, 2, 3)); // → 6(3引数int版)
System.out.println(Calculator.add(1.5, 2.5)); // → 4.0(double版)