1. DB와 연동하기 위해 환경 Setting
새로운 프로젝트를 만들기위해 NEW> Spring Legacy Project 클릭
프로젝트 이름은 SpringjdbcTemplate
자바콘솔에서 볼 경우는 Simple Spring Utility Project를 선택해주고
웹에서 볼 경우는 Spring MVC Project를 선택해주면 된다.
패키지 이름은 com.exe.springjdbctemplate로 해준다.
스프링에서 DB를 사용하는 방법은 대표적으로 두가지가 있다.
1. mybatis
2. Spring dao
-테이블 생성
create table custom
(id number,
name char(10),
age number)
저장소를 제공하면 내가 따로 lib를 추가해줄 필요없이 스프링이 자동으로 가져와준다.
Maven이 그 저장소 역할을 한다.
**maven에 라이브러리 추가
-링크: https://mvnrepository.com/
1. Commons DBCP 검색 > 1.4 클릭
하단에 이부분 복붙해서 pom.xml에 붙여넣는다.(pom.xml이 Maven의 환경설정 파일)
2. pool 검색>Commons Pool 1.6도 똑같이 넣어준다.
-pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <dependencies> <!-- 생략 --> <!-- commons-dbcp --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!-- commons-pool --> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> </dependencies> </project> | cs |
: dbcp와 pool을 추가해주었다.
-설치된 라이브러리 파일 확인
C:\Users\itwill\.m2\repository 여기 경로에 lib파일 확인 할수 있다.
2. 스프링에서 JDBC 사용
-CutomDTO 클래스 파일 생성
1 2 3 4 5 6 7 8 9 10 | package com.exe.springjdbctemplate; public class CustomDTO { private int id; private String name; private int age; //getter,setter 생략... } | cs |
-app-context.xml을 프로젝트 패키지에 복사한뒤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?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"></property> </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.12:1521:TestDB" p:username="suzi" p:password="a123" /> </beans> | cs |
: 사용자 정의 파일인 p를 써주고,
db정보인 dataSource 써주고, 그리고 sql문을 적어줄 DAO객체도 생성해준다.
-파일 구조
-CustomDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | 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; //insert 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; } //select 모든 데이터 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; } //update 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; } //select 1개의 데이터 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; } //delete public int deleteDate(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; } } | cs |
-CustomMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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"); CustomDTO dto; dto=new CustomDTO(); dto.setId(111); dto.setName("배수지"); dto.setAge(25); dao.insertData(dto); System.out.println("insert 완료!"); } } | cs |
-실행화면
(자바 콘솔창)
(cmd 창)
: DB에서도 잘 들어간것을 알 수 있다.
** 위에 코드로 DB 연결이 안될 경우 해결방법
위처럼 코딩을 한 경우에 DB에 연결이 안되는 경우가 있다.
이럴 때는 오라클 lib를 pom.xml에 추가해주어야한다. 추가해주어야 할 것은 아래와 같다.
1. ojdbc6 lib
2. 오라클 lib : 오라클은 직접 lib을 못가져다쓰게 해놔서 코드를 좀 다르게 써주어야한다.
-링크: https://mvnrepository.com/
1. ojdbc6 검색>12.1.0.1 버전 선택
-pom.xml의 dependencies 안에 아래 코드 추가해준다.
1 2 3 4 5 6 7 | <!-- ojdbc6 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>12.1.0.1-atlassian-hosted</version> <scope>test</scope> </dependency> | cs |
2. oracle lib 추가
아까의 페이지에서 아래의 Atlassian 3rdParty버튼 눌러서
: 이 url을 붙여서 아래의 코드의 url에 써준다.
-pom.xml의 dependencies 밖에 아래 코드 써준다.
1 2 3 4 5 6 7 | <repositories> <repository> <id>oracle</id> <name>Oracle JDBC Repository</name> <url>https://packages.atlassian.com/maven-3rdparty/</url> </repository> </repositories> | cs |
-CustomMain.java에서 update,select 등 해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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"); CustomDTO dto; /* dto=new CustomDTO(); dto.setId(111); dto.setName("배수지"); dto.setAge(25); dao.insertData(dto); System.out.println("insert 완료!"); */ //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(22); dao.updateData(dto); //delete dao.deleteDate(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 완료!"); } } | cs |
-실행화면
3. 스프링에서 Spring JDBC 사용
-링크: https://mvnrepository.com/artifact/org.springframework/spring-jdbc/5.1.6.RELEASE
spring-jdbc 검색 후 전과 똑같이 하단의 코드를 pom.xml에 붙여넣는다.
대신 버전은 ${spring.framework.version}이렇게 써줘야한다. (위의 spring.framework.version을 바꾸면 같이 바뀌게)
-pom.xml
1 2 3 4 5 6 | <!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.framework.version}</version> </dependency> | cs |
**Spring JDBC 사용하려면...
-app-context.xml에 추가
: Spring JDBC써줄려면 jdbcTemplate만들어 주어야한다.
-CustomDAO2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 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; //insert 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()); } //select 모든 데이터 public List<CustomDTO> getList(){ StringBuilder sql=new StringBuilder(); sql.append("select id,name,age from custom"); List<CustomDTO> lists=jdbcTemplate.query(sql.toString(), new RowMapper<CustomDTO>() { //RowMapper가 while문같은 역할 //ResultSet에 select한 결과를 담아서 dto에 반환한다. //그거를 위에 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; } //select 1개의 데이터 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; } //update 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()); } //delete public void deleteDate(int id) { StringBuilder sql=new StringBuilder(); sql.append("delete from custom where id=?"); jdbcTemplate.update(sql.toString(),id); } } | cs |
-CustomMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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"); CustomDTO dto; /* dto=new CustomDTO(); dto.setId(555); dto.setName("전정국"); dto.setAge(23); dao.insertData(dto); System.out.println("insert 완료!"); */ //Oneselect dto=dao.getReadData(555); 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(22); dao.updateData(dto); //delete dao.deleteDate(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 완료!"); } } | cs |
-실행화면
4. Spring JDBC 중 NamedParameterJdbcTemplate
-app-context.xml에 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!-- Spring JDBC --> <bean id="customDAO2" class="com.exe.springjdbctemplate.CustomDAO2"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> <property name="namedJdbcTemplate" ref="namedParameterJdbcTemplate"></property><!-- 여기도 추가 --> </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.12:1521:TestDB" p:username="suzi" p:password="a123" /> | cs |
: Spring JDBC를 쓴부분에 named~ 객체를 추가하고 customDAO2에 property(메소드)의 매개변수로 추가해주었다.
-CustomDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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; //insert 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()); */ 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); } | cs |
: 예시로 insert부분만 구현해 보았다.
그냥 Spring JDBC와는 차이점은
NamedParameterJdbcTemplate은 sql문에서 매개변수로 보내줄 때 ?대신 :id, :name 이런 식으로 보내준다.
-CustomMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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"); CustomDTO dto; //insert dto=new CustomDTO(); dto.setId(444); dto.setName("김지은"); dto.setAge(20); 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 완료!"); } } | cs |
-실행화면