본문 바로가기

spring/DB

spring에서 DB 연결 (JdbcDaoSupport 상속을 이용한)

다음의 라이브러리가 필요


<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>5.1.30</version>

</dependency>


<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-jdbc</artifactId>

    <version>1.0.2.RELEASE</version>

</dependency>



설명


xml 설정파일 에서 스프링에서 제공하는 DriverManagerDataSource 객체를 생성하고 DB에 접근할 수 있게 property를 셋팅해준다.


<bean id="sangpumImpl" class="pack.SangpumImpl">

<property name="dataSource" ref="datasource"/> 

</bean>


이 부분에서 DriverManagerDataSource 객체를 주입해주는데 sangpumImpl은 쿼리를 실행하는 클래스로 JdbcDaoSupport를 상속받아야만 한다.


JdbcDaoSupport클래스역시 DaoSupport라는 클래스를 상속받은 클래스인데 DriverManagerDataSource 객체에서 셋팅된 db접속 정보가 JdbcDaoSupport의 


public final void setDataSource(DataSource dataSource) 메소드를 통해 설정된다.


사용자가 유의해야 할 부분은 쿼리를 실행하는 클래스는 JdbcDaoSupport  상속받고  getJdbcTemplate().query() 메소드를 실행하면 된다.


query() 인자로 sql문과 RowMapper구현한 RowMapper 객체 2가지를 준다


RowMapper 구현(implement)한 클래스는 mapRow() 메소드를 재정의 하는데 앞서 sql문장이 실행된 결과의 레코드 수만큼 호출되어 해당 레코드를 처리할 수 있다.



요약


필요한 라이브러리 준비


DriverManagerDataSource 객체에 db접속 정보 셋팅


쿼리 날릴 자바소스에 JdbcDaoSupport 클래스 상속


JdbcDaoSupport 클래스를 상속받은 클래스에서 getJdbcTemplate().query(sql문,RowMapper 구현한 객체) 메소드의 리턴값을 리턴해주는데 query()의 인자값으로


결과값을 하나의 레코드씩 받을 RowMapper 구현한 클래스를 만듬


RowMapper 구현한 클래스의 리턴값들이 getJdbcTemplate().query()에 누적되면서 자기를 부른놈에게 결과값을 되돌려줄것임(예제에서는 selectList() 메소드를 부른놈에게 결과값을 되돌려줌)



==================================================================================================================================================

설정파일


        <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>com.mysql.jdbc.Driver</value>

</property>

<property name="url">

<value>jdbc:mysql://localhost:3307/test</value>

</property>

<property name="username">

<value>root</value>

</property>

<property name="password">

<value>1234</value>

</property>

</bean>

<bean id="sangpumImpl" class="pack.SangpumImpl">

<property name="dataSource" ref="datasource"/> <!-- property 는 setter가 있어야 필드를 셋팅할 수 이씀 -->

</bean>

<bean id="businessImpl" class="pack.BusinessImpl">

<property name="sangpumInter" ref="sangpumImpl"/>

</bean>


==================================================================================================================================================

Model 소스


package pack;


import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;


import org.springframework.dao.DataAccessException;

import org.springframework.jdbc.core.RowMapper;

import org.springframework.jdbc.core.support.JdbcDaoSupport;


public class SangpumImpl extends JdbcDaoSupport implements SangpumInter{

//JdbcDaoSupport : DataSource 관리 뿐 아니라 JdbcTemplate를 지원 받아 SQL문을 처리

@Override

public List<SangpumDto> selectList() throws DataAccessException {

RowMapper rowMapper = new SangpumRowMapper();

// 아래 처럼 기술하면 레코드의 개수 만큼 mapRow()를 호출

// query(Query, RowMapper구현한 RowMapper 객체)

return getJdbcTemplate().query("SELECT * FROM sangdata", rowMapper);

}

//내부 클래스(양이 적어서리.. 내부씀)

class SangpumRowMapper implements RowMapper{

@Override

public Object mapRow(ResultSet rs, int rowNum) throws SQLException {

// mapRow : select query 실행 결과를 한 레코드씩 전달 받음. 따라서 rs.next() 같은 메소드 필요없음

SangpumDto dto = new SangpumDto();

dto.setCode(rs.getString("code"));

dto.setSang(rs.getString("sang"));

dto.setSu(rs.getString("su"));

dto.setDan(rs.getString("dan"));

return dto;

}

}

}