実技(C#プログラミング実習)4

1.DB接続からデータ取得までの流れ
〇model.PersonLogic.java

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class PersonLogic {
	public PersonLogic() {}
	public List<Person> findAll(){
		List<Person> list=new ArrayList<>();

		try {
			//context(アプリ全体を統括するインスタンス)
			Context context=new InitialContext();
			//データソースを取得
			DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/jsp");
			//データソースがgetConnectionすることでdbに接続
			Connection db=ds.getConnection();
			//sql文を準備
			PreparedStatement ps=db.prepareStatement("SELECT * FROM persons");
			//準備したsqlを実行して結果セットを取得
			ResultSet rs=ps.executeQuery();
			//レコードの件数分だけ回るループ
			//rs.nextは次のレコードがあるかをboolで返し、そこにポインターを移動させる
			while(rs.next()) {
				//現在ポインターのあるレコードのidカラム内容を取得
				int id=rs.getInt("id");
				String name=rs.getString("name");
				int age=rs.getInt("age");
				//情報がそろったのでPersonインスタンス生成
				Person person=new Person(id,name,age);
				//リストに追加
				list.add(person);
			}

		} catch (NamingException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}


		return list;
	}
}


2.dbとの接続続き
〇model.PersonLogic.java

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class PersonLogic {
	public PersonLogic() {}
	public List<Person> findAll(){
		List<Person> list=new ArrayList<>();
		ResultSet rs=null;
		PreparedStatement ps=null;
		Connection db=null;
		try {
			//context(アプリ全体を統括するインスタンス)
			Context context=new InitialContext();
			//データソースを取得
			DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/jsp");
			//データソースがgetConnectionすることでdbに接続
			db=ds.getConnection();
			//sql文を準備
			ps=db.prepareStatement("SELECT * FROM persons");
			//準備したsqlを実行して結果セットを取得
			rs=ps.executeQuery();
			//レコードの件数分だけ回るループ
			//rs.nextは次のレコードがあるかをboolで返し、そこにポインターを移動させる
			while(rs.next()) {
				//現在ポインターのあるレコードのidカラム内容を取得
				int id=rs.getInt("id");
				String name=rs.getString("name");
				int age=rs.getInt("age");
				//情報がそろったのでPersonインスタンス生成
				Person person=new Person(id,name,age);
				//リストに追加
				list.add(person);
			}

		} catch (NamingException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				ps.close();
				db.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return list;
	}
}

〇controller.Test.java

package controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Person;
import model.PersonLogic;

/**
 * Servlet implementation class Test
 */
@WebServlet("/Test")
public class Test extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Test() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PersonLogic pl=new PersonLogic();
		List<Person> list=pl.findAll();
		//System.out.println(list.size());
		request.setAttribute("list", list);
		RequestDispatcher rd=
				request.getRequestDispatcher("/WEB-INF/view/test.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}


〇/WEB-INF/view/test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.*,java.util.*"%>
<%
List<Person> list=(List<Person>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%if(list !=null && list.size()>0) {%>
<table border="1">
<%for(Person p:list){ %>
<tr>
<td><%=p.getId() %></td>
<td><%=p.getName() %></td>
<td><%=p.getAge() %></td>
</tr>
<%} %>
</table>
<%} %>
</body>
</html>

3.DB接続演習
4.DB接続演習(INSERT)

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class PersonLogic {
	public PersonLogic() {}
	public List<Person> findAll(){
		List<Person> list=new ArrayList<>();
		ResultSet rs=null;
		PreparedStatement ps=null;
		Connection db=null;
		try {
			//context(アプリ全体を統括するインスタンス)
			Context context=new InitialContext();
			//データソースを取得
			DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/jsp");
			//データソースがgetConnectionすることでdbに接続
			db=ds.getConnection();
			//sql文を準備
			ps=db.prepareStatement("SELECT * FROM persons");
			//準備したsqlを実行して結果セットを取得
			rs=ps.executeQuery();
			//レコードの件数分だけ回るループ
			//rs.nextは次のレコードがあるかをboolで返し、そこにポインターを移動させる
			while(rs.next()) {
				//現在ポインターのあるレコードのidカラム内容を取得
				int id=rs.getInt("id");
				String name=rs.getString("name");
				int age=rs.getInt("age");
				//情報がそろったのでPersonインスタンス生成
				Person person=new Person(id,name,age);
				//リストに追加
				list.add(person);
			}

		} catch (NamingException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				ps.close();
				db.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return list;
	}

	public void insertOne(Person person) {
		Connection db=null;
		PreparedStatement ps=null;

		try {
			//接続処理
			Context context = new InitialContext();
			DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/jsp");
			db=ds.getConnection();

			//sqlの準備(プレイスホルダー[?]を使う)
			ps=db.prepareStatement("INSERT INTO persons(name,age) VALUES(?,?)");
			//プレイスホルダーに値をバインド(一つ目の?が1)
			ps.setString(1, person.getName());
			ps.setInt(2, person.getAge());
			//sqlの実行、結果セットが不要な時はexecuteUpdate
			ps.executeUpdate();

		} catch (NamingException | SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}finally {
			try {
				ps.close();
				db.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}

	}

}

5.DB接続演習(Insert)