Dev/Spring

Spring3.0 - DAO(JDBC)

창문닦이 2019. 4. 16. 16:32

스프링에서 데이터베이스를 사용하는 방법 - POJO program + JDBC

DB를 사용하는 방법은 두가지 Spring ORM(myBatis) 와 Spring DAO 를 활용하는 것.

우리는 지금까지 spring core를 기반으로 spring web 모듈을 사용한 것.

1. spring Legacy Project 생성 - SpringJdbcTemplate

자바 콘솔 프로그램으로 진행할것이므로 유틸리티 프로젝트


2. DB 접속하여 테이블 생성


CREATE TABLE CUSTOM

(ID NUMBER,

NAME CHAR(10),

AGE NUMBER);

Maven을 통한 라이브러리 설치

Maven을 설치하는 방법은 여러가지.

Maven에 저장소 존재. 독립된 프로그램을 만들때 lib파일을 구해야 함. 그런데 버전에 따른 라이브러리간에 의존성문제 발생. 메이븐을 이용하면 버전에 맞추어 저장소에 맞춰 받아준다.

이 저장소 사이트는 https://mvnrepository.com/ 이다.

인터넷을 통해 라이브러리를 가져올 수 있는 기능들은 다양하다. 우리는 메이븐을 사용할 것이다.

pom.xml (메이븐의 환경설정 파일) 여기에 설정된 라이브러리 버전이 적혀있다.

맞는지 확인하고 싶다면 C:\Users\itwill\.m2\repository 로 확인하면된다.

EL로 되어있어서 <spring.framework.version>을 고치게 되면 설정이 알아서 수정된다.

실제 저장경로로 가서 확인을 하면 동일 버전의 스프링 프레임워크가 설치되어 있다.

① commons-dbcp 설치


<!-- commons-dbcp -->

<dependency>

   <groupId>commons-dbcp</groupId>

   <artifactId>commons-dbcp</artifactId>

   <version>1.4</version>

</dependency>

- pom.xml에 해당 Maven내용 추가

- 실제 디렉토리에 라이브러리 설치가 된 모습


② commons-pool 설치

- pom.xml에 해당 Maven내용 추가

③ OJDBC6 설치

https://mvnrepository.com/artifact/com.oracle/ojdbc6


<!-- ojdbc6 -->

<dependency>

   <groupId>com.oracle</groupId>

   <artifactId>ojdbc6</artifactId>

   <version>12.1.0.1-atlassian-hosted</version>

   <scope>test</scope>

</dependency>


메이븐 환경설정파일인 pom.xml에 반영후 저장하면 m2에 레퍼지토리에 추가됨. 그런데 lib파일은 없음.

오라클은 외부 액세스에 대해 보안이 철저한 편.


https://mvnrepository.com/repos/atlassian-packages-3rdparty

- pom.xml에 해당 Maven내용 추가

외부 라이브러리는 dependencies태그 바깥에 작성을한다.

- 실제 디렉토리에 라이브러리 설치가 된 모습

저장 후 프로젝트 마우스 우클릭 > MAVEN > UPDATE PROJECT 시 jar 파일이 셋팅되었다.


1. CustomDTO 생성

package com.exe.springjdbctemplate;

public class CustomDTO {

private int id;

private String name;

private int age;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

2. DAO Bean 객체 생성

src/main/java/app-context.xml 생성

xmlns:p="http://www.springframework.org/schema/p"  사용자정의 문법을 쓰기 위해서 작성

스프링에게 DB의 위치정보를 알려줘야한다.

DAO만들때 생성자를 통해 connectin을 주입했었음 그 작업도 추가 setter로 초기화

<?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:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

https://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/p">

<description>Example configuration to get you started.</description>

<context:component-scan base-package="com.exe.springjdbctemplate" />

<bean id="customDAO"

class="com.exe.springjdbctemplate.CustomDAO">

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

</bean>

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close"

p:driverClassName="oracle.jdbc.driver.OracleDriver"

p:url="jdbc:oracle:thin:@192.168.16.16:1521:TestDB"

p:username="SUZI"

p:password="A123">

</bean>

</beans>

① 해당 클래스의 프로퍼티명 setDataSource를 찾아간다.

<bean id="customDAO" class="com.exe.springjdbctemplate.CustomDAO">

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

</bean>

② 의존성 주입으로 인해 dataSource 빈 객체도 같이 가져간다.

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

<bean id="dataSource"/>

3. CustomDAO 생성

package com.exe.springjdbctemplate;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import java.util.List;

import javax.sql.DataSource;

public class CustomDAO {

//메소드를 통한 의존성 주입

private DataSource dataSource;

public void setDataSource(DataSource dataSource) {

this.dataSource = dataSource;

}

Connection conn = null;

//입력

public int insertData(CustomDTO dto) {

int result = 0;

PreparedStatement pstmt = null;

String sql;

try {

conn = dataSource.getConnection();

sql = "insert into custom(id, name, age) values (?,?,?) ";

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1,dto.getId());

pstmt.setString(2,dto.getName());

pstmt.setInt(3,dto.getAge());

result = pstmt.executeUpdate();

pstmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}


//리스트조회

public List<CustomDTO> getList(){

List<CustomDTO> lists = new ArrayList<CustomDTO>();

PreparedStatement pstmt = null;

ResultSet rs = null;

String sql;

try {

conn = dataSource.getConnection();

sql = "select id,name,age from custom ";

pstmt = conn.prepareStatement(sql);

rs = pstmt.executeQuery();

while (rs.next()) {

CustomDTO dto = new CustomDTO();

dto.setId(rs.getInt("id"));

dto.setName(rs.getString("name"));

dto.setAge(rs.getInt("age"));

lists.add(dto);

}

rs.close();

pstmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return lists;

}


//단일조회

public CustomDTO getReadData(int id){

CustomDTO dto= null;

PreparedStatement pstmt = null;

ResultSet rs = null;

String sql;

try {

conn = dataSource.getConnection();

sql = "select id,name,age from custom where id=?";

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1,id);

rs = pstmt.executeQuery();

if (rs.next()) {

dto = new CustomDTO();

dto.setId(rs.getInt("id"));

dto.setName(rs.getString("name"));

dto.setAge(rs.getInt("age"));

}

rs.close();

pstmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return dto;

}


//수정

public int updateData(CustomDTO dto) {

int result = 0;

PreparedStatement pstmt = null;

String sql;

try {

conn = dataSource.getConnection();

sql = "update custom set name=?, age=? where id=?";

pstmt = conn.prepareStatement(sql);

pstmt.setString(1,dto.getName());

pstmt.setInt(2,dto.getAge());

pstmt.setInt(3,dto.getId());

result = pstmt.executeUpdate();

pstmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}


//삭제

public int deleteData(int id) {

int result = 0;

PreparedStatement pstmt = null;

String sql;

try {

conn = dataSource.getConnection();

sql = "delete from custom where id=?";

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1,id);

result = pstmt.executeUpdate();

pstmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

}

4. CustomMain (POJO 프로그램은 Main문이 필요함)

package com.exe.springjdbctemplate;

import org.springframework.context.support.GenericXmlApplicationContext;

public class CustomMain {

public static void main(String[] args) {

GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml");

CustomDAO dao = (CustomDAO)context.getBean("customDAO");//bean id=customDAO 를 호출

CustomDTO dto;

dto = new CustomDTO();

dto.setId(222);

dto.setName("홍길동");

dto.setAge(99);

dao.insertData(dto);

System.out.println("Insert 완료");

}

}

5. 출력 화면

콘솔

- DB 확인


6. CustomMain (select, update, delete)

package com.exe.springjdbctemplate;

import java.util.List;

import org.springframework.context.support.GenericXmlApplicationContext;

public class CustomMain {

public static void main(String[] args) {

GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml");

CustomDAO dao = (CustomDAO)context.getBean("customDAO");//bean id=customDAO 를 호출

CustomDTO dto;

//OneSelect

dto = dao.getReadData(222);

if(dto!=null) {

System.out.printf("%d %s %d\n", dto.getId(), dto.getName(), dto.getAge());

}

System.out.println("OneSelect 완료!");

//Update

dto = new CustomDTO();

dto.setId(111);

dto.setName("안젤리나");

dto.setAge(20);

dao.updateData(dto);

//Delete

dao.deleteData(222);

//Select

List<CustomDTO> lists = dao.getList();

for(CustomDTO dto1: lists) {

System.out.printf("%d %s %d\n", dto1.getId(), dto1.getName(), dto1.getAge());

}

System.out.println("Select 완료!");

}

}

7. 출력 화면

단일 조회

리스트 조회

수정 후 조회

삭제 후 조회



Spring-JDBC 

Spring-JDBC 라이브러리 설치

- pom.xml에 해당 Maven내용 추가

- 실제 디렉토리에 라이브러리 설치가 된 모습

1. app-context.xml 객체 생성

<?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:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

https://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/p">

<description>Example configuration to get you started.</description>

<context:component-scan base-package="com.exe.springjdbctemplate" />

<bean id="customDAO2"

class="com.exe.springjdbctemplate.CustomDAO2">

<property name="jdbcTemplate" ref="jdbcTemplate"/>

</bean>

<bean id="jdbcTemplate"

class="org.springframework.jdbc.core.JdbcTemplate">

<constructor-arg ref="dataSource"/>

</bean>

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close"

p:driverClassName="oracle.jdbc.driver.OracleDriver"

p:url="jdbc:oracle:thin:@192.168.16.16:1521:TestDB"

p:username="SUZI"

p:password="A123">

</bean>

</beans>

 2. DAO 작성 (스프링의 DAO)

package com.exe.springjdbctemplate;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

public class CustomDAO2 {

private JdbcTemplate jdbcTemplate;

//메소드를 통한 의존성 주입

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

Connection conn = null;

//입력

public void insertData(CustomDTO dto) {

StringBuilder sql = new StringBuilder();

sql.append("insert into custom(id, name, age) values (?,?,?)");

jdbcTemplate.update(sql.toString(),

dto.getId(), dto.getName(), dto.getAge());

}

//리스트조회

public List<CustomDTO> getList(){

StringBuilder sql = new StringBuilder();

sql.append("select id,name,age from custom ");

//RowMapper - 스프링에만 존재

//sql.toString()의 Select문의 결과를 rs에 할당

//RowMapper가 while문과 동일한 역할을 한다.

//CustomDTO를 반복문으로 읽어와서 RowMapper<CustomDTO>에 담아준다

//하나씩 반환되는 DTO데이터를 lists에 추가한다.

List<CustomDTO> lists = jdbcTemplate.query(sql.toString(), new RowMapper<CustomDTO>() {

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

CustomDTO dto = new CustomDTO();

dto.setId(rs.getInt("id"));

dto.setName(rs.getString("name"));

dto.setAge(rs.getInt("age"));

return dto;

}

});

return lists;

}

//단일조회

public CustomDTO getReadData(int id){

StringBuilder sql = new StringBuilder();

sql.append("select id,name,age from custom where id=?");

CustomDTO dtoOne = jdbcTemplate.queryForObject(sql.toString(),new RowMapper<CustomDTO>() {

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

CustomDTO dto = new CustomDTO();

dto.setId(rs.getInt("id"));

dto.setName(rs.getString("name"));

dto.setAge(rs.getInt("age"));

return dto;

}

},id);//조건절 매개변수

return dtoOne;

}

//수정

public void updateData(CustomDTO dto) {

StringBuilder sql = new StringBuilder();

sql.append("update custom set name=?, age=? where id=?");

jdbcTemplate.update(sql.toString(),dto.getName(), dto.getAge(), dto.getId());//물음표의 순서대로

}

//삭제

public void deleteData(int id) {

StringBuilder sql = new StringBuilder();

sql.append("delete from custom where id=?");

jdbcTemplate.update(sql.toString(), id);

}

}

3. CustomMain 클래스

package com.exe.springjdbctemplate;

import java.util.List;

import org.springframework.context.support.GenericXmlApplicationContext;

public class CustomMain {

public static void main(String[] args) {

GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml");

CustomDAO2 dao = (CustomDAO2)context.getBean("customDAO2");//bean id=customDAO2 를 호출

CustomDTO dto;

/*

dto = new CustomDTO();

dto.setId(333);

dto.setName("두시반");

dto.setAge(22);

dao.insertData(dto);

System.out.println("Insert 완료");

*/

//OneSelect

dto = dao.getReadData(333);

if(dto!=null) {

System.out.printf("%d %s %d\n", dto.getId(), dto.getName(), dto.getAge());

}

System.out.println("OneSelect 완료!");

//Update

dto = new CustomDTO();

dto.setId(333);

dto.setName("안젤리나");

dto.setAge(20);

dao.updateData(dto);

//Delete

dao.deleteData(333);

//Select

List<CustomDTO> lists = dao.getList();

for(CustomDTO dto1: lists) {

System.out.printf("%d %s %d\n", dto1.getId(), dto1.getName(), dto1.getAge());

}

System.out.println("Select 완료!");

}

}

4. 콘솔 출력 화면



NamedParameterJdbcTemplate

1. app-context.xml 제어의 역전

① customDAO2 객체 생성시 jdbcTemplate와 namedParameterJdbcTemplate 객체 필요
② jdbcTemplate와 namedParameterJdbcTemplate 객체 생성시 dataSource 객체 필요
③ dataSource 객체생성


<?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:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

https://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/p">

<description>Example configuration to get you started.</description>

<context:component-scan base-package="com.exe.springjdbctemplate" />

<bean id="customDAO2"

class="com.exe.springjdbctemplate.CustomDAO2">

<property name="jdbcTemplate" ref="jdbcTemplate"/>

<property name="namedJdbcTemplate" ref="namedParameterJdbcTemplate"/>

</bean>

<bean id="jdbcTemplate"

class="org.springframework.jdbc.core.JdbcTemplate">

<constructor-arg ref="dataSource"/>

</bean>

<bean id="namedParameterJdbcTemplate"

class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">

<constructor-arg ref="dataSource"/>

</bean>

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close"

p:driverClassName="oracle.jdbc.driver.OracleDriver"

p:url="jdbc:oracle:thin:@192.168.16.16:1521:TestDB"

p:username="SUZI"

p:password="A123">

</bean>

</beans>

2. DAO insert문만 수정(NamedParameterJdbcTemplate)

package com.exe.springjdbctemplate;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

public class CustomDAO2 {

private JdbcTemplate jdbcTemplate;

//메소드를 통한 의존성 주입

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

private NamedParameterJdbcTemplate namedJdbcTemplate;

//메소드를 통한 의존성 주입

public void setNamedJdbcTemplate(NamedParameterJdbcTemplate namedJdbcTemplate) {

this.namedJdbcTemplate = namedJdbcTemplate;

}

Connection conn = null;

//입력

public void insertData(CustomDTO dto) {

StringBuilder sql = new StringBuilder();

//jdbcTemplate

sql.append("insert into custom(id, name, age) values (?,?,?)");

jdbcTemplate.update(sql.toString(),

dto.getId(), dto.getName(), dto.getAge());

//namedJdbcTemplate

sql.append("insert into custom(id,name,age) values (:id,:name,:age)");

MapSqlParameterSource params = new MapSqlParameterSource();

params.addValue("id",dto.getId());

params.addValue("name",dto.getName());

params.addValue("age",dto.getAge());

namedJdbcTemplate.update(sql.toString(),params);

}

}

3. Main클래스

package com.exe.springjdbctemplate;

import java.util.List;

import org.springframework.context.support.GenericXmlApplicationContext;

public class CustomMain {

public static void main(String[] args) {

GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml");

CustomDAO2 dao = (CustomDAO2)context.getBean("customDAO2");//bean id=customDAO2 를 호출

CustomDTO dto;

//Insert

dto = new CustomDTO();

dto.setId(777);

dto.setName("네시");

dto.setAge(50);

dao.insertData(dto);

System.out.println("Insert 완료");

//Select

List<CustomDTO> lists = dao.getList();

for(CustomDTO dto1: lists) {

System.out.printf("%d %s %d\n", dto1.getId(), dto1.getName(), dto1.getAge());

}

System.out.println("Select 완료!");

}

}

4. 출력 콘솔 화면






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

Spring3.0 - AOP  (0) 2019.04.17
Spring3.0 - ORM(MyBatis)  (0) 2019.04.17
Spring3.0 MVC 예제(2)  (0) 2019.04.16
Spring3.0 MVC 예제(1)  (0) 2019.04.15
Spring3.0 - 제어의역전,의존성주입 복습  (0) 2019.04.15