mybatis

2024. 2. 12. 15:41Daily Codig Reminder

기존 mybatis 설정

config.xml ⇒properties 로딩 ⇒ alias 설정 ⇒ 4가지 정보 설정⇒ 맵퍼 등록

⇒mySqlSessionFactory xml로딩 ⇒ getSqlSession : ssql session리턴 사용

스프링 설정

properties 로딩 ⇒ 4가지 정보 이용 DataSource 생성 ⇒

SqlSessionFactoryBean (생성): 맵퍼등록, dto 클래스 위치 지정, dataSource 사용

SqlsessionTemplate 빈 생성 : SqlSessionFactoryBean 사용

dao : SqlsessionTemplate 빈 실제 사용

 

tx_annotation

 

main

import java.util.List;

import org.springframework.context.support.GenericXmlApplicationContext;

import com.entity.OrderDTO;
import com.entity.ProductDTO;
import com.service.ProductService;

public class DeptMain {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx=
				new GenericXmlApplicationContext("classpath:com/config/product.xml");
		ProductService service= ctx.getBean("deptService", ProductService.class);
	
		List<ProductDTO> list= service.selectProduct();
		 System.out.println("주문전 상품록록 =============================================");
		
		for (ProductDTO d : list) {
			System.out.println(d);
		}
		
		
		
		
		
		
		// 상품 주
		System.out.println("p01 상품 3개 주문합니다");
		try {
			service.addOrder("p01", 3);
		} catch (Exception e) {
			System.out.println("에러가 발생하여 롤백처리.");
		}
		 System.out.println("주문 후  상품록록 =============================================");
		list = service.selectProduct();
		for (ProductDTO dto : list) {
			System.out.println(dto);
		}
		System.out.println(" 주문 후  order 테이블 목록==================================");
		List<OrderDTO> oList = service.selectOrder();
		for (OrderDTO dto : oList) {
			System.out.println(dto);
		}
	}

}

 

 

dao

public class ProductDAO {
  //Mybatis  사용 
	SqlSessionTemplate template;

	public void setTemplate(SqlSessionTemplate template) {
		this.template = template;
	}
	
	
    // 전체 상품 목록
	public List<ProductDTO> selectProduct() {
// sysout template
		return template.selectList("productList");

	}// end select
	
	
	 // 전체 주문 목록
		public List<OrderDTO> selectOrder() {

			return template.selectList("orderList");
		}// end select
	

	public void addOrder(String pcode, int quantity) throws Exception{
		
		OrderDTO dto = new OrderDTO();
		dto.setPcode(pcode);
		
		dto.setQuantity(quantity);
            
        int n = template.insert("order.orderInsert", dto);    //정상 insert  
        System.out.println("order table insert = "+n);
       // template.update("product.productUpdate",dto);//에러 발생 
        template.update("product.produc            ",dto);//에러 발생 코드
        
	}// end insert


	// 주문

}

 

 

service

public class ProductService {

	ProductDAO dao;

	public ProductDAO getDao() {
		return dao;
	}

	public void setDao(ProductDAO dao) {
		this.dao = dao;
	}
	
	
	//占쏙옙瞿占쏙옙占�
	public List<ProductDTO> selectProduct(){
		//sysout dao
		return dao.selectProduct();
	}
	
	public List<OrderDTO> selectOrder() {
		return dao.selectOrder();
	}
	//특占쏙옙 占쏙옙占쌘듸옙 

	@Transactional///////////////////////////////////////////
	public void addOrder(String pcode, int quantity) throws Exception{
		dao.addOrder(pcode, quantity);
	}

 

 

productmapper

<mapper namespace="product">
  

     <select id="productList" resultType="com.entity.ProductDTO">
       select pcode,pname,price,quantity 
       from t_product
       order by pcode asc
     </select>
     
     
          <update id="productUpdate" parameterType="com.entity.ProductDTO">
       update t_product 
       set quantity = quantity  -  #{ quantity }
       where pcode = #{pcode}
     </update>

 

 

ordermapper

<mapper namespace="order">
  
    <select id="orderList" resultType="com.entity.OrderDTO">
      select num, pcode, quantity 
      from t_order order by num 
    </select>
    
    
        <insert id="orderInsert" parameterType="com.entity.OrderDTO">
     insert into  t_order ( num, pcode, quantity )
     values ( t_order_seq.nextval, #{pcode} , #{quantity} )
    </insert>

 

 

bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 필수  context, tx check-->
<!--  어노테이션 활성화-->
<context:annotation-config></context:annotation-config>


<!-- tx 처리 시작-->
<!--1. properties등록  -->
<context:property-placeholder location="classpath:com/config/db.properties"/>
<!--  2. DataSource생성-->
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="${driver}"></property>
	<property name="url" value="${url}"></property>
	<property name="username" value="${oracle.username}"></property>
	<property name="password" value="${oracle.password}"></property>
</bean>

<!-- 3.tx처리용 txManager생성 및 tx annotaion활성화 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 	<property name="dataSource" ref="myDataSource"></property>
</bean>
<!--4.  <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/> -->
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- tx 처리 끝 -->
<!-- Mybatis 설정  -->
<!-- 3. SqlSessonFactoryBean생성, mapper지정, alias지정  -->
<bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
	<property name="dataSource" ref="myDataSource"></property>
	<property name="mapperLocations">
		<list>
			<value>classpath:com/config/productMapper.xml</value>
			<value>classpath:com/config/orderMapper.xml</value>
		</list>
	</property>
	 <!--  <property name="mapperLocations" value="classpath:com/dao/*.xml" /> -->
  <!-- <property name="typeAliasesPackage" value="com.test" /> -->
	<property name="typeAliases">
		<list>
			<value>com.entity.OrderDTO</value><!-- dto클래스에서 alias명 지정 @Alias('alias명')  -->
			<value>com.entity.ProductDTO</value><!-- dto클래스에서 alias명 지정 @Alias('alias명')  -->
		</list>
	</property>
</bean>
<!-- 4.마지막 SqlSessinTemplate 생성, SqlSession과 동일한 기능 -->
<bean id="mySqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="mySqlSessionFactory"></constructor-arg>
</bean>





<!--5. 필요한 빈 생성  -->
<bean id="deptDAO" class="com.dao.ProductDAO">
	<property name="template" ref="mySqlSessionTemplate"></property>
</bean>
<bean id="deptService" class="com.service.ProductService">
	<property name="dao" ref="deptDAO"></property>
</bean>

</beans>

 

 

주문전 상품록록 =============================================

ProductDTO [pcode=p01, pname=TV, price=1000, quantity=10]

ProductDTO [pcode=p02, pname=iPhone, price=500, quantity=5]

ProductDTO [pcode=p03, pname=G3, price=600, quantity=20]

p01 상품 3개 주문합니다

order table insert = 1

에러가 발생하여 롤백처리. 주문 후 상품록록

=============================================

ProductDTO [pcode=p01, pname=TV, price=1000, quantity=10]

ProductDTO [pcode=p02, pname=iPhone, price=500, quantity=5]

ProductDTO [pcode=p03, pname=G3, price=600, quantity=20]

주문 후 order 테이블 목록==================================

 

mybatis3

 

dao

package com.dao;

import java.util.List;

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

import com.entity.OrderDTO;
import com.entity.ProductDTO;

/*
 
   -- 상품테이블
  drop table t_order purge;
  drop table t_product  purge;

   create table t_product
   ( pcode  varchar2(10) primary key,
     pname varchar2(10),
     price number(4),
     quantity number(4) );
     
     
   -- 주문 테이블   
   create table t_order
   ( num number(4) primary key,
     pcode  varchar2(10) references t_product(pcode),
     quantity number(4) ); 
     
   create sequence t_order_seq;
    
   insert into t_product( pcode,pname,price,quantity) values ( 'p01','TV',1000, 10 );
   insert into t_product( pcode,pname,price,quantity) values ( 'p02','iPhone',500, 5 );
   insert into t_product( pcode,pname,price,quantity) values ( 'p03','G3',600, 20 );
    
   commit;

 
 */
@Repository
public class ProductDAO {
	@Autowired
	SqlSessionTemplate template;

	public void setTemplate(SqlSessionTemplate template) {
		this.template = template;
	}
	@Transactional //트렌젝션추가 
	public void addOrder(String pcode, int quantity) throws Exception{
		
		OrderDTO dto = new OrderDTO();
		dto.setPcode(pcode);
		
		dto.setQuantity(quantity);
            
        int n = template.insert("order.orderInsert", dto);     
        System.out.println("order table insert = "+n);
       // template.update("product.productUpdate",dto);//에러 발생 
        template.update("product.produc            ",dto);//에러 발생 코드
        
	}// end insert

    // 전체 상품 목록
	public List<ProductDTO> selectProduct() {

		return template.selectList("productList");

	}// end select

	 // 전체 주문 목록
		public List<OrderDTO> selectOrder() {

			return template.selectList("orderList");
		}// end select
	
	// 주문
		



}

 

 

service

package com.service;

import java.util.List;

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

import com.dao.ProductDAO;
import com.entity.OrderDTO;
import com.entity.ProductDTO;
@Service("deptService")
public class ProductService {
	@Autowired
	ProductDAO dao;

	public ProductDAO getDao() {
		return dao;
	}

	public void setDao(ProductDAO dao) {
		this.dao = dao;
	}
	
	
	//占쏙옙瞿占쏙옙占�
	public List<ProductDTO> selectProduct(){
		return dao.selectProduct();
	}
	
	public List<OrderDTO> selectOrder() {
		return dao.selectOrder();
	}
	//특占쏙옙 占쏙옙占쌘듸옙 

	@Transactional
	public void addOrder(String pcode, int quantity) throws Exception{
		dao.addOrder(pcode, quantity);
	}

}

 

 

없앤빈

<!--5. 필요한 빈 생성  -->
<!-- <bean id="deptDAO" class="com.dao.ProductDAO">
	<property name="template" ref="mySqlSessionTemplate"></property>
</bean>
<bean id="deptService" class="com.service.ProductService">
	<property name="dao" ref="deptDAO"></property>
</bean> -->

 

 

form ⇒ servlet :파싱 ,

getParameter, getParameterValues) , db연도ㅇ, 출력용데이터 ⇒jsp전송, jsp 출력처리

환경설정:web.xml

 

spring form⇒controller 가 처리 (/login ⇒ 함수에서 처리)

폼네이터파싱 다양한 방법제공 ⇒jsp 위임 출력처리

환경설정: web.xml ⇒ root-context.xml , servlet-context.xml ,

 

 

 

mvc

 

<artifactId>app</artifactId> : 주소 , 수정해도 주소 안바뀜

 

 

<java-version>11</java-version>

<org.springframework-version>4.3.22.RELEASE</org.springframework-version>

 

<?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 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mvc</groupId>
	<artifactId>test_1</artifactId>
	<name>06Day1_MVC_basic01</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>11</java-version>
		<org.springframework-version>4.3.22.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>        
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

 

servlet 한군데서 처리

@Controller 붙이기

@RequestMapping("/")

 

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

	public TestController() {
		super();
		System.out.println("controller 기본생성자 호출");
	}
	// "/test_1/"처리
	@RequestMapping("/")//get, post 둘다 처리
	public String main() {//servlet과 동일
		System.out.println("/ 주소요청됨");
		return "/WEB-INF/views/aaa.jsp";//응답요청을 할 jsp 파일이름 test.jsp
	}
	@RequestMapping("/kkk")//get, post 둘다 처리
	public String kkk() {//servlet과 동일
		System.out.println("/kkk 요청");
		return "/WEB-INF/views/hello.jsp";//응답요청을 할 jsp 파일이름 test.jsp
	}
	@RequestMapping("/kkk2")//get, post 둘다 처리
	public String kkk2() {//servlet과 동일
		System.out.println("/kkk2 요청");
		return "/WEB-INF/views/home.jsp";//응답요청을 할 jsp 파일이름 test.jsp
	}
}

 

BEAN만 적으면 주소를 적어야 함

<bean id="xxx" class="com.controller.TestController"></bean>

 

 

mvc

@Controller
public class MainController {
	
	public MainController() {
		super();
		System.out.println("controller 기본생성자 호출");
	}
@RequestMapping("/aaa")//get, post 둘다 처리
public String aaa() {//servlet과 동일
	System.out.println("/ 주소요청됨");
	return "home";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping("/target")//get, post 둘다 처리
public String target() {//servlet과 동일
	System.out.println("/ target 주소요청됨");
	return "target";//응답요청을 할 jsp 파일이름 test.jsp
}

 

 

beans 덕분에 경로 안적어도 로딩이 됨

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<!-- 이름만 써도 로딩이 됨 -->
	</beans:bean>
	<beans:bean id="xxx" class="com.controller.MainController"></beans:bean>
	<context:component-scan base-package="com.test.testapp" />

 

 

mvc2

 

@Controller
public class MainController {
public MainController() {
		super();
		System.out.println("main기본생성자");
	}
	@RequestMapping("/loginForm")//get, post 둘다 처리
	public String loginForm() {//servlet과 동일
		System.out.println("/loginForm 요청");
		return "loginForm";//응답요청을 할 jsp 파일이름 test.jsp
	}
	@RequestMapping("/index")//get, post 둘다 처리
	public String index() {//servlet과 동일
		System.out.println("/index 요청");
		return "index";//응답요청을 할 jsp 파일이름 test.jsp
	}
	@RequestMapping("/login")//get, post 둘다 처리
	public String login() {//servlet과 동일
		System.out.println("/login 요청");
		return "login";//응답요청을 할 jsp 파일이름 test.jsp
	}

 

 

<h1>
	loginForm.jsp
</h1>
<form action="login" method="post">
 <input type="text" name="username" required="required"><br>
 <input type="password" name="password" required="required"><br>
 <input type="email" name="email" required="required"><br>
<input type="submit" value="전송"><br>
</form>

전송 클릭시 login.jsp 로 이동

이 액션은 controller 에서 만들어놓은 함수로 연결도어 링크로 빠짐

→ get 방식인데 form이 post 일 때

 

@RequestMapping(value = "/login" , method = RequestMethod.GET)//get, post 둘다 처리
	public String login() {//servlet과 동일
		System.out.println("/login 요청");
		return "login";//응답요청을 할 jsp 파일이름 test.jsp
	}
	@RequestMapping(value = "/login" , method = RequestMethod.POST)//get, post 둘다 처리
	public String loginPost() {//servlet과 동일
		System.out.println("/login 요청");
		return "login";//응답요청을 할 jsp 파일이름 test.jsp
	}

 

이렇게 다른방식이면 form 에 입력된방식으로 운영됨.

단, get get /postpost 같이는 안됨

'Daily Codig Reminder' 카테고리의 다른 글

parameter, session  (0) 2024.02.16
parameter  (1) 2024.02.12
spring- jdbc  (1) 2024.02.08
@Autowired, CoC ,@Qualifier ,lifecycle  (1) 2024.02.08
props, autowired  (1) 2024.02.07