DB를 연동하는 프레임워크에는 jdbcTemplate, MyBatis, JPA가 있다.
현업에서는 MyBatis에서 JPA 로 넘어가는 추세다.
그래서 MyBatis로 짜인 코드를 알면 취업해서 코드를 이해할 수 있겠지요~
package com.example.demo.guestbook;
import java.util.ArrayList;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
//myBatis 는 db 연동하는 프레임워크. db 자동처리.
// jdbc template, myBatis, JPA --- 현업에서는 myBatis 에서 JPA 로 이동하는 중.
@Mapper //맵퍼클래스. db 구현체를 mybatis가 대신 만들어줌.
// db 작업할 메서드의 기본 틀만 등록.
public interface GuestDao {
// 기존 dao 에서 선언문만 가져옴.
// 실행할 쿼리문과 어노테이션을 써줌.
// 인터페이스 : 상수와 추상메서드만 포함함. 추상메서드는 다 public 임.
@Select("select seq_guestbook.nextval as num from dual") // 실행하고자 하는 쿼리문
int selectNextval();
// #{vo의 멤버변수 이름} or #{파라메터 이름}
// writer=#{kkk} >> @Param("kkk") String writer
@Insert("insert into guestbook values(#{num},#{writer},sysdate,#{pwd},#{content},0)")
void insert(GuestBookVo vo);
// 컬럼 이름과 vo이름이 같아야 자동으로 매칭 가능
@Select("select * from guestbook where num=#{num}")
GuestBookVo select(@Param("num") int num);
@Select("select * from guestbook order by num desc")
ArrayList<GuestBookVo> selectAll();
@Update("update guestbook set content=#{content} where num=#{num}")
void update(GuestBookVo vo);
@Delete("delete from guestbook where num=#{num}")
void delete(@Param("num") int num);
@Update("update guestbook set cnt=cnt+1 where num=#{num}")
void updateCnt(@Param("num") int num);
@Select("select cnt from guestbook where num=#{num}")
int selectCnt(@Param("num") int num);
}
* MyBatis 쓰기 전 jdbcTemplate 쓴 코드
package com.example.demo.guestbook;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository
public class GuestDao {
@Autowired
private JdbcTemplate temp;
//resultMap 클래스
public class GuestMapper implements RowMapper<GuestBookVo>{
@Override
public GuestBookVo mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
GuestBookVo vo = new GuestBookVo();
vo.setNum(rs.getInt(1));
vo.setWriter(rs.getString(2));
vo.setW_date(rs.getDate(3));
vo.setPwd(rs.getString(4));
vo.setContent(rs.getString(5));
vo.setCnt(rs.getInt(6));
return vo;
}
}
public Map selectNextval() {
String sql = "select seq_guestbook.nextval as num from dual"; //시퀀스 번호 생성문
// map.put("num", 1);
// map.put("컬럼명", 컬럼값);
// map.put("컬럼명", 컬럼값);
return temp.queryForMap(sql);
}
public void insert(GuestBookVo vo) {
String sql = "insert into guestbook values(?,?,sysdate,?,?,0)";
temp.update(sql, new Object[] {vo.getNum(), vo.getWriter(), vo.getPwd(), vo.getContent()});
}
public GuestBookVo select(long num) {
String sql = "select * from guestbook where num=?";
return temp.queryForObject(sql, new GuestMapper(), num);
}
public ArrayList<GuestBookVo> selectAll() {
String sql = "select * from guestbook order by num desc";
return (ArrayList<GuestBookVo>) temp.query(sql, new GuestMapper());
}
public void update(GuestBookVo vo) {
String sql = "update guestbook set content=? where num=?";
temp.update(sql, new Object[] {vo.getContent(), vo.getNum()});
}
public void delete(long num) {
String sql = "delete from guestbook where num=?";
temp.update(sql, num);
}
public void updateCnt(long num) {
String sql = "update guestbook set cnt=cnt+1 where num=?";
temp.update(sql, num);
}
public Map selectCnt(long num) {
String sql = "select cnt from guestbook where num=?";
return temp.queryForMap(sql, num);
}
}
1. dao를 interface 로 만들어야 한다!
https://intheham.tistory.com/18
[JAVA] 추상클래스, 인터페이스
1. 추상 클래스 상속을 위해 만든 부모 클래스의 메소드는 상속을 목적으로 했을 뿐 해당 클래스에서 별다른 기능을 하진 않음. => 굳이 부모 클래스에 있을 필요가 없음. 메서드 구현 없이 메서
intheham.tistory.com
- 인터페이스는 상수와 추상메서드만을 포함한 완전추상클래스이다.
! 추상 메서드는 기본 타입이 public이므로 메서드를 선언할 때 public을 굳이 쓰지 않아도 된다.
! 멤버변수는 상수만 가능하므로 Map 같은거 못쓴다~
-- Service에서도 int 로만 불러올 수 있음~
public long addBook(GuestBookVo vo) {//작성자, 글내용, pwd
Map map = dao.selectNextval();
long num = ((BigDecimal) map.get("num")).longValue();
vo.setNum(num);//vo에 생성한 시퀀스 번호 저장. 이 글의 번호로 사용됨
dao.insert(vo);//db에 저장
return num; //방금 추가된 글의 번호 반환
}
-->
public int addBook(GuestBookVo vo) {//작성자, 글내용, pwd
int num = dao.selectNextval();
vo.setNum(num);//vo에 생성한 시퀀스 번호 저장. 이 글의 번호로 사용됨
dao.insert(vo);//db에 저장
return num; //방금 추가된 글의 번호 반환
}
2. 꼭 @Mapper 어노테이션을 써줘야 한다.
- 맵퍼클래스임을 선언하는 것. 해당 어노테이션을 써야 MyBatis가 DB 구현체를 대신 만들어줄 수 있다.
3. DB 작업에 필요한 메서드의 기본 틀만 등록한다.
- 기존 Dao에서 선언문만 가져온다.
- sql 쿼리문에 맞는 어노테이션과 쿼리문을 써준다.
@Insert("insert into guestbook values(#{num},#{writer},sysdate,#{pwd},#{content},0)")
void insert(GuestBookVo vo);
#{ vo 멤버변수 이름 }
#{ 파라메터 이름 }
- 컬럼 이름과 vo 이름이 같아야 자동으로 매칭 가능하다.
파라메터 이름, vo 이름이 같으면 @Param을 생략해도 된다.
@Select("select * from guestbook where num=#{num}")
GuestBookVo select(@Param("num") int num);
- 파라메터 이름과 vo 이름이 다를 경우 꼭 @Param 을 써주자.
writer=#{kkk}
=> @Param("kkk") String writer
DB를 연동하는 프레임워크에는 jdbcTemplate, MyBatis, JPA가 있다.
현업에서는 MyBatis에서 JPA 로 넘어가는 추세다.
그래서 MyBatis로 짜인 코드를 알면 취업해서 코드를 이해할 수 있겠지요~
package com.example.demo.guestbook;
import java.util.ArrayList;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
//myBatis 는 db 연동하는 프레임워크. db 자동처리.
// jdbc template, myBatis, JPA --- 현업에서는 myBatis 에서 JPA 로 이동하는 중.
@Mapper //맵퍼클래스. db 구현체를 mybatis가 대신 만들어줌.
// db 작업할 메서드의 기본 틀만 등록.
public interface GuestDao {
// 기존 dao 에서 선언문만 가져옴.
// 실행할 쿼리문과 어노테이션을 써줌.
// 인터페이스 : 상수와 추상메서드만 포함함. 추상메서드는 다 public 임.
@Select("select seq_guestbook.nextval as num from dual") // 실행하고자 하는 쿼리문
int selectNextval();
// #{vo의 멤버변수 이름} or #{파라메터 이름}
// writer=#{kkk} >> @Param("kkk") String writer
@Insert("insert into guestbook values(#{num},#{writer},sysdate,#{pwd},#{content},0)")
void insert(GuestBookVo vo);
// 컬럼 이름과 vo이름이 같아야 자동으로 매칭 가능
@Select("select * from guestbook where num=#{num}")
GuestBookVo select(@Param("num") int num);
@Select("select * from guestbook order by num desc")
ArrayList<GuestBookVo> selectAll();
@Update("update guestbook set content=#{content} where num=#{num}")
void update(GuestBookVo vo);
@Delete("delete from guestbook where num=#{num}")
void delete(@Param("num") int num);
@Update("update guestbook set cnt=cnt+1 where num=#{num}")
void updateCnt(@Param("num") int num);
@Select("select cnt from guestbook where num=#{num}")
int selectCnt(@Param("num") int num);
}
* MyBatis 쓰기 전 jdbcTemplate 쓴 코드
package com.example.demo.guestbook;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository
public class GuestDao {
@Autowired
private JdbcTemplate temp;
//resultMap 클래스
public class GuestMapper implements RowMapper<GuestBookVo>{
@Override
public GuestBookVo mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
GuestBookVo vo = new GuestBookVo();
vo.setNum(rs.getInt(1));
vo.setWriter(rs.getString(2));
vo.setW_date(rs.getDate(3));
vo.setPwd(rs.getString(4));
vo.setContent(rs.getString(5));
vo.setCnt(rs.getInt(6));
return vo;
}
}
public Map selectNextval() {
String sql = "select seq_guestbook.nextval as num from dual"; //시퀀스 번호 생성문
// map.put("num", 1);
// map.put("컬럼명", 컬럼값);
// map.put("컬럼명", 컬럼값);
return temp.queryForMap(sql);
}
public void insert(GuestBookVo vo) {
String sql = "insert into guestbook values(?,?,sysdate,?,?,0)";
temp.update(sql, new Object[] {vo.getNum(), vo.getWriter(), vo.getPwd(), vo.getContent()});
}
public GuestBookVo select(long num) {
String sql = "select * from guestbook where num=?";
return temp.queryForObject(sql, new GuestMapper(), num);
}
public ArrayList<GuestBookVo> selectAll() {
String sql = "select * from guestbook order by num desc";
return (ArrayList<GuestBookVo>) temp.query(sql, new GuestMapper());
}
public void update(GuestBookVo vo) {
String sql = "update guestbook set content=? where num=?";
temp.update(sql, new Object[] {vo.getContent(), vo.getNum()});
}
public void delete(long num) {
String sql = "delete from guestbook where num=?";
temp.update(sql, num);
}
public void updateCnt(long num) {
String sql = "update guestbook set cnt=cnt+1 where num=?";
temp.update(sql, num);
}
public Map selectCnt(long num) {
String sql = "select cnt from guestbook where num=?";
return temp.queryForMap(sql, num);
}
}
1. dao를 interface 로 만들어야 한다!
https://intheham.tistory.com/18
[JAVA] 추상클래스, 인터페이스
1. 추상 클래스 상속을 위해 만든 부모 클래스의 메소드는 상속을 목적으로 했을 뿐 해당 클래스에서 별다른 기능을 하진 않음. => 굳이 부모 클래스에 있을 필요가 없음. 메서드 구현 없이 메서
intheham.tistory.com
- 인터페이스는 상수와 추상메서드만을 포함한 완전추상클래스이다.
! 추상 메서드는 기본 타입이 public이므로 메서드를 선언할 때 public을 굳이 쓰지 않아도 된다.
! 멤버변수는 상수만 가능하므로 Map 같은거 못쓴다~
-- Service에서도 int 로만 불러올 수 있음~
public long addBook(GuestBookVo vo) {//작성자, 글내용, pwd
Map map = dao.selectNextval();
long num = ((BigDecimal) map.get("num")).longValue();
vo.setNum(num);//vo에 생성한 시퀀스 번호 저장. 이 글의 번호로 사용됨
dao.insert(vo);//db에 저장
return num; //방금 추가된 글의 번호 반환
}
-->
public int addBook(GuestBookVo vo) {//작성자, 글내용, pwd
int num = dao.selectNextval();
vo.setNum(num);//vo에 생성한 시퀀스 번호 저장. 이 글의 번호로 사용됨
dao.insert(vo);//db에 저장
return num; //방금 추가된 글의 번호 반환
}
2. 꼭 @Mapper 어노테이션을 써줘야 한다.
- 맵퍼클래스임을 선언하는 것. 해당 어노테이션을 써야 MyBatis가 DB 구현체를 대신 만들어줄 수 있다.
3. DB 작업에 필요한 메서드의 기본 틀만 등록한다.
- 기존 Dao에서 선언문만 가져온다.
- sql 쿼리문에 맞는 어노테이션과 쿼리문을 써준다.
@Insert("insert into guestbook values(#{num},#{writer},sysdate,#{pwd},#{content},0)")
void insert(GuestBookVo vo);
#{ vo 멤버변수 이름 }
#{ 파라메터 이름 }
- 컬럼 이름과 vo 이름이 같아야 자동으로 매칭 가능하다.
파라메터 이름, vo 이름이 같으면 @Param을 생략해도 된다.
@Select("select * from guestbook where num=#{num}")
GuestBookVo select(@Param("num") int num);
- 파라메터 이름과 vo 이름이 다를 경우 꼭 @Param 을 써주자.
writer=#{kkk}
=> @Param("kkk") String writer