package spring.sample.dao.sample;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * DaoSampleはJDBC抽象化フレームワークを利用した<br>
 * PERSONテーブルへの、参照,更新,追加,削除をおこなう<br>
 * サンプルです
 * <br>
 * @author MBeans
 * @version 1.0
 */
public class DaoSample {

	private static SampleDAO getDAO() {
		BeanFactory factory = new ClassPathXmlApplicationContext("/spring/sample/dao/sample/applicationContext-jdbc.xml");
		return (SampleDAO) factory.getBean("sampleDAO");
	}

	public static void main(String[] args) throws Exception {
		//参照のサンプル
		selectSample();
		
		//更新のサンプル
		updateSample();
		
		//追加のサンプル
		insertSample();
		
		//削除のサンプル
		deleteSample();
		
	}

	/**
	 * PERSONテーブルへの参照を行なうサンプル
	 */
	private static void selectSample() {

		SampleDAO sampleDAO = getDAO();

		List personList = sampleDAO.findPersons();
		
		Person person = null;
		System.out.println("========== 参照(SELECT)のサンプル ==========");
		for (int i = 0; i < personList.size(); i++) {
			person = (Person) personList.get(i);
			System.out.println(
				"SampleDAO.findPersons ID["
					+ person.getId()
					+ "] NAME["
					+ person.getName()
					+ "] ADDRESS["
					+ person.getAddress()
					+ "]");
		}
		
		System.out.println();
	}

	/**
	 * PERSONテーブルへの更新を行なうサンプル
	 */
	private static void updateSample() {

		SampleDAO sampleDAO = getDAO();

		Person person = sampleDAO.findPerson("A001");
		System.out.println("========== 更新(UPDATE)のサンプル ==========");
		System.out.println("---------更新前---------");
		System.out.println(
			"SampleDAO.findPerson ID["
				+ person.getId()
				+ "] NAME["
				+ person.getName()
				+ "] ADDRESS["
				+ person.getAddress()
				+ "]");
		
		Date date = new Date();
		
		person.setAddress("豆蔵City豆蔵町 " + date.getMinutes() + ":" + date.getSeconds());
		sampleDAO.updatePerson(person);
		
		person = sampleDAO.findPerson("A001");
		
		System.out.println("---------更新後---------");
		System.out.println(
			"SampleDAO.findPersons ID["
				+ person.getId()
				+ "] NAME["
				+ person.getName()
				+ "] ADDRESS["
				+ person.getAddress()
				+ "]");
				
		System.out.println();
	}
	
	/**
	 * PERSONテーブルへの追加を行なうサンプル
	 */
	private static void insertSample() {

		SampleDAO sampleDAO = getDAO();

		//追加される前のPERSONテーブルの全データを取得します
		List personList = sampleDAO.findPersons();

		Person person = null;
		System.out.println("========== 追加(INSERT)のサンプル ==========");		
		System.out.println("---------追加前---------");
		for (int i = 0; i < personList.size(); i++) {
			person = (Person) personList.get(i);
			System.out.println(
				"SampleDAO.findPersons ID["
					+ person.getId()
					+ "] NAME["
					+ person.getName()
					+ "] ADDRESS["
					+ person.getAddress()
					+ "]");
		}
		
		//データを追加します
		Person addPerson = new Person("A999","豆蔵豆太郎","豆市豆町");
		sampleDAO.addPerson(addPerson);
	
		//追加されたことを確認する為に、PERSONテーブルの全データを取得します。
		personList = sampleDAO.findPersons();

		person = null;
		System.out.println("---------追加後---------");		
		for (int i = 0; i < personList.size(); i++) {
			person = (Person) personList.get(i);
			System.out.println(
				"SampleDAO.findPersons ID["
					+ person.getId()
					+ "] NAME["
					+ person.getName()
					+ "] ADDRESS["
					+ person.getAddress()
					+ "]");
		}
		
		System.out.println();
	}

	/**
	 * PERSONテーブルへの削除を行なうサンプル
	 */
	private static void deleteSample() {

		SampleDAO sampleDAO = getDAO();

		//削除される前のPERSONテーブルの全データを取得します
		List personList = sampleDAO.findPersons();

		Person person = null;
		System.out.println("========== 削除(DELETE)のサンプル ==========");		
		System.out.println("---------削除前---------");
		for (int i = 0; i < personList.size(); i++) {
			person = (Person) personList.get(i);
			System.out.println(
				"SampleDAO.findPersons ID["
					+ person.getId()
					+ "] NAME["
					+ person.getName()
					+ "] ADDRESS["
					+ person.getAddress()
					+ "]");
		}
		
		//データを削除します
		Person addPerson = new Person("A999","豆蔵豆太郎","豆市豆町");
		sampleDAO.deletePerson(addPerson);
	
		//削除されたことを確認する為に、PERSONテーブルの全データを取得します。
		personList = sampleDAO.findPersons();

		person = null;
		System.out.println("---------削除後---------");		
		for (int i = 0; i < personList.size(); i++) {
			person = (Person) personList.get(i);
			System.out.println(
				"SampleDAO.findPersons ID["
					+ person.getId()
					+ "] NAME["
					+ person.getName()
					+ "] ADDRESS["
					+ person.getAddress()
					+ "]");
		}
		
		System.out.println();
	}
}