스프링

 

JDBCTemplate 연습 2 

 

 1). MySQL DB 사용자, 데이터베이스, 테이블 생성

사용자

생성
create user 'spring5'@'localhost' identified by 'spring5'; 
권한
grant all privileges on spring5fs.* to 'spring5'@'localhost';

 

데이터베이스

create database spring5fs default character set utf8;

 

테이블

create table spring5fs.MEMBER (
    ID int auto_increment primary key,
    EMAIL varchar(255),
    PASSWORD varchar(100),
    NAME varchar(100),
    REGDATE datetime,
    unique key (EMAIL) 
) engine=InnoDB character set = utf8;

데이터 추가해서 테스트

insert into member(email, password, name, regdate)
value ('asd@asd.com', '1234', '김복자', now());

 

 

 2). DTO 생성

package spring;

import java.time.LocalDateTime;

public class Member {

	private Long id;
	private String email;
	private String password;
	private String name;
	private LocalDateTime registerDateTime;

	public Member(String email, String password, 
			String name, LocalDateTime regDateTime) {
		this.email = email;
		this.password = password;
		this.name = name;
		this.registerDateTime = regDateTime;
	}

	void setId(Long id) {
		this.id = id;
	}

	public Long getId() {
		return id;
	}

	public String getEmail() {
		return email;
	}

	public String getPassword() {
		return password;
	}

	public String getName() {
		return name;
	}

	public LocalDateTime getRegisterDateTime() {
		return registerDateTime;
	}

	public void changePassword(String oldPassword, String newPassword) {
		if (!password.equals(oldPassword))
			throw new WrongIdPasswordException();
		this.password = newPassword;
	}

}

 

 

 

 3). DataSource 설정 ( DAO 만들고 주입 ) 

package config;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import spring.MemberDao;

@Configuration
public class AppCtx {
	
	
	@Bean(destroyMethod = "close") // 빈이 소멸될 때 커넥션 풀을 닫도록 설정
	public DataSource dataSource() {
		
		DataSource ds = new DataSource();
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/spring5fs?"
				+"useSSL=true&useUnicode=true&characterEncoding=utf8");
		ds.setUsername("spring5");
		ds.setPassword("spring5");
		ds.setInitialSize(2); // 초기 커넥션 개수 지정
		ds.setMaxActive(10); // 최대 커넥션 개수 지정
		
		return ds;
		
	}
	// DAO 만들고 주입 
	@Bean
	public MemberDao memberDao() {
		return new MemberDao(dataSource());
	}
}

 

 

 

 

 4). DAO 설정 

1. JdbcTemplate 필드 선언 

2. DAO 생성자 만든 후 매개변수 DataSource 인자로 받음

3. 생성자 내부에서 JdbcTemplate 객체를 생성

이렇게 구현된 생성자를 통해 MemberDao 객체가 생성될 때마다 JdbcTemplate이 초기화되고, 이후 MemberDao 클래스 내에서 jdbcTemplate를 사용하여 데이터베이스와 상호작용하는 메서드들을 작성할 수 있다.

package spring;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class MemberDao {
	private JdbcTemplate jdbcTemplate;
	
	public MemberDao(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public Member selectByEmail(String email) {
		String sql = "select * from MEMBER where EMAIL = ?";
		List<Member> result = jdbcTemplate.query(sql, new MemberRowMapper(), email);
		return result.isEmpty() ? null : result.get(0);
				
	}
	
	public List<Member> selectAll(){
		String sql = "select * from member";
//		List<Member> result = jdbcTemplate.query(sql, 
//				new MemberRowMapper());
		
		// 람다식
		List<Member> result = jdbcTemplate.query(sql, 
				(ResultSet rs, int rowNum)->{
					Member member = new Member(
							rs.getString("email"),
							rs.getString("password"),
							rs.getString("name"), 
							rs.getTimestamp("regdate").toLocalDateTime());
					member.setId(rs.getLong("id"));
					return member;
				});
		
		return result;
	}
	
	public int count1() {
		String sql = "select count(*) from member";
		List<Integer> result = jdbcTemplate.query(
				sql, 
				new RowMapper<Integer>() {

					@Override
					public Integer mapRow(ResultSet rs, int rowNum) throws SQLException {
						return rs.getInt(1);
						
					}
					
				});
		return result.get(0);
	}
	
	// 람다식
	public int count2() {
		String sql = "select count(*) from member";
		List<Integer> result = jdbcTemplate.query(sql, 
				(ResultSet rs, int rewNum)->{
					return rs.getInt(1);
				});
		return result.get(0);
	}
	
}

 

 

 5). 실행 테스트

package main;

import java.util.List;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import config.AppCtx;
import spring.Member;
import spring.MemberDao;

public class TestSelEmail {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(AppCtx.class);
		
		MemberDao memberDao = ctx.getBean("memberDao", MemberDao.class);
		
//		Member member = memberDao.selectByEmail("madvirus@madvirus.com");
//		System.out.println(member);
		
		List<Member> list = memberDao.selectAll();
		for(Member m1 : list) {
			System.out.println(m1);
		}
	
//		System.out.println("count1 = " + memberDao.count1() );
//		System.out.println("count2 = " + memberDao.count2() );
	}
	
}

 

 

 

오라클

 

중복되지 않는 값 UNIQUE ( NULL은 여러 개 존재 가능 ) 

 

제약 조건 지정하기 ( 테이블 생성할 때 )

create table table_unique(
    login_id VARCHAR2(20) UNIQUE,
    login_pwd VARCHAR2(20) NOT NULL,
    tel VARCHAR2(20)
);

 

테이블에 데이터 넣기

insert into table_unique(login_id, login_pwd, tel)
VALUES ('Test_ID_01', 'PWD01', '010-1234-5678')

 

LOGIN_ID 열에 중복되는 데이터 넣기 ( 무결성 제약조건 위배 )

insert into table_unique(login_id, login_pwd, tel)
VALUES ('Test_ID_01', 'PWD01', '010-1234-5678')

 

LOGIN_PWD 열에 중복되는 데이터 넣기 ( NOT NULL 조건만 지정되어 있어서 가능 )

insert into table_unique(login_id, login_pwd, tel)
VALUES ('Test_ID_02', 'PWD01', '010-1234-5678')

LOGIN_ID 열에 NULL값 입력 ( 유니크니까 NULL값 입력 가능 )

insert into table_unique(login_id, login_pwd, tel)
VALUES (NULL, 'PWD01', '010-1234-5678')

 

 

 

 

JDBC => JDBCTemplate 변경 실습

 

DataSource 설정

package config;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import guestbook.dao.MessageDao;

@Configuration
public class AppCtx {
	
	
	@Bean(destroyMethod = "close") // 빈이 소멸될 때 커넥션 풀을 닫도록 설정
	public DataSource dataSource() {
		
		DataSource ds = new DataSource();
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/guestbook?"
				+"useSSL=true&useUnicode=true&characterEncoding=utf8");
		ds.setUsername("jspexam");
		ds.setPassword("jsppw");
		ds.setInitialSize(2); // 초기 커넥션 개수 지정
		ds.setMaxActive(10); // 최대 커넥션 개수 지정
		
		return ds;
		
	}
	
	@Bean
	public MessageDao messageDao() {
		return new MessageDao(dataSource());
	}
	
}

 

DTO 동일 

package guestbook.model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Message {

	private int id;
	private String guestName;
	private String password;
	private String message;
	
	
	
	// 생성자 추가 
	public Message(String guestName, String password, String message) {
		super();
		this.guestName = guestName;
		this.password = password;
		this.message = message;
	}



	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getGuestName() {
		return guestName;
	}

	public void setGuestName(String guestName) {
		this.guestName = guestName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public boolean hasPassword() {
		return password != null && !password.isEmpty();
	}

	public boolean matchPassword(String pwd) {
		return password != null && password.equals(pwd);
	}
}

 

 

DAO ( 주석으로 된게 기존 JDBC )

package guestbook.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

import guestbook.model.Message;

public class MessageDao {
	
	private JdbcTemplate jdbcTemplate;
	
	public MessageDao(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	private Message makeMessageFromResultSet(ResultSet rs) throws SQLException {
		Message message = new Message();
		message.setId(rs.getInt("message_id"));
		message.setGuestName(rs.getString("guest_name"));
		message.setPassword(rs.getString("password"));
		message.setMessage(rs.getString("message"));
		return message;
	}
	
	
	public int insert(Message message) {
		String sql = "insert into guestbook_message " + 
			"(guest_name, password, message) values (?, ?, ?)";
		return jdbcTemplate.update(sql, 
				message.getGuestName(),
				message.getPassword(),
				message.getMessage()
				
				);
		
	}
	
//	public int insert(Connection conn, Message message) throws SQLException {
//		PreparedStatement pstmt = null;
//		try {
//			pstmt = conn.prepareStatement(
//					"insert into guestbook_message " + 
//					"(guest_name, password, message) values (?, ?, ?)");
//			pstmt.setString(1, message.getGuestName());
//			pstmt.setString(2, message.getPassword());
//			pstmt.setString(3, message.getMessage());
//			return pstmt.executeUpdate();
//		} finally {
//			JdbcUtil.close(pstmt);
//		}
//	}

	public Message select(int messageId) {
		String sql = "select * from guestbook_message where message_id = ?";
		return jdbcTemplate.queryForObject(sql, 
				(ResultSet rs, int rowNum) -> {
					return makeMessageFromResultSet(rs);
				} ,messageId);
		
	}
	
//	public Message select(Connection conn, int messageId) throws SQLException {
//		PreparedStatement pstmt = null;
//		ResultSet rs = null;
//		try {
//			pstmt = conn.prepareStatement(
//					"select * from guestbook_message where message_id = ?");
//			pstmt.setInt(1, messageId);
//			rs = pstmt.executeQuery();
//			if (rs.next()) {
//				return makeMessageFromResultSet(rs);
//			} else {
//				return null;
//			}
//		} finally {
//			JdbcUtil.close(rs);
//			JdbcUtil.close(pstmt);
//		}
//	}


	public int selectCount() {
		String sql = "select count(*) from guestbook_message";
		Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
				return count;
	}
	
//	public int selectCount(Connection conn) throws SQLException {
//		Statement stmt = null;
//		ResultSet rs = null;
//		try {
//			stmt = conn.createStatement();
//			rs = stmt.executeQuery("select count(*) from guestbook_message");
//			rs.next();
//			return rs.getInt(1);
//		} finally {
//			JdbcUtil.close(rs);
//			JdbcUtil.close(stmt);
//		}
//	}

	public List<Message> selectList(int firstRow, int endRow){
		String sql = "select * from guestbook_message " + 
				"order by message_id desc limit ?, ?";
		
		List<Message> result = jdbcTemplate.query(sql, 
				(rs, rowNum) -> makeMessageFromResultSet(rs), 
				firstRow - 1,
				endRow - firstRow + 1);
		
		return result;
	}
	
//	public List<Message> selectList(Connection conn, int firstRow, int endRow) 
//			throws SQLException {
//		PreparedStatement pstmt = null;
//		ResultSet rs = null;
//		try {
//			pstmt = conn.prepareStatement(
//					"select * from guestbook_message " + 
//					"order by message_id desc limit ?, ?");
//			pstmt.setInt(1, firstRow - 1);
//			pstmt.setInt(2, endRow - firstRow + 1);
//			rs = pstmt.executeQuery();
//			if (rs.next()) {
//				List<Message> messageList = new ArrayList<Message>();
//				do {
//					messageList.add(makeMessageFromResultSet(rs));
//				} while (rs.next());
//				return messageList;
//			} else {
//				return Collections.emptyList();
//			}
//		} finally {
//			JdbcUtil.close(rs);
//			JdbcUtil.close(pstmt);
//		}
//	}

	public int delete1(int messageId) {
		String sql = "delete from guestbook_message where message_id = ?";
		return jdbcTemplate.update(sql, messageId);
	
	}
	
//	public int delete(Connection conn, int messageId) throws SQLException {
//		PreparedStatement pstmt = null;
//		try {
//			pstmt = conn.prepareStatement(
//					"delete from guestbook_message where message_id = ?");
//			pstmt.setInt(1, messageId);
//			return pstmt.executeUpdate();
//		} finally {
//			JdbcUtil.close(pstmt);
//		}
//	}

}

'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글

2023-08-07 57일차  (0) 2023.08.07
2023-08-04 56일차  (0) 2023.08.04
2023-08-02 54일차  (0) 2023.08.02
2023-08-01 53일차  (0) 2023.08.01
2023-07-31 52일차  (0) 2023.07.31

+ Recent posts