[MYSQL][JAVA]10월 20일 JAVA 코드를 이용해 mysql 서버접속 및 DB에 읽고쓰고 기능을 담당하는 DAO클래스 예제
* 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 을 보면서 실험해보면 된다.