2020. 9. 1. 13:35ㆍJava/Spring
- Spring Framework는 JDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공하고 있다.
- JdbcTemplate 클래스는 SQL 쿼리문을 손쉽게 구현할 수 있도록 구현되어 있다.
1. 라이브러리 추가하기
https://mvnrepository.com/search?q=spring+jdbc
위 사이트에서 spring jdbc를 검색하여 맨 위 Spring jdbc를 클릭한다.
가장 최신버전으로 들어가 dependency를 가져와 pom.xml에 추가한다.
그 다음으로 mysql connecter를 설치하기 위해 spring mysql을 검색한다.
해당 MySQL Connector의 최신버전 dependency를 pom.xml에 추가한다.
그리고 dbcp를 설치한다.
dbcp는 커넥션풀을 더 쉽게 다룰 수 있도록 도와준다.
pom.xml 의 전체 코드
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cookingcoding</groupId>
<artifactId>SpringJDBC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- xml에서 사용할 속성들 -->
<properties>
<!-- 자바버전 -->
<java-version>1.8</java-version>
<!-- 스프링 버전 -->
<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
<!-- <org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
<org.slfrj-version>1.7.26</org.slfrj-version>
<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
<javax.annotation-version>1.3.2</javax.annotation-version>
<org.aspectj-version>1.9.6</org.aspectj-version>
<mysql-version>8.0.21</mysql-version>
<org.apache.commons-version>2.7.0</org.apache.commons-version>
</properties>
<dependencies>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- slf4j -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slfrj-version}</version>
</dependency>
<!-- logback -->
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>${javax.annotation-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${org.apache.commons-version}</version>
</dependency>
</dependencies>
</project>
2. 데이터베이스 연결하기
beanConfigClass에 데이터베이스 연결을 위한 빈객체를 설정한다.
@Configuration
@ComponentScan(basePackages = {"cookingcoding.beans","cookingcoding.db"})
public class beanConfigClass {
@Bean
public BasicDataSource source() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("com.mysql.cj.jdbc.Driver");
source.setUrl("jdbc:mysql://localhost/spring_study?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&validationQuery=select 1&characterEncoding=UTF-8");
source.setUsername("root");
source.setPassword("1234");
return source;
}
//source가 자동으로 주입이 됨!
@Bean
public JdbcTemplate db(BasicDataSource source) {
JdbcTemplate db = new JdbcTemplate(source);
return db;
}
}
위와 같이 설정하면 mysql에 연결 커넥션이 db 메소드에 자동으로 주입이 된다.
jsp에서 사용하던 Connection,pool등을 직접 설정하지 않아도 된다.
mysql에 다음과 같이 간단한 테이블을 만들어준다.
create table springjdbc(numarea int(10),chararea char(10));
이와 같은 빈 객체를 생성한다.
@Component
@Scope("prototype")
public class JdbcBean {
private int numarea;
private String chararea;
public int getNumarea() {
return numarea;
}
public void setNumarea(int numarea) {
this.numarea = numarea;
}
public String getChararea() {
return chararea;
}
public void setChararea(String chararea) {
this.chararea = chararea;
}
}
3. 데이터베이스 사용하기
기본적인 사용을 위한 세팅을 모두 마쳤다.
@Component
public class JdbcDAO {
//JDBC 관리 객체를 주입 받는다.
@Autowired
private JdbcTemplate db;
}
위 객체에서 JdbcTemplate db 는 자동으로 JdbcTemplate 객체를 주입받는다. (연결정보를 얻어온다.)
기본적인 insert 메서드다.
public void insert_data(JdbcBean bean) {
String sql = "insert into springjdbc (numarea, chararea) value (?, ?)";
db.update(sql,bean.getNumarea(),bean.getChararea());
}
preparestatement등을 구현 할 필요가 없고 sql구문과 update를 통해서 동작시키면 된다.(나머지는 알아서 해준다.)
db.update(sql,첫 ?,두번째 ?) => 물음표의 순서에 맞춰서 주입할 값을 넣어야 한다.
public class MainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(beanConfigClass.class);
JdbcDAO dao = ctx2.getBean(JdbcDAO.class);
JdbcBean jd1 = new JdbcBean();
jd1.setChararea("첫번째");
jd1.setNumarea(1);
jd1.setNumarea(2);
jd1.setChararea("두번째");
dao.insert_data(jd1);
ctx2.close();
}
}
위와 같이 insert를 실행시키면 아래와 같이 db에 값이 주입된다.
update,delete는 sql 구문만 수정하고 동작 원리는 같다.
@Component
public class JdbcDAO {
//JDBC 관리 객체를 주입 받는다.
@Autowired
private JdbcTemplate db;
public void insert_data(JdbcBean bean) {
String sql = "insert into springjdbc (numarea, chararea) value (?, ?)";
db.update(sql,bean.getNumarea(),bean.getChararea());
}
public void update_data(JdbcBean bean) {
String sql = "update springjdbc set chararea = ? where numarea = ?";
db.update(sql,bean.getChararea(),bean.getNumarea());
}
public void delete_data(int data1) {
String sql = "delete from springjdbc where numarea = ?";
db.update(sql,data1);
}
}
select를 사용하는 방법은 좀 다르다. 먼저 MapperClass가 필요하다. db 패키지에 MapperClass를 생성한다.
@Component
public class MapperClass implements RowMapper<JdbcBean>{
public JdbcBean mapRow(ResultSet rs, int rowNum) throws SQLException {
return null;
}
}
해당 클래스는 RowMapper<사용되는 빈객체> 를 인터페이스로 상속한다.
자동으로 mapRow메서드를 오버라이딩 하는데 이 메서드에 ResultSet, rowNum이 매개변수로 주어진다.
Select문을 데이터를 가져올 때 어떤 컬럼의 값을 bean 어디에 주입할 것인지 결정을 해줘야 하는데 이 역할을 하는 클래스를 Mapper 클래스라고 부른다.
@Component
public class MapperClass implements RowMapper<JdbcBean>{
public JdbcBean mapRow(ResultSet rs, int rowNum) throws SQLException {
JdbcBean bean = new JdbcBean();
bean.setNumarea(rs.getInt("numarea"));
bean.setChararea(rs.getString("chararea"));
return bean;
}
}
위와 같이 메서드를 정의하면 bean 객체에 해당 데이터베이스의 값들을 담아서 객체를 리스트로 자동으로 반환한다.
JdbcDAO에서 다음과 같이 MapperClass를 자동주입 받는다.
//Mapper를 주입 받는다.
@Autowired
private MapperClass mapper;
mapper의 객체들을 list로 받아서 리턴해준다.
//mapper 가져오기
public List<JdbcBean> select_data(){
String sql = "select * from springjdbc";
List<JdbcBean> list = db.query(sql, mapper);
return list;
}
JdbcDAO의 전체 코드이다.
@Component
public class JdbcDAO {
//JDBC 관리 객체를 주입 받는다.
@Autowired
private JdbcTemplate db;
//Mapper를 주입 받는다.
@Autowired
private MapperClass mapper;
public void insert_data(JdbcBean bean) {
String sql = "insert into springjdbc (numarea, chararea) value (?, ?)";
db.update(sql,bean.getNumarea(),bean.getChararea());
}
//mapper 가져오기
public List<JdbcBean> select_data(){
String sql = "select * from springjdbc";
List<JdbcBean> list = db.query(sql, mapper);
return list;
}
public void update_data(JdbcBean bean) {
String sql = "update springjdbc set chararea = ? where numarea = ?";
db.update(sql,bean.getChararea(),bean.getNumarea());
}
public void delete_data(int data1) {
String sql = "delete from springjdbc where numarea = ?";
db.update(sql,data1);
}
}
위 코드들을 실행하기 위한 MainClass
public class MainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(beanConfigClass.class);
JdbcDAO dao = ctx2.getBean(JdbcDAO.class);
JdbcBean jd1 = new JdbcBean();
jd1.setChararea("수정");
jd1.setNumarea(1);
/*
jd1.setNumarea(2);
jd1.setChararea("두번째");
dao.insert_data(jd1);
*/
dao.update_data(jd1);
dao.delete_data(1);
List<JdbcBean> list = dao.select_data();
for(JdbcBean bean3:list) {
System.out.println("numarea =>"+bean3.getNumarea());
System.out.println("chararea =>"+bean3.getChararea());
System.out.println("==============================");
}
ctx2.close();
}
}
삭제 및 출력이 잘 된다.
'Java > Spring' 카테고리의 다른 글
Spring(MVC) - 기본세팅(1) (0) | 2020.09.02 |
---|---|
Spring - mybatis (0) | 2020.09.01 |
Spring - @AspectJ (0) | 2020.08.31 |
Spring - execution 사용법 (0) | 2020.08.30 |
Spring - AOP (0) | 2020.08.29 |