티스토리 뷰
JdbcTemplate의 update 메소드
INSERT, UPDATE, DELETE 쿼리는 update() 메소드를 이용한다.
update 메소드는 쿼리 실행 결과 변경된 행의 갯수를 리턴한다.
public void update(Member member)
{
// update(String sql, Object...args)
jdbcTemplate.update("update MEMBER set NAME = ?, PASSWORD = ? wher EMAIL = ?",
member.getName(), member.getPassword(), member.getEmail());
}
PreParedStatementCreator로 직접 인덱스 파라미터 값 설정
직접 인덱스 파라미터의 값을 설정하고 싶을때는 update문에 String의 쿼리문 대신, PreparedStatementCreator를 전달한다.
PreparedStatementCreator 인터페이스에는 createPreparedStatement 메소드가 있고, 이를 적절히 구현하면 된다.
jdbcTemplate.update(
// update에 PreparedStatementCreator 객체 전달 (임시 클래스)
new PreparedStatementCreator()
{
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException
{
PreparedStatement pstmt = connection.prepareStatement(
"insert into MEMBER(EMAIL, PASSWORD, NAME, REGDATE) values (?,?,?,?)");
// 인덱스 파라미터의 값 설정
pstmt.setString(1, member.getEmail());
pstmt.setString(2, member.getPassword());
pstmt.setTimestamp(4, Timestamp.valueOf(member.getRegisterDateTime()));
// 생성한 PreparedStatement 객체 리턴
return pstmt;
}
}
);
KeyHolder를 이용해 자동 생성된 키 값 구하기
테이블에서 auto_increment 칼럼은 행이 추가되면 자동으로 값이 할당된다.
update문 만으로는 이 추가된 값을 얻어올 수 없고 KeyHolder 클래스를 사용해야 한다.
KeyHolder 객체를 update문에 전달하면 update에서 쿼리 실행 후 자동생성된 키 값을 KeyHolder 객체에 저장한다.
// Member Insert
// update 메소드에 PreparedStatementCreator 전달
public void insert(final Member member)
{
KeyHolder keyHolder = new GeneratedKeyHolder(); // update 메소드에 KeyHolder 객체 전달
jdbcTemplate.update(new PreparedStatementCreator()
{
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException
{
PreparedStatement pstmt = connection.prepareStatement(
"insert into MEMBER (EMAIL, PASSWORD, NAME, REGDATE) " + "values(?,?,?,?)",
new String[]{"ID"} // 자동증가 칼럼 ID
);
pstmt.setString(1, member.getEmail());
pstmt.setString(2, member.getPassword());
pstmt.setString(3, member.getName());
pstmt.setTimestamp(4, Timestamp.valueOf(member.getRegisterDateTime()));
return pstmt;
}
}, keyHolder); // end of update method
Number keyValue = keyHolder.getKey(); // 자동생성된 키 값을 KeyHolder에 저장
member.setId(keyValue.longValue());
}
위 코드에서는 insert 메소드에서 Member 객체를 DB에 update문으로 추가하고 있는데, 그 과정에서 자동생성된 키값은 update에 두번째 파라미터로 전달된 keyHolder에 담기게 된다.
MainForMemberDao
이제 구현된 MemberDao를 테스트해볼 MainForMemberDao 클래스를 만들고 실행해보자.
package main;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import config.AppCtx;
import spring.Member;
import spring.MemberDao;
public class MainForMemberDao {
private static MemberDao memberDao;
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppCtx.class);
memberDao = ctx.getBean(MemberDao.class);
selectAll();
updateMember();
insertMember();
ctx.close();
}
private static void selectAll() {
System.out.println("----- selectAll");
int total = memberDao.count();
System.out.println("전체 데이터: " + total);
List<Member> members = memberDao.selectAll();
for (Member m : members) {
System.out.println(m.getId() + ":" + m.getEmail() + ":" + m.getName());
}
}
private static void updateMember() {
System.out.println("----- updateMember");
Member member = memberDao.selectByEmail("madvirus@madvirus.net");
String oldPw = member.getPassword();
String newPw = Double.toHexString(Math.random());
member.ChangePassword(oldPw, newPw);
memberDao.update(member);
System.out.println("암호 변경: " + oldPw + " > " + newPw);
}
private static DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("MMddHHmmss");
private static void insertMember() {
System.out.println("----- insertMember");
String prefix = formatter.format(LocalDateTime.now());
Member member = new Member(prefix + "@test.com",
prefix, prefix, LocalDateTime.now());
memberDao.insert(member);
System.out.println(member.getId() + " 데이터 추가");
}
}
흐름을 보면 selectAll()에서 DB에 저장된 모든 내역들을 출력하고, updateMember()에서 임의의 값으로 암호를 변경하고, insertMember() 에서 임의의 새로운 유저를 추가하고 있다.
DB 연동 과정에서 발생한 문제들:
https://tose33.tistory.com/768
mysql 연동 에러들
1. mysql server time zone value is unrecognized 에러 https://ubiq.co/database-blog/how-to-change-mysql-server-time-zone/ How To Change MySQL Server Time Zone - Ubiq BI Sometimes you may need..
tose33.tistory.com
실행결과:
이 결과는 이미 실행을 한번하고 난뒤 두번째 실행한 결과이다.
따라서 selectAll에서 전체 데이터가 이미 2개인것을 볼수 있다.
DB를 연동하는데 정말 너무 많은 에러들이 있었다 ...
일단 책이 나온지 좀 된 책이라 버전이 안맞아서 생기는 에러들이 엄청 많았다.
하나의 프로그램은 엄청나게 많은 수의 다른 프로그램(api등)들에 의존하고 있는데 뭔가 버전이 하나라도 안맞거나 어딘가 하나라도 삐끗하면 와르르 무너져 내릴것 같다.
어쨌든 모든 문제들을 해결하고 연동은 성공했다.
출처 : 스프링5 프로그래밍 입문 (최범균 저)
'Web' 카테고리의 다른 글
Ch8. 스프링의 트랜잭션 관리 (0) | 2022.07.09 |
---|---|
mysql 연동 에러들 (0) | 2022.07.08 |
Ch8. Spring의 JdbpcTemplate을 이용한 쿼리 실행 (0) | 2022.07.07 |
Ch8. DB, 스프링이 제공하는 JdbcTemplate Class (0) | 2022.07.07 |
Ch07. Advice 적용 순서, @Order, @Around의 Pointcut 설정 (0) | 2022.06.28 |
- Total
- Today
- Yesterday
- BFS
- Spring
- greedy
- graph
- CSS
- Tree
- two pointer
- 이분탐색
- recursion
- MVC
- 자료구조
- dfs
- DP
- back tracking
- 재귀
- C++
- floyd warshall
- binary search
- Stack
- Brute Force
- Unity
- Kruskal
- Dijkstra
- permutation
- Python
- db
- 조합
- priority queue
- Implementation
- C
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |