[MYSQL]

[MYSQL][JAVA]10월 20일 JAVA 코드를 이용해 mysql 서버접속 및 DB에 읽고쓰고 기능을 담당하는 DAO클래스 예제

jsm9301 2015. 10. 20. 16:53

* DB에 읽고쓰고 기능을 담당하는 DAO클래스 예제

다음과 같이 데이터베이스에 product테이블 생성


테이블 생성방법을 모른다면 앞서 올린 글을 참고 하시길~

그리고 프로젝트를 생성하시는데 꼭!! MYSQL 라이브러리를 활용할 수 있게 세팅!


Product Table 에 대해서 DAO 클래스(기능을담당하는 클래스)를 작성하는법.

1단계 : 테이블 컬럼과 매칭되는 구조체 클래스를 먼저 작성 → Model 클래스라고 부른다.

public class Product {

private int p_id;               //컬럼의 타입에 맞춰서 멤버로 넣어준다.

private String p_name;

private double p_price;

private String p_desc;

public int getP_id() {

return p_id;

}

public void setP_id(int p_id) {

this.p_id = p_id;

}

public String getP_name() {

return p_name;

}

public void setP_name(String p_name) {

this.p_name = p_name;

}

public double getP_price() {

return p_price;

}

public void setP_price(double p_price) {

this.p_price = p_price;

}

public String getP_desc() {

return p_desc;

}

public void setP_desc(String p_desc) {

this.p_desc = p_desc;

}

@Override

public String toString() {

return "Product [p_id=" + p_id + ", p_name=" + p_name + ", p_price=" + p_price + ", p_desc=" + p_desc + "]";

}

}


2단계 : ProductDao클래스에 실글턴 적용하기(ProductDao 상태로서 Connection 유지하기)

(만약  ProductDao클래스 가 싱글턴이 아니라면  ProductDao클래스 객체 갯수만큼 Connection객체도 만들어질 것이다.)

싱글턴 적용하기를 기억 못하시는분들을 위해 순서대로 설명해보면

1. 생성자를 private 으로 감춰주기.

2. 자기타입의 참조변수를 static 으로 등록

3. 2에대한 getter 를 만들되 2가 null 일때 객체할당.


3단계 : 멤버변수로 Connection참조변수 등록, 생성자에서 Connection 획득.


public class ProductDao {

private static ProductDao instance;

private Connection connection;

private ProductDao(){

try {

connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sds",

"root", "mysql");

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

}

public static ProductDao getInstance(){

if(instance == null)

instance = new ProductDao();

return instance;

}


이런식으로 3단계까지 작성해주시고...




마지막 단계 : 내가 필요한 sql문을 날려주는 함수를 각각 등록!



//레코드 추가 함수

public void insertProduct(Product product){

PreparedStatement pstmt = null;

try {

pstmt = connection.prepareStatement("insert into product values(?,?,?,?)");

pstmt.setInt(1, product.getP_id());

pstmt.setString(2, product.getP_name());

pstmt.setDouble(3, product.getP_price());

pstmt.setString(4, product.getP_desc());

pstmt.executeUpdate();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

finally{

if(pstmt != null)

try {

pstmt.close();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

}

}


//레코드 업데이트 함수

public void updateProduct(Product product){

PreparedStatement pstmt = null;

try {

pstmt = connection.prepareStatement("update product set p_name = ?, p_price = ?, "

+ "p_desc = ? where p_id = ?");

pstmt.setInt(4, product.getP_id());

pstmt.setString(1, product.getP_name());

pstmt.setDouble(2, product.getP_price());

pstmt.setString(3, product.getP_desc());

pstmt.executeUpdate();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

finally{

if(pstmt != null)

try {

pstmt.close();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

}

}

//지정한 id 값을 가진 레코드 삭제

public void deleteProduct(int p_id){

PreparedStatement pstmt = null;

try {

pstmt = connection.prepareStatement("delete from product where p_id = ?");

pstmt.setInt(1, p_id);

pstmt.executeUpdate();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

finally{

if(pstmt != null)

try {

pstmt.close();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

}

}

//지정한 id값을 가진 레코드 호출

public Product selectOne(int p_id){

PreparedStatement pstmt = null;

ResultSet rs = null;

Product product = new Product();

try {

pstmt = connection.prepareStatement("select * from product where p_id = ?");

pstmt.setInt(1, p_id);

rs = pstmt.executeQuery();

if(rs.next())

{

product.setP_id(rs.getInt("p_id"));

product.setP_name(rs.getString("p_name"));

product.setP_price(rs.getDouble("p_price"));

product.setP_desc(rs.getString("p_desc"));

}

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

finally{

try {

if(pstmt != null)

pstmt.close();

if(rs != null)

rs.close();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

}

return product;

}

//product table에 있는 모든 레코드 호출!

public List<Product> selectAll(){

PreparedStatement pstmt = null;

ResultSet rs = null;

List<Product> list = new ArrayList<Product>();

try {

pstmt = connection.prepareStatement("select * from product");

rs = pstmt.executeQuery();

while(rs.next())

{

Product product = new Product();

product.setP_id(rs.getInt("p_id"));

product.setP_name(rs.getString("p_name"));

product.setP_price(rs.getDouble("p_price"));

product.setP_desc(rs.getString("p_desc"));

list.add(product);

}

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

finally{

try {

if(pstmt != null)

pstmt.close();

if(rs != null)

rs.close();

} catch (SQLException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

}

return list;

}


중요한 기능들이니 잘 숙지하자!


작성한 함수들을 이용해 테스트 해볼 ProductTest 클래스를 만들어서 테스트 해보자.


public class ProductTest {


public static void main(String[] args) {

ProductDao dao = ProductDao.getInstance();

//insert 하기

// Product p = new Product();

// p.setP_id(2);

// p.setP_name("사과");

// p.setP_price(8);

// p.setP_desc("사과는 맛있어");

// dao.insertProduct(p);


//update 하기

// Product p = new Product();

// p.setP_id(21);

// p.setP_name("공유기2");

// p.setP_price(130.5);

// p.setP_desc("공유기 가격 모름");

// dao.updateProduct(p);

//delete 하기

// dao.deleteProduct(21);

//select 하기

// Product p = dao.selectOne(21);

// System.out.println(p);

//selectAll 하기

// List<Product> list = dao.selectAll();

// for(Product p : list)

// System.out.println(p);

}


}

위와 같이 작성한 후 mysql 을 보면서 실험해보면 된다.