Spring - JDBC(mysql)

2020. 9. 1. 13:35Java/Spring

반응형

- Spring FrameworkJDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공하고 있다.

- JdbcTemplate 클래스는 SQL 쿼리문을 손쉽게 구현할 수 있도록 구현되어 있다.

 

1. 라이브러리 추가하기

 

https://mvnrepository.com/search?q=spring+jdbc

 

Maven Repository: spring jdbc

Spring Context Last Release on Jul 21, 2020

mvnrepository.com

위 사이트에서 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