728x90
반응형
제목 그대로 xml 없이 자바로만 스프링을 사용할 수 있는데, 이걸 차세대 개발이라고 칭한다.
어노테이션만을 이용해서 스프링 개발이 가능하다.
package com.sist.config;
import javax.inject.Scope;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
// <context:component-scan base-package="com.sist.*"/>
@ComponentScan(basePackages={"com.sist.*"})
@EnableWebMvc
public class EmpConfig implements WebMvcConfigurer{
/*
요청 *.do
|
DispatcherServlet
|
***HandlerMapping : Model클래스를 찾아주는 역할 (스프링에서 동작하는 자체 라이브러리)
|
Model(사용자 정의 => @Controller) => POJO (상속,인터페이스 구현 이 없는 클래스)
|
***HandlerAdapter : 형변환을 동일해게 제작 (스프링에서 동작하는 자체 라이브러리)
|
DispactherServlet : 설정 (web.xml)
|
ViewResolver : 설정 (자바,appplication-context.xml)
|
JSP
*/
// HandlerMapping,HandlerAdapter 생성
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// DataSource
// @Bean(name="") => <bean id="ds" scope="propotype"> : XML코드는 자바로 변경할 때 주로 어노테이션 (XML을 대체하는 프로그램)
@Bean(name="ds")
//@Scope("prototypy")
public DataSource dataSource()
{
BasicDataSource ds=new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
ds.setUsername("hr");
ds.setPassword("happy");
return ds;
}
// SSF
@Bean(name="ssf")
public SqlSessionFactory sqlSessionFactory() throws Exception
{
SqlSessionFactoryBean ssf=new SqlSessionFactoryBean();
ssf.setDataSource(dataSource());
return ssf.getObject();
}
// Mapper : SQL문장을 저장하고 있는 인터페이스의 메소드를 구현해 주는 역할 수행 => MapperFactoryBean
@Bean(name="mapper")
public MapperFactoryBean mapperFactoryBean() throws Exception
{
MapperFactoryBean mapper=new MapperFactoryBean();
mapper.setSqlSessionFactory(sqlSessionFactory());
mapper.setMapperInterface(com.sist.dao.EmpMapper.class);
return mapper;
}
// ViewResolver
@Bean(name="viewResolver")
public ViewResolver viewResolver()
{
InternalResourceViewResolver vr=new InternalResourceViewResolver();
vr.setPrefix("/");
vr.setSuffix(".jsp");
return vr;
}
// Transcation
}
사용을 하기 위해서는 xml이 아니라 자바 파일에 등록을 해줘야 한다. xml에 등록했을때와 클래스들은 동일하다.
package com.sist.dao;
import java.util.*;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
// 조인 <resultMap>
@Results({
@Result(property="empno",column="empno"), // setEmpno(rs.getInt("empno"))
@Result(property="ename",column="ename"),
@Result(property="job",column="job"),
@Result(property="mgr",column="mgr"),
@Result(property="hiredate",column="hiredate"),
@Result(property="sal",column="sal"),
@Result(property="comm",column="comm"),
@Result(property="deptno",column="deptno"), // setDeptno(rs.getInt("deptno"))
@Result(property="dvo.dname",column="dname"), // getDvo().setDname(rs.getString("dname"))
@Result(property="dvo.loc",column="loc")
})
@Select("SELECT empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname,loc "
+"FROM emp,dept "
+"WHERE emp.deptno=dept.deptno")
public List<EmpVO> empJoinData();
// ResultSet rs=ps.executeQuery();
// rs.next(); => vo.setXxx()...
@Results({
@Result(property="empno",column="empno"), // setEmpno(rs.getInt("empno"))
@Result(property="ename",column="ename"),
@Result(property="job",column="job"),
@Result(property="mgr",column="mgr"),
@Result(property="hiredate",column="hiredate"),
@Result(property="sal",column="sal"),
@Result(property="comm",column="comm"),
@Result(property="deptno",column="deptno"), // setDeptno(rs.getInt("deptno"))
@Result(property="dvo.dname",column="dname"), // getDvo().setDname(rs.getString("dname"))
@Result(property="dvo.loc",column="loc")
})
@Select("SELECT empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname,loc "
+"FROM emp,dept "
+"WHERE emp.deptno=dept.deptno "
+"AND empno=#{empno}")
public EmpVO empFindData(int empno);
/*
* <select id="empFindData" resultType="com.sist.dao.EmpVO" parameterType="hashmap">
SELECT empno,ename,job,TO_CHAR(hiredate,'YYYY/MM/DD') as dbday,sal
FROM emp
<trim prefix="WHERE ename IN(" suffix=")" suffixOverrides=")">
<foreach collection="names" item="ename" close=")" separator=",">#{ename}</foreach>
</trim>
</select>
*/
// 동적 SQL
@Select("<script>"
+"SELECT empno,ename,job,TO_CHAR(hiredate,'YYYY-MM-DD HH24:MI:SS') as dbday,sal "
+"FROM emp "
+"WHERE ename "
+"<trim prefix='IN'>"
+"<foreach item='name' collection='nameArr' open='(' close=')' separator=','>#{name}"
+"</foreach>"
+"</trim>"
+"</script>"
)
public List<EmpVO> empSearchData(Map map);
}
mapper역시 이렇게 써준다. xml로 쓰는게 덜 귀찮은거 같은 기분이지만.. 일단 이렇게 사용하는 방법도 당연히 알아 놔야한다.
마지막에 써준건 동적 sql로 사용자가 입력한 같에 따라서 쿼리의 내용이 달라진다.
<form method="POST" action="find.do">
<table class="table">
<caption>검색</caption>
<tr>
<td>
<c:forEach var="vo" items="${list }">
<input type="checkbox" name="names" value="${vo.ename }">${vo.ename }
</c:forEach>
</td>
</tr>
<tr>
<td class="text-center">
<button class="btn btn-sm btn-info">검색</button>
</td>
</tr>
</table>
</form>
여러명의 이름을 checkbox로 선택하고 그 값을 받아서 find.do쪽으로 넘겨주고 있다.
@PostMapping("emp/find.do")
public String emp_find(String[] names,Model model)
{
// DAO연결
for(String name:names)
{
System.out.println(name);
}
Map map=new HashMap();
map.put("nameArr", names);
List<EmpVO> list=dao.empSearchData(map);
model.addAttribute("list",list);
return "emp/find";
}
find만 조금 달라서 여기만 살펴보면 이렇다. 매개변수로 문자열 배열을 받아온적은 처음인거 같다.
여튼 이름들의 배열인 names를 map에 담아주고, 메소드의 매개변수로 채워 넣어줘서 list를 뽑아낸다.
이 다음에는 RestController를 사용해서 창을 띄워보는 연습을 할거다,,
728x90
반응형
'programming > Gukbi' 카테고리의 다른 글
국비 교육 92일차 - validation (0) | 2021.05.07 |
---|---|
국비 교육 91일차 - 검색 기능 완성 (0) | 2021.05.07 |
국비 교육 88일차 - ajax이용 댓글창 띄우기 (0) | 2021.05.01 |
국비 교육 87일차 - 동적쿼리연습, 대댓글 게시판 (0) | 2021.04.30 |
국비 교육 86일차 - Mybatis 동적 쿼리 (0) | 2021.04.29 |