Spring 학습 매 뉴 얼 (13) - Spring 통합 my batis

Spring 학습 매 뉴 얼 (12) - Spring JDBC 데이터 베 이 스 를 방문 하여 우 리 는 Spring 의 JDBC 추상 을 사용 하여 데이터 베 이 스 를 방문 하 는 방법 을 배 웠 습 니 다. 이것 은 개발 자의 업 무량 을 크게 간소화 시 켰 습 니 다. 데이터 베 이 스 를 연결 하고 닫 는 데 관심 을 가 질 필요 가 없습니다.검색 어의 구조, 실행.............................................................................본 고 는 대상 관계 맵 (Object Relational Mapping (ORM) 을 학습 하여 데이터 베 이 스 를 방문 합 니 다.본 고 는 주로 현재 비교적 유행 하 는 my batis 구 조 를 배운다.
my batis 소개
MyBatis 는 맞 춤 형 SQL, 저장 프로 세 스, 고급 맵 을 지원 하 는 우수한 지구 층 프레임 워 크 입 니 다.MyBatis 는 거의 모든 JDBC 코드 와 수 동 으로 파 라 메 터 를 설정 하고 결과 집합 을 가 져 오 는 것 을 피 했다.MyBatis 는 설정 과 네 이 티 브 맵 에 대해 간단 한 XML 이나 주 해 를 사용 하여 인터페이스 와 자바 의 POJOs (Plain Old Java Objects, 일반 자바 대상) 를 데이터베이스 에 기록 할 수 있 습 니 다.2. 0 버 전 이전에 이 프레임 워 크 는 ibatis 라 고 불 렸 고, 3. 0 버 전 은 my batis 로 이름 을 바 꾸 었 다.Spring 공식 적 으로 ibatis 2 만 통합 되 었 기 때문에 my bati 커 뮤 니 티 는 Spring 에서 my batis 를 지원 하기 위해 my batis - spring 서브 프로젝트 를 만들어 my baits 를 빈 틈 없 이 Spring 에 통합 시 켰 다.
2. 관련 jar 패키지 의존 도입
Spring 프로젝트 통합 my batis 프레임 워 크 는 my batis 와 my batis - spring jar 패키지 에 의존 해 야 하기 때문에 이 의존 도 를 먼저 추가 해 야 합 니 다.build. gradle 파일 의존 항목 수정 은 다음 과 같 습 니 다.
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'mysql:mysql-connector-java:6.0.6'
    compile 'org.mybatis:mybatis:3.4.2'
    compile 'org.mybatis:mybatis-spring:1.3.1'
    compile 'org.springframework:spring-jdbc:4.3.6.RELEASE'
    compile 'org.springframework:spring-context:4.3.6.RELEASE'
}

여기 my batis 버 전 번 호 는 3.4.2 이 고 my batis - spring 버 전 번 호 는 1.3.1 입 니 다.IDEA 는 프로젝트 를 자동 으로 컴 파일 하여 jiar 패키지 에 의존 합 니 다. 물론 프로젝트 루트 디 렉 터 리 에서 다음 명령 을 실행 할 수 있 습 니 다. (gradle 을 path 디 렉 터 리 에 추가 하 였 습 니 다)
  gradle build

3. spring 통합 my batis 실전
Jar 가방 에 대한 의존 도 를 추 가 했 습 니 다. 이 절 에 서 는 Spring 에서 my batis 를 통합 하 는 방법 을 보 여 드 리 겠 습 니 다.코드 인 스 턴 스 를 시작 하기 전에, 우 리 는 먼저 데이터베이스 score 를 새로 만 듭 니 다.manager (데이터베이스 이름 은 임의로 명명 할 수 있 지만 dataSource 의 URL 설정 루트 데이터베이스 이름 이 일치 해 야 합 니 다), 새 데이터 시트 student, 표 구 조 는 다음 과 같 습 니 다.
열명
유형
id
int
name
varchar(20)
gender
char(1)
age
int
동시에 우 리 는 Student 분야 모델 을 다음 과 같이 만 듭 니 다.
public class Student {

    private int id;

    private String name;

    private String gender;

    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString(){
        return "["+id+","+name+","+gender+","+age+"]";
    }
}

3.1 SQL 조회 맵 파일 만 들 기





    
        
        
        
        
    

    

    

    
        insert student
            (id,name,gender,age)
        values(
             #{id},
             #{name},
             #{gender},
             #{age})
    

    
        delete from student where id = #{studentId}
    
    
    
        update student set gender = #{gender} where id = #{id}
    


저 희 는 ? 탭 을 사용 하여 맵 파일 을 만 들 고 mapper 속성 으로 이 mapper 의 네 임 스페이스 를 지정 합 니 다. 여기 서 네 임 스페이스 를 com. liangwei. learnspring. dao. Student Mapper 로 설정 합 니 다. 이 설정 은 뒤에서 설명 합 니 다.저 희 는 namespace 탭 을 사용 하여 결과 집합 을 되 돌려 주 는 맵 관 계 를 정 의 했 습 니 다. 그 중에서 resultMapid 내부 탭 은 모두 대상 과 데이터 베이스 의 특정한 열 을 되 돌려 주 는 맵 관 계 를 나타 내 는 것 입 니 다. result 데이터 베 이 스 를 대체 하 는 표 메 인 키 를 말 하여 my batis 운행 효율 을 향상 시 킵 니 다.id 속성 은 영역 대상 의 속성 이름 을 정의 하고 property 속성 은 데이터 시트 의 열 이름 을 지정 합 니 다.정의 column, my batis 는 자동 으로 결과 집합 과 영역 대상 간 의 상호 전환 을 완성 합 니 다.저 희 는 각각 resultMap, insert, delete, select 을 사용 하여 변경 문 구 를 추가 삭제 하고 update 이 문 구 를 유일 하 게 표시 하 는 데 사 용 됩 니 다. id 이 문 구 를 받 아들 일 수 있 는 매개 변 수 를 가리 키 고 parameterType 속성 은 앞에서 사용 resultMap 태그 가 설정 한 id 값 으로 설정 하면 my batis 는 자동 으로 조회 결 과 를 매 핑 합 니 다.
3.2 정의 DataSource

    
        
        
        
        
    

3.3 정의 SqlSessionFactory Bean
MyBatis - Spring 에서 저 희 는 SqlSession Factory Bean 을 사용 하여 Session 공장 을 만 듭 니 다. 설정 정 보 는 다음 과 같 습 니 다.

        
        
    
resultMap 속성 은 앞에서 설 정 된 DataSource 입 니 다. dataSource 속성 은 우리 가 설정 한 SQL 맵 파일 을 가리 키 고 있 습 니 다. 여 기 는 classpath 경로 에서 mapper 폴 더 의 모든 Mapper 이름 으로 끝 나 는 XML 파일 로 설정 되 어 있 습 니 다.
3.4 SqlSessionTemplate 사용
SqlSession Template 류 는 MyBatis - Spring 의 핵심 입 니 다.이 종 류 는 MyBatis 를 관리 하 는 SqlSession 입 니 다. MyBatis 의 SQL 방법 을 호출 하여 번역 이 이상 합 니 다.SqlSessionTemplate 는 스 레 드 가 안전 하여 여러 DAO 가 공유 하여 사용 할 수 있 습 니 다.SqlSessionTemplate 는 SqlSession 인 터 페 이 스 를 실 현 했 습 니 다. 우 리 는 이것 을 사용 하여 sqlSession 을 정의 합 니 다. 설정 방식 은 다음 과 같 습 니 다.
    
        
    

그 중에서 구조 기 매개 변 수 는 설 정 된 것 mapperLocations 으로 전 달 됩 니 다.
StudentDAO 를 정의 합 니 다. 인터페이스 정 의 는 다음 과 같 습 니 다.
public interface StudentDAO {

    Student getStudentById(int studentId);

    int getStudentNums();

    void insertStudent(Student student);

    void deleteStudent(int studentId);

    void updateStudent(Student student);
}

인터페이스 방법 은 자체 해석 이 라 고 명명 되 었 으 며, 여 기 는 모든 방법의 의 미 를 더 이상 설명 하지 않 습 니 다.StudentDAO 방식 은 다음 과 같 습 니 다.
public class StudentDAOImpl implements StudentDAO{

    private SqlSession sqlSession;

    public Student getStudentById(int studentId) {
        return sqlSession.selectOne("getStudentById",studentId);
    }

    public int getStudentNums() {

        return  sqlSession.selectOne("getStudentNums");
    }

    public void insertStudent(Student student) {
        sqlSession.insert("insertStudent",student);
    }

    public void deleteStudent(int studentId) {
        sqlSession.delete("deleteStudent",studentId);
    }

    public void updateStudent(Student student) {
        sqlSession.update("updateStudent",student);
    }

    public void setSqlSession(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }
}

SqlSession 형식 을 가 진 개인 속성 을 실현 합 니 다. set 방법 으로 주입 합 니 다. XML 설정 방식 은 다음 과 같 습 니 다.
 
        
 

이상 저 희 는 SqlSessionTemplate 를 사용 하여 Spring 에서 my batis 를 통합 하 는 작업 을 완 성 했 습 니 다. 저 희 는 각 분야 대상 의 조작 에 DAO 인 터 페 이 스 를 정의 하고 실현 합 니 다. 저 희 는 모든 DAO 실현 에 sqlSession 을 주입 해 야 합 니 다.
3.5 SqlSessionDao Support 사용 (간단하게)
우 리 는 SqlSessionTemplate 를 사용 하여 SQL 에 대한 작업 을 크게 간소화 하 였 으 나, 우 리 는 여전히 모든 실현 클래스 에 setter 주입 방법 을 추가 해 야 한다. 물론 우 리 는 기본 클래스 를 정의 한 다음 에 모든 DAO 가 이 기본 클래스 를 계승 하도록 한 다음 에 Spring 이 제공 하 는 자동 주 입 량 을 간소화 할 수 있다.이 절 에서 우 리 는 SqlSessionDao Support 류 를 사용 하 는 것 을 배 웠 습 니 다. 이것 은 SqlSessionTemplate 의 기본 클래스 를 봉인 하 는 것 과 같 습 니 다. 우 리 는 sqlSessionFactory 를 사용 하여 하나의 getSqlSession() 를 얻 기만 하면 됩 니 다. 나머지 작업 은 SqlSessionTemplate 의 호출 과 같 습 니 다.
StudentDAOSupport 인터페이스 정의:
public interface StudentDAOSupport {

    Student getStudentById(int studentId);

    int getStudentNums();

    void insertStudent(Student student);

    void deleteStudent(int studentId);

    void updateStudent(Student student);

StudentDAOSupport 인터페이스 구현:
public class StudentDAOSupportImpl  extends SqlSessionDaoSupport implements StudentDAOSupport {

    public Student getStudentById(int studentId) {
        return getSqlSession().selectOne("getStudentById",studentId);
    }

    public int getStudentNums() {
        return  getSqlSession().selectOne("getStudentNums");
    }

    public void insertStudent(Student student) {

        getSqlSession().insert("insertStudent",student);
    }

    public void deleteStudent(int studentId) {

        getSqlSession().delete("deleteStudent",studentId);
    }

    public void updateStudent(Student student) {
        getSqlSession().update("updateStudent",student);
    }
}

XML 설정 은 student Dao Support 에 id 를 제공 하 는 bean:

    


SqlSessionDao Support 는 sqlSessionFactory 나 sqlSessionTemplate 속성 을 설정 해 야 합 니 다.이상 에서 저 희 는 명시 적 인 방식 으로 SqlSessionTemplate 속성 을 설정 합 니 다. sqlSessionFactorySqlSessionDaoSupport 인 스 턴 스 를 만 듭 니 다. 물론 저 희 는 Spring 의 자동 주입 을 사용 하여 설정 코드 를 절약 할 수 있 습 니 다.둘 다 설정 되면 SqlSession Factory 는 무시 된다.
3.6 주입 매 핑 기 (좀 더 간단하게)sqlSessionFactorySqlSessionTemplate 는 데이터 조작 에 관 한 코드 량 을 현저히 줄 였 고 my batis 는 맵 방식 을 제공 하여 코드 량 을 더욱 줄 이 는 데 지원 을 제공 했다.my batis 는 프 록 시 클래스 를 사용 하여 구체 적 인 인터페이스 구현 코드 를 간소화 합 니 다.
정의 맵 인터페이스:
public interface StudentMapper {

    Student getStudentById(int studentId);

    int getStudentNums();

    void insertStudent(Student student);

    void deleteStudent(int studentId);

    void updateStudent(Student student);
}

맵 기 설정, my batis 맵 기 주입 완료:

    
    


우 리 는 SqlSessionTemplate 이름 이 SqlSessionDaoSupport 인 bean 을 사용 합 니 다.이 bean 에 org.mybatis.spring.mapper.MapperFactoryBeanstudentMapper 속성 을 제공 해 야 합 니 다.mapperInterface 우 리 는 이미 여러 번 사 용 했 는데 여 기 는 군말 에 불과 하 다.sqlSessionFactory 우리 에 게 정 의 된 맵 인터페이스 (일반적으로 Mapper 로 끝 나 는 이름) 는 위의 예 에서 우리 가 정의 한 sqlSessionFactory 인터페이스 입 니 다.이렇게 하면 my batis 는 자동 으로 이 맵 기 인터페이스 에 프 록 시 를 만 들 고 관련 SQL 파일 정의 mapperInterface 를 정의 할 때 불 러 올 SQL 맵 파일 위 치 를 명 확 히 정 합 니 다).이렇게 두 단계 만 있 으 면 우 리 는 매 핑 기 접속 작업 을 완성 했다.⚠️앞에서 정의 한 SQL 맵 파일 에 대한 인상 이 있다 면 StudentMapper 태그 아래 에 sqlSessionFactory 속성 이 있 는 것 을 기억 해 야 합 니 다. 우 리 는 mapper 으로 설정 되 었 습 니 다. 그 당시 에 이렇게 설정 한 이 유 는 맵 방식 (현재 namespacecom.liangwei.learnspring.dao.StudentMapper 방식 이 이 namespace 속성 을 강제 적 으로 제한 하지 않 았 기 때 문 입 니 다.namespace 속성 설정 이 맵 인터페이스 와 완전히 한 정 된 이름 이 다 르 면 찾 는 방법 등 유형의 오 류 를 보고 합 니 다.
더 쉬 워.
여러 개의 맵 기 를 설정 해 야 할 때 상기 방식 으로 설정 하 는 데 도 많은 시간 이 걸 립 니 다. my batis 는 우리 에 게 더욱 편리 한 방식 을 제공 합 니 다. MapperScanner Configure 설정 을 사용 합 니 다.클래스 경로 에서 맵 을 찾 아 MapperFactory Bean 으로 만 듭 니 다.설정 방법:

  


이렇게 하면 dao 패키지 이름 의 모든 맵 클래스 를 MapperFactory Bean 으로 만 듭 니 다.물론 현실 프로젝트 실천 에서 우 리 는 보통 가방 이름 을 mapper 로 명명 합 니 다. 예 를 들 어 우 리 는 SqlSessionTemplate 로 바 꿀 수 있 습 니 다. 그러면 유지 코드 를 읽 고 이해 하 는 데 편리 합 니 다.여러 개의 패키지 경 로 를 설정 해 야 할 때, 우 리 는 분점 이나 쉼표 로 분할 할 수 있다.
3.7 코드 테스트
이상 우 리 는 서로 다른 세 가지 방식 으로 Spring 과 my batis 를 통합 시 켰 습 니 다. 우 리 는 SqlSessionDaoSupport, com.liangwei.learnspring.dao.mapper, studentDao 라 는 세 개의 bean 을 정 의 했 습 니 다. 우 리 는 그것들 을 얻 고 직접 사용 하 는 방법 을 정의 할 수 있 습 니 다. 테스트 코드 는 다음 과 같 습 니 다.
public class Application {

    public static void main(String[] args){


        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("dao.xml");


        /*    bean */
        StudentDAO studentDAO = applicationContext.getBean("studentDao", StudentDAO.class);

        /*        */
        System.out.println(studentDAO.getStudentNums());

        /*     ID 1      */
        System.out.println(studentDAO.getStudentById(1));

        Student student = new Student();
        student.setId(3);
        student.setName("Jane");
        student.setGender("F");
        student.setAge(20);
        /*       */
        studentDAO.insertStudent(student);
        /*         ,ID=3 */
        System.out.println(studentDAO.getStudentById(3));

        student.setGender("M");
        /*         ,     M */
        studentDAO.updateStudent(student);
        System.out.println(studentDAO.getStudentById(3));

        /*  studentID 3      */
        studentDAO.deleteStudent(3);


        /*  SqlSessionDaoSupport    */

        StudentDAOSupport studentDAOSupport = applicationContext.getBean("studentDaoSupport", StudentDAOSupport.class);

        System.out.println(studentDAOSupport.getStudentNums());

        System.out.println(studentDAOSupport.getStudentById(1));
        student.setGender("F");
        studentDAOSupport.insertStudent(student);
        System.out.println(studentDAOSupport.getStudentById(3));

        student.setGender("M");
        studentDAOSupport.updateStudent(student);
        System.out.println(studentDAOSupport.getStudentById(3));
        studentDAOSupport.deleteStudent(3);

        /* StudentMapper */
        StudentMapper studentMapper = applicationContext.getBean("studentMapper", StudentMapper.class);

        System.out.println(studentMapper.getStudentNums());

        System.out.println(studentMapper.getStudentById(1));

        student.setGender("F");
        studentMapper.insertStudent(student);

        System.out.println(studentMapper.getStudentById(3));
        student.setGender("M");
        studentMapper.updateStudent(student);
        System.out.println(studentMapper.getStudentById(3));

        studentMapper.deleteStudent(3);
    }
}

예 를 들 어 우 리 는 모든 방식 의 인터페이스 방법 에 대해 호출 을 했 는데 코드 가 비교적 간단 하고 주석 과 결합 하면 이해 하기 쉬 우 므 로 여기 서 우 리 는 더 이상 설명 하지 않 을 것 이다.상기 코드 를 실행 하면 저 희 는 콘 솔 에서 다음 과 같은 정 보 를 출력 할 수 있 습 니 다.
2 //        
[1,Jone,F,20] //  studentId 1      
[3,Jane,F,20] //  studentId 3           
[3,Jane,M,20]//   studentId 3           :     M
2
[1,Jone,F,20]
[3,Jane,F,20]
[3,Jane,M,20]
2
[1,Jone,F,20]
[3,Jane,F,20]
[3,Jane,M,20]

출력 정 보 를 이해 하기 위해 우 리 는 출력 정보 에 주석 을 달 았 고 테스트 코드 와 주석 을 결합 하면 출력 결 과 를 더욱 편리 하 게 이해 할 수 있다.
코드 다운로드
총화
본 고 는 Spring 구조 에서 my batis 의 도입 과 통합 을 완 성 했 고 우 리 는 studentDaoSupport 프로젝트 를 통 해 세 가지 서로 다른 방식 studentMapper, mybatis-springSqlSessionTemplate 을 사용 하여 통합 작업 을 완성 했다.상기 한 단계 의 조작 을 통 해 우 리 는 my batis 의 간편 성, 조작 성 을 느 꼈 다. 이것 은 SQL 구문 과 프로젝트 코드 인터페이스 의 의존 도 를 나 누 어 번 거 로 운 데이터 베이스 모델 코드 조작 을 줄 이 고 프로그램 개발 자의 업무 효율 을 크게 향상 시 켰 다.Spring 프레임 워 크 에서 my batis 를 통합 한 후에 남 은 주요 작업 은 DAO 나 Mapper 인 터 페 이 스 를 정의 하 는 것 입 니 다. 맵 의 XML 파일 을 작성 하 는 것 입 니 다. my batis 홈 페이지 에서 비교적 상세 한 문 서 를 보 여 주 었 습 니 다. 홈 페이지 에서 문 서 를 보고 공부 할 수 있 습 니 다. 여기 서도 XML 파일 에 관 한 편리 한 문법 글 을 쓸 생각 이 없습니다.

좋은 웹페이지 즐겨찾기