ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] MyBatis Spring과 연동하는 방법
    Web/Servlet && Spring 2019. 9. 2. 00:12

    에러때문에 꽤 애를 먹었다.

     

    pom.xml추가(DB사용을 위한 mysql과 mybatis설정)

    스프링3에서는 마이바티스 버젼을 꼭 아래와 같이 해야 한다.

    그렇지 않으면 프로젝트 실행시 OutOfBounds라는 무시무시한 에러가 난다.

    <!-- DB -->
    		<!-- 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>
    			<!-- mariadb와 mysql은 커넥터를 같은 것을 사용할 수 있다. -->
    			<artifactId>mysql-connector-java</artifactId>
    			<version>8.0.17</version>
    		</dependency>
    
    		<!-- mybatis -->
    		<dependency>
    			<groupId>org.mybatis</groupId>
    			<artifactId>mybatis</artifactId>
    			<version>3.4.6</version>
    		</dependency>
    		<dependency>
    			<groupId>org.mybatis</groupId>
    			<artifactId>mybatis-spring</artifactId>
    			<version>1.3.2</version>
    		</dependency>

    이유는 마이바티스 홈페이지에 친절히 설명되어 있다. myBatis버전에 따른 Spring버젼을 잘 살펴 보도록...

     

    servlet-context.xml 구문 추가

    <!-- Mybatis -->
    	<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<beans:property name="dataSource" ref="dataSource"/>
    		<!-- classpath는 resources까지 잡힌다. -->
    		<beans:property name="mapperLocations" value="classpath:mappers/*Mapper.xml"></beans:property>
    	</beans:bean>
    	<beans:bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    		<beans:constructor-arg ref="sqlSessionFactory"/>
    	</beans:bean>
    	<beans:bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<beans:property name="basePackage" value="com.myway.tok.mybatis"></beans:property>
    	</beans:bean>

    Student.xml파일을 만든다. (resource패키지의 mappers폴더 안으로)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <!-- mapper -->
    <mapper namespace="com.myway.tok.mybatis.MyBatisDao">
    	<select id="findAllStudent" resultType="com.myway.tok.model.Student">
    		SELECT * FROM student
    	</select>	
    </mapper>

    MyBatisDao.java 파일 생성

    public interface MyBatisDao {
    	public List<Student> findAllStudent();
    	
    	public Student findStudent(Integer seq);
    }

    MyBatisDaoImpl.java 만들기 implements MybatisDao

    @Repository // 스프링에서 관리하는 빈이 되는것 xml등록
    public class MyBatisDaoImpl implements MyBatisDao {
    
    	@Autowired
    	private SqlSession sqlSession;
    	// mapper파일이 하나일땐 nm를 자동으로 맞춰준다. 하지만 파일이 여러개일 경우에는 내가 사용할 메퍼로 정확하게 메핑을 해줘야
    	// 한다.
    	private static final String NAME_SPACE = "com.myway.tok.mybatis.MyBatisDao";
    
    	@Override
    	public List<Student> findAllStudent() {
    
    		return sqlSession.selectList(NAME_SPACE + ".findAllStudent");
    	}
    
    	@Override
    	public Student findStudent(Integer seq) {
    		return sqlSession.selectOne(NAME_SPACE + ".findStudent", seq);
    	}
    }

    MyBatisService.java를 만든다.

    DAO도 있고 DAOImpl도 있는데 왜 Service를 만드느냐?

    비즈니스 로직을 분산시키기 위해서이다. Dao에서는 데이터에 접근만 하고 Service에서는 출력된 결과를 활용하는 작업을 한다. 

    예를 들어 insert 한행이 들어갔다. 그럼 return값은 true.. 이런것도 서비스가 하는 역할이다.

    @Service
    public class MyBatisService {
    	@Autowired
    	private MyBatisDao myBatisDao;
    
    	public List<Student> findAllStudent() {
    		return myBatisDao.findAllStudent();
    	}
    
    	public Student findStudent(Integer seq) {
    		return myBatisDao.findStudent(seq);
    	}
    }

    MyBatisController.java생성

    @Controller
    public class MyBatisController {
    
    	@Autowired
    	private MyBatisService myBatisService;
    
    	@RequestMapping(value = "/mybatis/list.do", method = RequestMethod.GET)
    	public String getStudentList(Model model) {
    		List<Student> students = myBatisService.findAllStudent();
    		model.addAttribute("students", students);
    		return "student/list";
    
    	}
    
    	@RequestMapping(value = "/mybatis/student_list.do", method = RequestMethod.GET)
    	public String getStudent(Model model,
    			@RequestParam(value = "seq", required = false, defaultValue = "0") Integer seq) {
    		Student student = myBatisService.findStudent(seq);
    		model.addAttribute("student", student);
    
    		return "student/result";
    	}
    }

     

    반응형

    댓글

Designed by Tistory.