DB connection TEST
유저 권한 설정
junit으로 테스트 진행
CREATE TABLE
Score
CREATE TABLE scores(
stu_id number(3) primary key,
stu_name varchar2(30) not null,
kor number(3) default 0,
eng number(3) default 0,
math number(3) default 0,
total number(5) default 0,
average number(5,2)
);
CREATE SEQUENCE id_seq
start with 1
increment by 1
maxvalue 1000
nocycle
nocache;
root-context.xml에서 jdbc와 db 관련 설정 작성
namespace에서 jdbc와 mvc 클릭
히카리 커넥션 풀 빈 등록
등록한 Connection pool을 히카리 DataSource에 주입
JdbcTemplate 클래스 빈 등록
jdbcTemplate은 히카리 데이터 소스 빈을 참조하고 히카리 데이터 소스 빈은 히카리 커넥션 풀 빈 등록을 참조
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- JDBC, DB 관련 빈을 등록하고 관리하는 설정 파일 -->
<!-- 히카리 커넥션 풀 빈 등록 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- property는 객체의 setter처럼 값 주입 -->
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl"
value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="spring" />
<property name="password" value="spring" />
</bean>
<!-- 히카리 데이터 소스 빈 등록 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariConfig" />
<!-- 히카리 데이터 소스에 히카리 커넥션 풀 주입 -->
</bean>
<!-- Spring JDBC를 사용하기 위한 핵심 객체인 JdbcTemplate 클래스 빈 등록 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="ds" />
</bean>
</beans>
DB에 삽입, 삭제, 수정을 할 때 사용하는 함수
JdbcTemplate가 Connection등의 반복 수행해야 하는 것을 자동으로 수행
JdbcTemplate객체.update(sql, 값) 함수를 통해 삽입, 삭제, 수정을 쉽게 할 수 있음
@Repository
// 자동 bean 등록 annotation (@Repository)
public class ScoreDAO implements IScoreDAO {
// 학생들의 점수 정보를 저장할 리스트를 생성 (DB 대용)
private List<ScoreVO> scoreList = new ArrayList<>();
// root-context.xml에서 jdbc설정 끝나고 진행해야함
// Spring-jdbc 방식의 처리 : JdbcTemplate 활용
@Autowired
// container에 저장되어 있는 bean을 타입을 통해 자동으로 찾아줌
private JdbcTemplate template;
@Override
public void insertScore(ScoreVO score) {
// scoreList.add(score);
// db에 넣어주는 작업을 현재에는 list로 작성하고 있으므로 간단하게 끄읏
// service에서 가져온 score를 받아서 값을 넣음
String sql = "INSERT INTO scores VALUES(id_seq.NEXTVAL, ?, ?, ?, ?, ?, ?)";
template.update(sql,
score.getStuName(),
score.getKor(),
score.getEng(),
score.getMath(),
score.getTotal(),
score.getAverage());
// 전역 변수로 지정한 template을 활용하여 sql 작업 진행
// JdbcTemplate이 Connection이나 부가적인 다른 것들은 자동으로 진행 됨
// 엄청 간단하게 진행 가능
}
}
여러 개의 조회 결과를 받을 때 사용하는 함수
JdbcTemplate객체.query(sql, RowMapper객체) 를 통해 조회 결과 확인 가능
SELECT 쿼리를 위한 ResultSet 사용을 편하게 하기 위해 Mapper클래스를 구현해야함
ScoreMapper
package com.spring.db.common;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import com.spring.db.model.ScoreVO;
// JDBCTemplate에서 SELECT 쿼리를 위한 ResultSet 사용을 편하게 하기 위한 클래스 생성
// RowMapper 인터페이스 구현
public class ScoreMapper implements RowMapper<ScoreVO>{
@Override
public ScoreVO mapRow(ResultSet rs, int rowNum) throws SQLException {
System.out.println("mapRow 메서드 발동");
System.out.println("rowNum: " + rowNum);
ScoreVO score = new ScoreVO();
// 조회된 결과를 ScoreVO 객체에 넣어줌
// ScoreVO 객체의 setter 메서드와 db의 컬럼 명을 활용
score.setStuId(rs.getInt("std_id"));
score.setStuName(rs.getString("stu_name"));
score.setKor(rs.getInt("kor"));
score.setEng(rs.getInt("eng"));
score.setMath(rs.getInt("math"));
score.setTotal(rs.getInt("total"));
score.setAverage(rs.getDouble("average"));
return score;
}
}
sql문과 미리 만들어 둔 ScoreMapper 객체를 생성
ScoreMapper객체에는 select 결과를 score객체에 넣어주며 score객체를 리턴
jdbctemplate이 mapRow메서드를 불러서 resultset에 값을 전달
이후 객체에 값을 넣어주고 jdbctemplate에 반환하면 jdbctemplate은 리스트를 만들어 놓고 값을 넣음
mapRow 메서드는 그냥 jdbctemplate에 포장 방법을 알려준다고 생각하면 될 듯?
jsp에서 했던 select를 query함수를 통해서 실행
DAO
@Override
public List<ScoreVO> listScore() {
String sql = "SELECT * FROM scores ORDER BY stu_id ASC";
return template.query(sql, new ScoreMapper());
}
하나만 조회할 때 사용하는 함수
JdbcTemplate객체.queryForObject(sql, RowMapper객체, ?에 채울 값) 를 통해 개별 조회 결과를 반환할 수 있음
@Override
public ScoreVO selectScore(int num) {
String sql = "SELECT * FROM scores WHERE stu_id = ?";
return template.queryForObject(sql, new ScoreMapper(), num);
}