GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Mybatis

[Mybatis] 사용법

Backcoder 2022. 8. 22. 20:42

[ DB 접근 방법 ] 
1. JDBC 

: 반복되는 코드 등 다소 불편한 점이 많다.

 
2. Spring JDBC  

: 자체만으로는 많이 사용하지 않는다. 

 

3. Mybatis 프레임워크 

: Spring 과 합쳐서 많이 사용된다.

 

4. JPA ( Hibernate )

: 자동화가 잘 되어 있다. SQL 외의 문법을 사용한다. 



=>  JDBC 단점을 메꾸는 방향으로 Mybatis가 등장했다. 

 

[ JDBC ] 
1. 코드반복이 많다.
-  DB 연결, 해제, SQL 문 사용시 필요한 PreparedStatement 등   
2. 자바언어 / SQL 서로 다른 언어가 한 파일에 있다. 
3. Resultset으로 결과를 뽑아야한다. 

 

( Mybatis )
=> 연결해주는 Connection 객체를 매번 만들지 말고, 한 번 만들어놓고 재사용하자 
=> 자바클래스 따로, SQL은 xml에 따로 정리하자. 
=> DTO 자동연결 
=> preparedStatement / resultSet 없애자.  


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

 

[[ Mybatis ]] 

: SQL을 사용한 DB 접근을 편하게 만들어주는 장치 ( 프레임워크 )  

 

- 자바클래스 따로, SQL은 xml에 따로! 
- 원래 JDBC 기능 사용가능 
- DB 연동 전용 프레임워크 
- ibatis == mybatis 

 

 

 


[ xml 쿼리문 ] 
1.select 
<select id = "key값" resultType = "레코드타입"  parameterType =  "#{?}변수타입 " > 
select * from member where id = #{id}
</select> 

- resultType 필수 
- parameterType 옵션 

 

[자바]
return session.selectOne( "key값", #{?}값 ); 

 

selectOne - 가져올 값이 하나일때  
selectList - 가져올 값이 List 
selectMap - 가져올 값이 Map 

selectOne - #{ ? } 변수값 세팅하면서 가져오기 / 하나일때 
sessesion.selectOne("keyID" , "?값");
selectList - #{ ? } 변수값 세팅하면서 가져오기 / 여러개일 때 
sessesion.selectList("keyID" , "?값");

 


2. insert 
<insert id= "  " parameterType= "Board.memberDTO" >
 insert into member values( #{id}, #{pw}, #{name} 
</insert> 

[자바]
session.insert("insertmember", dto
=> 객체를 parameter로 주면,  SQL 문에서 #{?}에 해당되는 변수명 찾아서 자동으로 매칭됨!

( 자바에서 dto가 parmeter 를 자동매칭되서 받는 것 처럼 ) 

( session.commit();  / rollback();
( mybatis 자체에서는 commit 을 해줘야 실행된다. )

( * Spring 과 연동해서 session을 Spring Bean에서 생성했을 때는, 자동 commit 된다. )


3. delete 
<delete id = " " parameterType = " " > 
4. update 
<update id = " " parameterType = " " > 

 

- insert / delete / update 의 실행 결과는 int 로 받으면 실행결과 데이터 개수를 retrun. 

 


[[ 객체(dto)  ===자동맵핑===>  SQL #{ }  ]]
- SQL  #{?} 변수 <======  파라미터로 들어온 dto객체

: 자동으로 변수명과 매칭되서 들어간다. 

 

MemberDTO 에 id, pw, name 변수가 있을 때, 

 

<update id = " " parameterType = "Board/MemberDTO dto" > 

update member set name=#{name} pw=#{pw} where id=#{id} 

 

#{ ? } 자리에 dto 의 변수 id, pw, name 가 해당 변수명을 찾아서 자동매칭되며 들어간다. 

 

-  단, null 이있을때는 nullPoniterException 날 수 있다 
=> <choose> 조건문 사용해서 예외 잡으면서 처리 

 

<choose> 
<when test="name != null" > 
set name=#{name}  

</when> 



[[ commit / rollback ]] 
- insert / delete / update (DML) 은 기본적으로 ( Mysqlworkbench / JDBC ) 의 경우 
실행즉시 바로 반영 된다. 

- Mybatis 자체만 사용할 경우는 
(1) session.insert( "join", dto ); 
: 임시버퍼에만 저장된 상태 
=> 여기서 선택권을 줌 

(2) session.commit( );   => DB반영 
     session.rollback( ); => 취소 

- if ( ~ ) { session.rollback( ); }  
이런식으로 조건 걸어두고 사용할 수 있다. 

(3) *openSession (true)
SqlSession  session = factory.openSession( true ); 
: 세션을 생성할 때 true 값을 주면, 
=> 자동으로 commit( ); 으로 실행하게 된다. 

( Spring 과 연계시 사용할 수 있는 방법 ) 

 

(4) Spring 과 연계해서, sqlSession 을 SpringBean 에서 생성 할 경우, 

=> commit 은 자동으로 실행된다! 

( 기본적으로 manual 하게 직접 commit / rollback 을  사용할 수 없다. )

( 따로 설정을 추가하면 가능하다. ) 

 

[ Package/클래스명  알리아스 ] 
mybatis-Config.xml 파일에서 설정 
- cofiguration 태그 안에 생성 

<configuration>
<typeAliases>
<typeAlias type="Board.memberDTO"  alias="memberdto"/>
</typeAliases>

: Board 패키지안의 memberDTO 클래스타입을 memberdto 라는 알리아스로 대체가능하게 하겠다. 
( 알리아스줄때는 패키지 . 으로 표시 ) 

 

 

<update id = " " parameterType = "Board/MemberDTO dto" > 

== 

<update id = " " parameterType = "memberdto" > 

 


=> SQL.xml 파일에서 resultType / parameterType 에서 
클래스타입 줄 때, 패키지에 클래스명 풀로 적어줘야 했던걸 
알리아스로 대체할 수 있다 
=> 패키지가 변경 되었을 때도, 알리아스 설정만 바꿔주면 한번에 모두 적용된다. 

 

 

 

[[ Mybatis 설정 ]] 

( * Spring 을 사용하지 않았을 때의 방법이다. )

1. [ 라이브러리 추가 ] 
[pom.xml] 
mysqlconnectorj  
mybatis.jar  

2. [ mybatis-Config.xml 생성 ]

 

(1) DB연결 (DataSource 이용)
- JDBC : 서버의 context.xml 에 <Resource />로 등록해두고 사용
=> Mybatis : 프로젝트에 mybatis용Config.xml 파일 생성해서 Datasource 로 등록해서 사용 
(2) SQL 파일 맵핑 

 


<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

  <!-- mybatis db 연결정보 Datasource 세팅 -->

<configuration>
<environments default="mydb">
<environment id="mydb">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/backcoder"/>
<property name="username" value="backcoder"/>
<property name="password" value="1111"/>
</dataSource>
</environment>
</environments>

<!-- SQL xml파일 맵핑 -->
<mappers>
<mapper resource="Mybatis/membersql-mapping.xml"
<mapper resource="Mybatis/boardsql-mapping.xml"
</mappers>

 

( 알리아스 설정 추가 )



3.  각 서비스별 SQL모아둔 xml 파일 생성 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  <mapper namespace="m">  
  <select id="memberlist" resultType="Board.MemberDTO">  
  select * from member
  </select>

...
  </mapper>

namespace :  호출할 때 id앞에 붙이는 구별자. 
 ( 선언은 필수 / 사용은 option ) 
id : 해당 SQL문을 호출할 때 쓸 key이름 

resultType : 조회값 가져올 때 레코드 하나의 타입
=> Array 타입이어도 레코드 하나의 타입으로 지정

( 즉, forEach 돌릴때 받을 타입 ) 

 

- parameterType : SQL문의 #{?} 에 들어갈 데이터 타입 

 

 

=== 여기까지 하면 sql 문을 가져다 사용할 준비가 끝난다. ====

 


4. 가져다 쓰기 

 

[[ SqlSession ]] 

: Connection 역할 

=> SqlSession 객체를 만들어 SQL 문을 사용한다. 

 

Mybatis  =>  xml파일에 DB / SQL 정보를 미리 저장해두었다. 

그걸 가져다 쓰기만 하면 되기 때문에, 자바에서의 코드는 확 줄어든다. 

 
1. SqlSessionFactoryBuilder로, db,sql맵핑 저장해둔 mybatis-config.xml 파일 불러옴 
2. SqlSessionFactory가 그 정보로 SqlSession(Connection) 생성 
3. SqlSesson 은 가져다 쓸 sql문을 id로 select 해서 바로사용  

public static void main(String[] args) throws IOException {

SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(Resources.getResourceAsReader("Mybatis/mybatisConfig.xml"));
SqlSession session factory.openSession( );

List<MemberDTO> memberlist = session.selectList("memberlist"); }


- 이것만으로도 코드가 꽤나 간결해졌다. 

- Spring 에서는 위의 SqlSessionFactory / SqlSession 객체를 BeanContainer에서 생성해두고 사용하기 때문에,  

자바에서는 session 객체를 @Autowired 만 해주면, 곧바로 session 을 사용할 수 있어서 코드가 매우 간결해진다. 

 

'Back to the Mybatis' 카테고리의 다른 글

[Mybatis] 검색처리 SQL  (0) 2022.08.22
[Mybatis] Paging처리  (0) 2022.08.22
[Mybatis] + [Spring] 연동 순서  (0) 2022.08.22