Autowired와 Inject는 하는 일이 100%같다.
주입을 위해 지원하는 애너테이션 종류 3가지
-@Autowired(현업사용) : 스프링에서만 제공
-@Inject : 자바에서 제공
-@Resource : 해당 빈의 이름으로 찾음
주입의 종류 3가지
-생성자주입(추천)
-setter주입
-필드주입
1.SQL session에서 제공하는 함수를 활용 (interface class활용)
- interface IBDao를 XML namespace에 매핑 <mapper namespace="edu.bit.ex.board1.IBDao">
- sqlSession.getMapper(IBDao.class)를 이용.
2.CRUD SQL session 객체에서 제공하는 직접 xml연결하는 것
- interface는 필요가 없음
- sqlSession에서 제공하는 함수(selectList,selectOne)를 이용함
- 쿼리구현을 위한 XML이 필요. 해당 XML의 namespace는 개발자가가 정함
3. @Mapper사용
@Mapper // MyBatis 연결을 알려주는 것
public interface BoardMapper { // interface를 BoardMapper.xml에서 구현한다. >> Mybatis
@Select("select * from mvc_board order by bGroup desc, bStep asc") // Mybatis 3버전
public List<BoardVO> getList();
public BoardVO read(int bid); // 파라미터는 url로 넘어오는 bid값을 의미
public int update(BoardVO board); // 글수정
public int delete(BoardVO board); // 글삭제
public int insert(BoardVO board); // 글작성
//답글관리
public void updateShape(BoardVO board); // 답글위치
public void insertReply(BoardVO board); // 답글등록
//paging 관련
public abstract int getTotalCount();
public abstract List<BoardVO> getListWithPaging(Criteria cri);
}
4. interface위에 mapper정의해서 사용
@Mapper // MyBatis용 인터페이스라는 것을 알려주는 어노테이션
//SecurityConfig.java의 Bean을 끌고옴
public interface UserMapper {
public UserVO getUser(String username);
@Insert("insert into users(username,password,enabled) values(#{username},#{password},#{enabled})")
public int insertUser(UserVO userVO);
@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_USER')")
public void insertAuthorities(UserVO UserVO);
@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_ADMIN')")
public void insertAdminAuthorities(UserVO UserVO);
}
[root-context.xml] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <!-- HikariConfig hikariConfig = new com.zaxxer.hikari.HikariConfig() 객체 생성해서 applicationContext.xml에 넣어라(Service,Repository클래스)--> <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property> <property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"></property> <property name="username" value="scott"></property> <property name="password" value="tiger"></property> </bean> <!-- dataSource.getConnection() DB와 커넥션 객체를 갖고 있어서 오라클과 연결되어 데이터를 사용할 수 있다--> <!-- HikariCP(커넥션풀) configuration --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean> <!-- Mybatis설정 --> <!-- SqlSessionFactoryBean sqlSessionFactory = new org.mybatis.spring.SqlSessionFactoryBean(); --> <!-- sqlSessionFactory.setDataSource(dataSource); --> <!-- 상기와 같이 호출되고 있다 --> <!-- 1.번 방법을 위하여 mapperLocations 을 추가 함 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:/mappers/**/*.xml" /> </bean> <!-- 실질적 Mybatis = sqlSession --> <!-- 1번 방식 사용을 위한 sqlSession(보통 id를 sqlSession으로 설정한다) --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> </beans> ------------------------------------------------------------------------------- [BController1.java] //Mybatis를 사용하는 첫 번째 방법 package edu.global.ex.board.one; import org.springframework.stereotype.Controller; import lombok.extern.slf4j.Slf4j; //1.interface IBDao를 XML namespace에 매핑 <mapper namespace="edu.bit.ex.board1.IBDao"> //2.sqlSession.getMapper(IBDao.class)를 이용. @Slf4j @Controller public class BController1 { } ------------------------------------------------------------------------------- [IBDao.java] //Mybatis를 사용하는 첫 번째 방법 package edu.global.ex.board.one; import java.util.List; import edu.global.ex.vo.BoardVO; public interface IBDao { public List<BoardVO> listDao(); } ------------------------------------------------------------------------------- [board1.xml] <?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 namespace="edu.global.ex.board.one.IBDao"> <select id="listDao" resultType="edu.global.ex.vo.BoardVO"> <![CDATA[select * from mvc_board order by bGroup desc, bStep asc]]> </select> </mapper> ------------------------------------------------------------------------------- [BoardVO.java] package edu.global.ex.vo; import java.sql.Timestamp; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; @Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public class BoardVO { private int bid; private String bname; private String btitle; private String bcontent; private Timestamp bdate; private int bhit; private int bgroup; private int bstep; private int bindent; } ------------------------------------------------------------------------------- [BService1.java] //Mybatis를 사용하는 첫 번째 방법 package edu.global.ex.board.one; import java.util.List; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import edu.global.ex.vo.BoardVO; @Service public class BService1 { @Inject private SqlSession sqlSession; // root-context.xml에서 끌고온다 public List<BoardVO> selectBoardList() throws Exception { IBDao dao = sqlSession.getMapper(IBDao.class); // dao에 넣을 원형을 알려주고(.class), 객체로 만들어서 넣어준다. return dao.listDao(); } } ------------------------------------------------------------------------------- [list.jsp] <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <img src="/images/shop/product10.jpg"> <table width="500" cellpadding="0" cellspacing="0" border="1"> <tr> <td>번호</td> <td>이름</td> <td>제목</td> <td>날짜</td> <td>히트</td> </tr> <c:forEach var="board" items="${boards}"> <tr> <td>${board.bid}</td> <td>${board.bname}</td> <td><c:forEach begin="1" end="${board.bindent}">-</c:forEach> <a href="${pageContext.request.contextPath}/jboard/content_view?bid=${board.bid}">${board.btitle}</a></td> <td>${board.bdate}</td> <td>${board.bhit}</td> </tr> </c:forEach> <tr> <td colspan="5"><a href="write_view">글작성</a></td> </tr> </table> </body> </html>
[결과값]
[root-context.xml] 동일 ------------------------------------------------------------------------------- [BController2.java] //Mybatis를 사용하는 두 번째 방법 package edu.global.ex.board.two; import javax.inject.Inject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import lombok.extern.slf4j.Slf4j; //1. interface는 필요가 없음 //2. sqlSession에서 제공하는 함수(selectList,selectOne)를 이용함 //3. 쿼리구현을 위한 XML이 필요. 해당 XML의 namespace는 개발자가가 정함 @Controller public class BController2 { @Inject BService2 bservice; @RequestMapping("/list2") public String list(Model model) throws Exception { System.out.println("list2()"); model.addAttribute("boards", bservice.selectBoardList()); return "list"; } } ------------------------------------------------------------------------------- [BService2.java] //Mybatis를 사용하는 두 번째 방법 package edu.global.ex.board.two; import java.util.List; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Service; import edu.global.ex.vo.BoardVO; @Service public class BService2 { @Inject SqlSession sqlSession; public List<BoardVO> selectBoardList() throws Exception { return sqlSession.selectList("board.selectBoardList"); } } ------------------------------------------------------------------------------- [board2.xml] <?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 namespace="board"> <select id="selectBoardList" resultType="edu.global.ex.vo.BoardVO"> <![CDATA[select * from mvc_board order by bGroup desc, bStep asc]]> </select> </mapper> ------------------------------------------------------------------------------- [BoardVO.java] 동일 ------------------------------------------------------------------------------- [list.jsp] 동일
[결과값]
@Mapper // MyBatis 연결을 알려주는 것
public interface BoardMapper { // interface를 BoardMapper.xml에서 구현한다. >> Mybatis
@Select("select * from mvc_board order by bGroup desc, bStep asc") // Mybatis 3버전
public List<BoardVO> getList();
public BoardVO read(int bid); // 파라미터는 url로 넘어오는 bid값을 의미
public int update(BoardVO board); // 글수정
public int delete(BoardVO board); // 글삭제
public int insert(BoardVO board); // 글작성
//답글관리
public void updateShape(BoardVO board); // 답글위치
public void insertReply(BoardVO board); // 답글등록
//paging 관련
public abstract int getTotalCount();
public abstract List<BoardVO> getListWithPaging(Criteria cri);
}
@Mapper // MyBatis용 인터페이스라는 것을 알려주는 어노테이션
//SecurityConfig.java의 Bean을 끌고옴
public interface UserMapper {
public UserVO getUser(String username);
@Insert("insert into users(username,password,enabled) values(#{username},#{password},#{enabled})")
public int insertUser(UserVO userVO);
@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_USER')")
public void insertAuthorities(UserVO UserVO);
@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_ADMIN')")
public void insertAdminAuthorities(UserVO UserVO);
}