본문 바로가기
Programming/Spring

[Spring] JDBC 설정

by NAMP 2016. 4. 24.

[Spring] JDBC 설정

DataSource 설정

JdbcTemplate 생성

JdbcTemplate 를 사용한다.

    JdbcTemplate template;

UserRowMapper 클래스 생성

RowMapper 를 구현한다.

class UserRowMapper implements RowMapper<UserVO>{

    @Override
    public UserVO mapRow(ResultSet arg0, int arg1) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }
    
}

컬럼데이터를 바이딩해 준다.

class UserRowMapper implements RowMapper<UserVO> {

    @Override
    public UserVO mapRow(ResultSet rs, int index) throws SQLException {
        UserVO vo = new UserVO();
        vo.setUserid(rs.getString("userid"));
        vo.setUsername(rs.getString("username"));
        vo.setUserpwd(rs.getString("userpwd"));
        vo.setAddress(rs.getString("address"));
        vo.setEmail(rs.getString("email"));
        vo.setPhone(rs.getString("phone"));

        return vo;
    }

}

코드 간략화가 된다.

A 라는 클래스를 만든다.

class A { }

inner class 로 생성하면 A 가 가진 자원을 가져다 쓸 수 있다.

class A {
    class B { }
 }

이벤트 핸들링 하는 경우 무명 클래스 사용하는 경우가 있음

JdbcTemplate 가진 API 를 이해한다.

@Override
public List<UserVO> getUserList() {
    System.out.println("UserDAO_Spring 기반 연동");
    String sql = "select * from userinfo ";
    return template.query(sql, new UserRowMapper());
}

template.query 를 사용한다.

JdbcTemplate 은 DataSource 정보가 필요하다.

    public JdbcTemplate(DataSource dataSource) {
        setDataSource(dataSource);
        afterPropertiesSet();
    }

BasicDataSource 를 사용한다.

BasicDataSource dataSource = new BasicDataSource();

dataSource 는 서버가 관리하는 자원이다.

applicationContext.xml 파일에 추가한다.
BasicDataSource 를 생성한다.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
           p:driverClassName="oracle.jdbc.OracleDriver"
           p:url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
           p:username="hr"
           p:password="hr"/>

jdbcTemplate 클래스를 생성한다.

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

@Autowired 를 사용한다.

    @Autowired
    JdbcTemplate template;

spring 에서 jdbctemplate 을 제공하고 있다.

searchUser 메소드를 구현한다.

    @Override
    public List<UserVO> searchUser(String condition, String keyword) {
        System.out.println("UserDAO_Spring 기반 연동");
        String sql = "select * from userinfo where " + condition
                + " like  '%'||?||'%'  ";

        return template.query(sql, new Object[]{keyword}, new UserRowMapper());        
    }

실행 결과

========= 검색 =======
UserDAO_Spring 기반 연동
(searchUser) 메소드 수행에 걸린 시간: 67ms
UserVO [userid=admin, username=관리자, userpwd=a1234, email=admin@mc.co.kr, phone=02-1234, address=서울 역삼]

getUser 구현

    @Override
    public UserVO getUser(String id) {
        String sql = "select * from userinfo where userid = ?";        
        return template.queryForObject(sql, new Object[]{id}, new UserRowMapper());        
    }

queryForObject 는 결과가 1개 인 것을 예상하는 것이다.

login 구현

@Override
public UserVO login(String id, String pw) {
    System.out.println("UserDAO_Spring 기반 연동");
    String sql = "select * from userinfo where userid=? and userpwd = ?";
    return template.queryForObject(sql, new Object[]{id, pw}, new UserRowMapper());
}

? 가 두 개 있으므로, new Object[]{id, pw} 로 id, pw 를 넘겨준다.

실행코드

        String[] config = {"applicationContext.xml"};
        ApplicationContext context = new ClassPathXmlApplicationContext(config);
        
        UserService service = (UserService) context.getBean("service");        
        service.login("admin", "a1234");

실행결과

UserDAO_Spring 기반 연동
로그인 되었습니다. admin님
(login) 메소드 수행에 걸린 시간: 680ms

실패 하게 만들면? 예외가 발생한다.

Exception in thread "main" org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

예외 처리를 해줘야 한다.

예외가 발생하면 null 을 리턴한다.

@Override
public UserVO login(String id, String pw) {
    System.out.println("UserDAO_Spring 기반 연동");
        String sql = "select * from userinfo where userid=? and userpwd = ?";
    UserVO vo = null;
    try {
        vo = template.queryForObject(sql, new Object[]{id, pw}, new UserRowMapper());            
    } catch (Exception e) {    }

    return vo;
}

1개가 나오면 로그인 성공, 0개가 나오면 로그인 실패

addUser 메소드 구현

@Override
public int addUser(UserVO user) {
    String sql = "insert into userinfo (userid, username, userpwd, email, phone,address) "
            + " values (?,?,?,?,?,?)";
    return template.update(sql, user.getUserid(), user.getUsername(), user.getUserpwd(), user.getEmail(), user.getPhone(), user.getAddress());
}

userUser, removeUser 메소드 구현

@Override
public int updateUser(UserVO user) {
    String sql = "update userinfo set email=?,phone=?,address=? where userid  = ? ";
    return template.update(sql, user.getEmail(), user.getPhone(), user.getAddress(), user.getUserid());
}

@Override
public int removeUser(String id) {
    String sql = "delete from userinfo where  userid  = ? ";
    return template.update(sql, id);
}


'Programming > Spring' 카테고리의 다른 글

[spring] iBatis 구현  (0) 2016.04.25
[spring] iBatis, MyBatis Framework 아키텍처  (0) 2016.04.24
[spring] 데이터 접근 디자인 패턴  (0) 2016.04.23
[spring] 다국어 지원  (0) 2016.04.22
[spring] Annotation 기반 AOP 설정  (0) 2016.04.22

댓글