Spring JDBC実習3


フル・データベース・テーブルの読み込み

  • ディレクトリ構造
  • Role.JAva合成
  • package kr.or.connect.daoexam.dto;
    
    public class Role {
    	private int roleId;
    	private String description;
    	
    	public int getRoleId() {
    		return roleId;
    	}
    	public void setRoleId(int roleId) {
    		this.roleId = roleId;
    	}
    	public String getDescription() {
    		return description;
    	}
    	public void setDescription(String description) {
    		this.description = description;
    	}
    	@Override
    	public String toString() {
    		return "Role [roleId=" + roleId + ", description=" + description + "]";
    	}
    }
  • RoleDaoSqls.JAva合成
  • package kr.or.connect.daoexam.dao;
    
    public class RoleDaoSqls {
        public static final String SELECT_ALL = 
        "SELECT role_id, description FROM role order by role_id";
    }
  • RoleDao.JAva合成
  • package kr.or.connect.daoexam.dao;
    
    import java.util.Collections;
    import java.util.List;
    
    import javax.sql.DataSource;
    
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    import kr.or.connect.daoexam.dto.Role;
    import static kr.or.connect.daoexam.dao.RoleDaoSqls.*;
    
    @Repository
    public class RoleDao {
    /* jdbcTemplate은 바인딩할 때 ?를 사용하는데 이는 SQL문자열만 보았을 때 어떤 값이 매핑되었는지 모르는 문제점이 있다.
     * NamedParameterJdbcTemplate은 이름을 이용해서 바인딩하거나 결과값을 가져올 수 있다.
     * */
        private NamedParameterJdbcTemplate jdbc;
    	
    /* BeanPropertyRowMapper 객체를 이용해 column의 값을 자동으로 DTO에 담아준다.
     * BeanPropertyRowMapper는 DBMS 표기법(role_id)와 JAVA 카멜표기법(roleId)이름을 자동으로 맞춰 준다.
     * */
        private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);
    	
    /*
     * spring version 4.3부터는 component scan으로 객체를 찾았을 때
     * 기본 생성자가 없다면 자동으로 객체를 주입해준다.
     * DBConfig에서 @Bean으로 등록했던 dataSource가 parameter로 전달
     * 이것을 받아 NamedParameterJdbcTemplate 객체 생성
     * */
        public RoleDao(DataSource dataSource) {
    	this.jdbc = new NamedParameterJdbcTemplate(dataSource);
        }
    	
    /*
     * query 메서드 : 결과가 여러 건일 때 내부적으로 반복하면서 DTO를 생성하고 그것을 List에 담는다.
     * 1번 param : sql. import static 하여 RoleDaoSqls 클래스 객체 생성 없이 SELECT_ALL 상수 사용
     * 2번 param : paramMap. Collections.emptyMap()은 sql의 바인딩 할 값(? 부분)을 전달할 목적으로  사용하는 객체
     * 3번 param : rowMapper. select 한 건 한 건 결과를 DTO에 저장할 목적으로 사용
     * */
        public List<Role> selectAll(){
    	return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
        }
    }
  • アプリケーション構成の変更-@ComponentScan
  • を追加
    package kr.or.connect.daoexam.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    // 설정을 읽어들이는 부분
    // Import로 인해 DBConfig에서 정보를 읽어들인다.
    // @ComponentScan를 사용하여 dao 패키지의 @Repository이 붙은 클래스를 찾아 컨테이너에 등록
    @Configuration
    @ComponentScan(basePackages = { "kr.or.connect.daoexam.dao" })
    @Import({DBConfig.class})
    public class ApplicationConfig {
    
    }
  • SelectAllTest.JAva合成
  • package kr.or.connect.daoexam.main;
    
    import java.util.List;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    import kr.or.connect.daoexam.config.ApplicationConfig;
    import kr.or.connect.daoexam.dao.RoleDao;
    import kr.or.connect.daoexam.dto.Role;
    
    public class SelectAllTest {
    	public static void main(String[] args) {
    		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    		
    		RoleDao roleDao = ac.getBean(RoleDao.class);
    		
    		List<Role> list = roleDao.selectAll();
    		
    		for(Role role : list) {
    			System.out.println(role);
    		}
    	}
    }
    結果