본문 바로가기
Programming/Spring Boot

Spring 기반의 DB 연동 - mybatis + mysql: 연동2 - @Mapper 인터페이스(TodoMapper.java) + TodoMapper.xml 연동

by yoon9i 2024. 7. 2.

6> mybatis + mysql: 연동2 - @Mapper 인터페이스(TodoMapper.java) + TodoMapper.xml 연동

가. 기존 repository 삭제
나. cohttp://m.exam.config.TodoMapper.xml 과 동일한 위치에
                    TodoMapper.java 인터페이스 작성.
다. TodoMapper.xml 의 namespace 값과 TodoMapper 인터페이스 경로와 반드시 일치해야 된다.

      // TodoMapper.xml
      <mapper namespace="cohttp://m.exam.config.TodoMapper"></mapper>

      // TodoMapper 인터페이스
      package cohttp://m.exam.config;

      public interface TodoMapper {

      }

라. TodoMapper.java 인터페이스에 @Mapper 어노테이션 지정
마. TodoMapper.java 인터페이스의 메서드명과 TodoMapper.xml 의 id 와 반드시 일치해야 된다.

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.dto.TodoDTO;
import com.exam.service.TodoMyBatisMySQLServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner{

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
	ApplicationContext ctx;

	@Override
	public void run(String... args) throws Exception {
		logger.info("logger:ApplicationContext:{}",ctx);
		
		TodoMyBatisMySQLServiceImpl service =
				ctx.getBean("todoService",TodoMyBatisMySQLServiceImpl.class);
				
		// 저장
		service.save(new TodoDTO(6, "github공부", "홍길동"));
		
		// 수정
		service.update(new TodoDTO(6, "git 및 github 공부", "홍길동"));
		
		// 삭제
//		service.delete(2);
		
		// 전체조회
		List<TodoDTO> list = service.findAll();
		System.out.println(list);
		
	}

}
package com.exam.config; // TodoMapper.xml 의 namespace 경로와 동일

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.exam.dto.TodoDTO;

@Mapper
public interface TodoMapper {
	// 메서드 일치 & parameterType 일치
	public int save(TodoDTO todo); // 저장
	public int delete(int id); // 삭제
	public int update(TodoDTO todo); // 수정
	
	// parameterType 대신에 resultType 일치해야된다. 
	public TodoDTO findById(int id); // 단일조회
	public List<TodoDTO> findAll();; // 전체조회
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.exam.config.TodoMapper">
	
	<insert id="save" parameterType="TodoDTO">
		insert into todo (id,name,author)
		values (#{id}, #{name}, #{author})
	</insert>
	
	<delete id="delete" parameterType="int">
		delete from todo
		where id = #{id}
	</delete>
	
	<update id="update" parameterType="TodoDTO">
		update todo
		set name = #{name}, author= #{author}
		where id = #{id}
	</update>
	
	<select id="findById" parameterType="int" resultType="TodoDTO">
		select id,name,author
		from todo
		where id = #{id}
	</select>
	
	<select id="findAll" resultType="TodoDTO">
		select id,name,author
		from todo
	</select>
</mapper>
package com.exam.dto;

import org.apache.ibatis.type.Alias;

@Alias("TodoDTO")
public class TodoDTO {
	int id;
	String name;
	String author;
	public TodoDTO() {
		super();
		// TODO Auto-generated constructor stub
	}
	public TodoDTO(int id, String name, String author) {
		super();
		this.id = id;
		this.name = name;
		this.author = author;
	}
	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 String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	@Override
	public String toString() {
		return "TodoDTO [id=" + id + ", name=" + name + ", author=" + author + "]";
	}
	
	
}
package com.exam.repository;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.exam.dto.TodoDTO;

@Repository("todoRepository")
public class TodoMyBatisMySQLRepository {
	
//	@Autowired
	SqlSessionTemplate session;

	public TodoMyBatisMySQLRepository(SqlSessionTemplate session) {
		super();
		this.session = session;
	}
	
	// 저장
	public int save(TodoDTO todo) {
		int n = session.insert("com.exam.config.TodoMapper.save",todo);
		
		return n;
	}
	
	// 삭제
	public int delete(int id) {
		int n = session.delete("com.exam.config.TodoMapper.delete", id);
		
		return id;
	}
	
	// 수정
	public int update(TodoDTO todo) {
		int n = session.delete("com.exam.config.TodoMapper.update", todo);
		
		return n;
	}
	
	// 단일조회
	public TodoDTO findById(int id) {
		return session.selectOne("com.exam.config.TodoMapper.findById",id);
	}
	
	// 전체조회
	public List<TodoDTO> findAll() {
		return session.selectList("com.exam.config.TodoMapper.findAll");
	}
	
}
package com.exam.service;

import java.util.List;

import com.exam.dto.TodoDTO;

public interface TodoMyBatisMySQLService {
	public int save(TodoDTO todo); // 저장
	public int delete(int id); // 삭제
	public int update(TodoDTO todo); // 수정
	public TodoDTO findById(int id); // 단일조회
	public List<TodoDTO> findAll(); // 전체조회
}
package com.exam.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.exam.config.TodoMapper;
import com.exam.dto.TodoDTO;
import com.exam.repository.TodoMyBatisMySQLRepository;

@Service("todoService")
public class TodoMyBatisMySQLServiceImpl implements TodoMyBatisMySQLService {
	
//	@Autowired
	TodoMapper repository;
	
	// @Autowired 대신에 생성자로 주입
	public TodoMyBatisMySQLServiceImpl(TodoMapper repository) {
		super();
		this.repository = repository;
	}

	// 저장
	@Override
	public int save(TodoDTO todo) {
		// TODO Auto-generated method stub
		return repository.save(todo);
	}

	// 삭제
	@Override
	public int delete(int id) {
		// TODO Auto-generated method stub
		return repository.delete(id);
	}

	// 수정
	@Override
	public int update(TodoDTO todo) {
		// TODO Auto-generated method stub
		return repository.update(todo);
	}

	// 단일조회
	@Override
	public TodoDTO findById(int id) {
		// TODO Auto-generated method stub
		return repository.findById(id);
	}

	// 전체조회
	@Override
	public List<TodoDTO> findAll() {
		// TODO Auto-generated method stub
		return repository.findAll();
	}

}
# application.properties
logging.level.org.springframework=info

# DB 연동위한 4가지 정보 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=1234

# 별칭
mybatis.type-aliases-package=com.exam.dto

# Mapper 등록
# mybatis.mapper-locations=com/exam/config/*Mapper.xml : 모든 Mapper를 등록
# mybatis.mapper-locations=com/exam/config/TodoMapper.xml
mybatis.mapper-locations=com/exam/config/*Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
  <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
  <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.4</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.33</version>
  </dependency>		
		

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>