본문 바로가기
CLASS/SPRING,JSTL

#7-1 / Mybatis 설치 및 Setting

by hingu 2024. 7. 19.
👀 [Mybatis]

DB Connection ,
spring DB의 DDL을 빠르게 처리해주는 대표 라이브러리

- mybatis / mybatis-spring / javax.inject  3개 다운
- Controller가 너무 무거워짐을 방지
- Mybatis 사용시 Connection 사용하지 않음

config.xml
JAVA의 DAO(getter,setter)  => 얘가 없으면 db연결조차 못함,모든 DAO가 여기 다들어감
mapper.xml
모든 DDL이 여기 다들어감 <select> <delete> <update> .. 등 
=> 이 두개에 다 몰아져있어 유지보수 용이 , 이 두개가 Controller의 보조역할을 한다...?

 DB 
 Module ( DAO or VO / Data DDL Module 을 포함 )
DAO or VO : config.xml
Data DDL Module : mapper.xml
<=> Controller  <=>  View 

방식 1. @Bean - properties => @Configuration
방식 2. properties / config.xml,mapper.xml
방식 3. dbconfig.xml / config.xml , mapper.xml
방식 4. JPA / @Column, @Table, @entity
..등

 

현재 STS 버전-년도 확인

  1. window - Eclips market
    Mybatis 1.2.5 검색 ->  more info - lernmore - 사이트경로 복사해서
    (진짜 사이트 접속 해서 버전 확인 가능) mybatis 버전확인 아래 git 경로 복사
  2. Sts 돌아와서 help - install new software 들어가서
    경로 복붙 후 둘다 체크 ( Contact all~체크 아웃 필수 )
    Next next accept down
    다 다운 되면 restart yes
  3. mybatis genrator도 동일한 방식으로 다운
    : more info -> url 접속 -> 2021-09 경로 복붙 후 둘다 체크 후 다운 ( Contact all~체크 아웃 필수 )
  4. Pom.xml 에
    Maven에서 mybatis spring 1.3.3 복붙, mybatis 3.4.6 복붙 후 업데이트
    => ❗ java 11번은 3.2점대 사용 x : 3.4 이상 사용해야함
    (버전 너무 높으면 x - 자바버전에 따라 잘 맞출것)
    maven 프로젝트 업데이트
    서버 리스타트
  5. dbconfig.xml에
    <bean id="sqlfact" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dbInfo"></property> 위에 id랑 맞추기
    <property name="configLocation" value="classpath:/META-INF/config.xml"></property>
    <property name="mapperLocations" value="classpath:/META-INF/mapper.xml"></property>
    </bean> 

    <bean id="template" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="close"> //id맘대루
    <constructor-arg name="sqlSessionFactory" ref="sqlfact"></constructor-arg> //위에 아이디랑 맞추기
    </bean> //destory-method : 외부 연결 허용
    => 아래 얘는 사용하기 전엔 선언 x (사용하기 전은 주석처리!) ,
    => 주석 풀어도 에러 안나게 하려면 ? namespaces -> mybastis-spring 체크 -> 오른쪽 최신버전 체크 후 
    => dbconfig.xml  <bean> 전에 (<beans> 태그 열고 바로 아래 안에) <context:annotation-config /> 추가
    => java 버전 3.4 이상 해야 에러 안남!
    추가 
  6. resource 폴더에 META-INF 디렉토리 생성
    해당 디렉토리에 /META-INF/config.xml , /META-INF/mapper.xml 파일 만들기
    (other - mybatis xml mapper 확장자 로 - 하단 이미지 참고)
  7. config.xml에 
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD configuration 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> => 두꺼운 표시한거 찾아서 수정
    <configuration></configuration> // 요게 자동완성 되어야지 잘된거임 
    하단 이미지 참고
  8. Javax Inject 1 도 maven repository 에서 pom.xml에 복붙

 

 

얘가 나오면 잘 다운 된거임ㅎ



7 . 여기서 복붙해도 됨

https://mybatis.org/mybatis-3/getting-started.html

 


dbconfig.xml에 id="sqlsession" 이 없는 경우 db연결 확인

@Autowired //@Inject 도 가능
//BasicDataSource dbInfo;   
SqlSessionFactory sqlfact; //dbconfig.xml에 작성한 bean id

PrintWriter pw = null;
@GetMapping("/testsql.do")
public String testsql() {
    try {
        SqlSession se = sqlfact.openSession();
        System.out.println(se); //connection 사라짐 - se만 있으면 됨..
    }catch(Exception e) {
        System.out.println("Factory error!");
        e.printStackTrace();
    }

    return null;
}

본격 연결은 다음장에..

 


 

👀 [ Spring-boot db연결 방식 ]

package api;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class dbcon {
	@Bean(destroyMethod = "close")
	public BasicDataSource dataSource2() {
		BasicDataSource bs = new BasicDataSource();
		bs.setDriverClassName("com.mysql.cj.jdbc.Driver");
		bs.setUrl("jdbc:mysql://localhost:3306/cms");
		bs.setUsername("hana");
		bs.setPassword("hana1234");
		bs.setInitialSize(2); //최소 연결 갯수 (한 ip당 2개씩)
		bs.setMaxActive(10); //하나의 아이디에 동시에 사용할수 있는 최대 연결 갯수 (협업시)
		bs.setTestWhileIdle(true); //비활성화된 DB연결 부분을 유효성 검사
		bs.setMinEvictableIdleTimeMillis(60000*3); //사실 6000*3 이 좋다
		//db연결 유지시간-1000:1초(너무 데이터가 많을 경우 로드가 심하게 걸림..방지) 
		
		return bs;
	}
    
        @Bean()
        public SqlSessionFactoryBean factory() {
            SqlSessionFactoryBean sf = new SqlSessionFactoryBean();
            BasicDataSource bs = this.dataSource2();
            sf.setConfiguration(null);
            sf.setMapperLocations(null);

            return sf;
        }
}

 

spring의 dbconfig.xml 역할 (바로밑 참고용 참고해보삼 - 방식만 다르고 넣는 값은 다 동일함)

java파일 ( dbcong.java - class , 이름은 맘대루 )

해당 파일 생성시 dbconfig.xml 필요없음

datasource로도 가능

dbconfig의 sessionfactory는 주석해야함..

 

↓ 참고용 (기존 dbconfig.xml)

<!-- 얘는 그냥 connection -->
<bean id="dbInfo" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/cms"></property>
    <property name="username" value="hana"></property>
    <property name="password" value="hana1234"></property>
</bean>

<!-- 여기서부터 mybatis -->
<bean id="sqlfact" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dbInfo"></property>
    <property name="configLocation" value="classpath:/META-INF/config.xml"></property>
    <property name="mapperLocations" value="classpath:/META-INF/mapper.xml"></property>
</bean>

<bean id="template" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="close">
    <constructor-arg name="sqlSessionFactory" ref="sqlfact"></constructor-arg>
</bean>

//이게 spring-boot에서는 class 버전으로 쓰인다구 생각하면 됨.. 
//SqlSessionFactoryBean,SqlSessionTemplate 도 동일하게 @bean() {} ~ 이렇게 생김

 

🔽

//@Autowired
//BasicDataSource dbInfo; //요거 대신
@Inject
private BasicDataSource dataSource2; //dbcon.java (@Bean)
@GetMapping("/beantest.do")
public String beantest() {
    try {
        Connection con = dataSource2.getConnection();
        System.out.println(con);
    }catch(Exception e) {
        e.printStackTrace();
    }
    return null;
}

: db 연결 테스트 - @Autowired 이제 안써도됨