[ 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 |