스프링에서 데이터베이스를 사용하는 방법 - 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의 위치정보를 알려줘야한다.
<?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 제어의 역전
<?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 |