Spring Boot 2 입문 부터 실전 까지: 유 니 버 설 Mapper 통합 단일 표 조작 간소화

데이터베이스 접근 은 웹 응용 에서 없어 서 는 안 될 부분 입 니 다.현재 가장 많이 사용 되 는 데이터베이스 ORM 프레임 워 크 는 Hibernate 와 Mybatis 가 있 는데 Hibernate 는 전통 적 인 IT 기업 에서 많이 사용 하 는 것 같 고 Mybatis 는 인터넷 기업 에서 많이 응용 된다.유 니 버 설 매 퍼https://github.com/abel533/Mapper) Mybatis 를 기반 으로 한 시트 의 추가 삭제 와 검 사 를 일반적인 방법 으로 구현 하여 SQL 이 작성 한 오픈 소스 프레임 워 크 를 줄 이 고 오픈 소스 에 대응 하 는 mapper - spring - boot - starter 도 제공 합 니 다.우 리 는 이 를 바탕 으로 더 많은 재 활용 을 위해 맞 춤 형 내용 을 추가 했다.
프레임 소스 주소:https://github.com/ronwxy/base-spring-boot (지속 적 인 업데이트 보완 중, follow, star 환영) 데모 소스 주소:https://github.com/ronwxy/springboot-demos/tree/master/springboot-tkmapper
오픈 소스 mapper - spring - boot - starter 를 바탕 으로 다음 과 같은 내용 을 추가 하 였 습 니 다.
  • MySQL 데이터베이스 와 PostgreSQL 데이터베이스 에 자바 형식 과 데이터베이스 형식의 변환 처리 클래스 를 추가 했다. 예 를 들 어 List, Map 형식 과 MySQL 데이터베이스 의 json 형식 을 변환 처리 하 는 것
  • 도 메 인, Mapper, Service, Controller 각 층 을 봉인 하고 기본 적 인 첨삭 검사 기능 을 각 층 에서 유 니 버 설 화
  • druid 연결 탱크 기반 자동 설정
  • 기본 맵 의 복잡 한 유형 속성 (주로 List, Map 형식, 다른 사용자 정의 유형 은 사용자 정의 변환 처리 류 가 필요 합 니 다) 과 같은 다른 조정 사항 은 간단 한 유형 으로 처리 합 니 다
  • .
  • parent 프로젝트 를 제공 하여 자주 사용 하 는 프레임 워 크 를 통합 시 켰 습 니 다. 실제 프로젝트 는 parent 를 계승 하여 의존 설정 을 간소화 할 수 있 습 니 다 (지속 적 인 업데이트 보완)
  • 이 프레임 워 크 는 실제 springboot 기반 프로젝트 에 사용 할 수 있 으 며, 데이터 원본 을 간단하게 설정 하면 druid 연결 탱크 와 유 니 버 설 mapper 의 기능 을 도입 할 수 있 으 며, 각 층 의 기본 적 인 추가 삭제 검사 방법 을 도입 할 수 있 습 니 다.
    어떻게 사용 합 니까?다음은 사용 절 차 를 제시 하고 예 시 를 참고 할 수 있 습 니 다.https://github.com/ronwxy/springboot-demos/tree/master/springboot-tkmapper
    1. 프레임 Maven 배치 설치
    프레임 워 크 원본 을 다운로드 한 후 프로젝트 루트 에서 실행 mvn clean install 하면 로 컬 maven 라 이브 러 리 에 설치 할 수 있 습 니 다.공유 가 필요 하고 Nexus 사복 을 입 었 다 면 루트 pom. xml 파일 에 distributionManagement 설정 을 추가 하고 Nexus 창고 배포 주 소 를 지정 하여 원 격 maven 창고 에 설치 합 니 다. 예 를 들 어 mvn clean deploy
    <distributionManagement>
         <repository>
             <id>nexus-releasesid>
             <url>
                 http://ip:port/repository/maven-releases/
             url>
         repository>
         <snapshotRepository>
             <id>nexus-snapshotsid>
             <url>
                 http://ip:port/repository/maven-snapshots/
             url>
         snapshotRepository>
     distributionManagement>

     
    위 에서 지정 한 reposcory 는 maven 의 모든 프로필 settings. xml 에 해당 하 는 계 정 설정 이 있어 야 합 니 다 (id 는 일일이 대응 해 야 합 니 다). 예 를 들 어 
     <servers>
       <server>
         <id>nexus-snapshotsid>
         <username>adminusername>
         <password>xxxpassword>
       server>
    <server>
         <id>nexus-releasesid>
         <username>adminusername>
         <password>xxxpassword>
       server>
     servers>

     
    2. pom. xml 설정
    프로젝트 에 이 데이터베이스 프레임 워 크 를 도입 하 는 데 는 세 가지 방식 이 있 습 니 다.
  • cn. jboost. springboot boot: tkmapper - spring - boot - starter (연결 탱크 없 음) 직접 도입
  • cn. jboost. springboot boot: druid - spring - boot - starter (druid 연결 풀 지원) 직접 도입
  • 프로젝트 계승 cn. jboost. springboot: spring - boot - parent (druid 연결 풀 사용)
  • 세 가지 방식 의 pom. xml 설정 은 다음 과 같 습 니 다.
    #     
    <dependency>
       <groupId>cn.jboost.springbootgroupId>
       <artifactId>tkmapper-spring-boot-starterartifactId>
       <version>1.2-SNAPSHOTversion>
    dependency>
    
    #     
    <dependency>
       <groupId>cn.jboost.springbootgroupId>
       <artifactId>druid-spring-boot-starterartifactId>
       <version>1.2-SNAPSHOTversion>
    dependency>
    
    #     
    <parent>
       <groupId>cn.jboost.springbootgroupId>
       <artifactId>spring-boot-parentartifactId>
       <version>1.2-SNAPSHOTversion>
       <relativePath/> 
    parent>

     
    상황 에 따라 my sql 또는 postgresql 의 구동 의존 도 를 도입 합 니 다 (다른 데이터 베 이 스 는 형식 변환 지원 을 하지 않 고 테스트 하지 않 습 니 다)
     
    3. 데이터 원본 설정
    druid 연결 풀 을 사용 하면 application. yml 설정 파일 에 다음 데이터 원본 설정 을 추가 합 니 다 (추천)
    spring:
      datasource:
        druid:
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
          username: root
          password:
          #      
          initialSize: 2  #      
          minIdle: 1   #     
          maxActive: 5 #     
          druidServletSettings:
            allow: 127.0.0.1
            deny:
            loginUsername: admin
            loginPassword: Passw0rd
            resetEnable: true
          druidFilterSettings:
            exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
          maxWait: 60000   #              
          timeBetweenEvictionRunsMillis: 60000 #              ,           ,     
          minEvictableIdleTimeMillis: 300000 #                 ,     
          validationQuery: SELECT 'x'
          testWhileIdle: true
          testOnBorrow: false
          testOnReturn: false
          poolPreparedStatements: true #   PSCache,         PSCache   
          maxPoolPreparedStatementPerConnectionSize: 20
          filters: stat #,wall(  wall         sql,druid sql    ) #          filters,       sql    ,'wall'     
          connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 #   connectProperties     mergeSql  ; SQL  
          useGlobalDataSourceStat: true #     DruidDataSource     

     
    연결 탱크 를 사용 하지 않 으 면 설정 이 상대 적 으로 간단 합 니 다. 다음 과 같 습 니 다. 
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
        username: root
        password:
        driver-class-name: com.mysql.jdbc.Driver

     
    4. 해당 도 메 인, mapper, service, controller 각 층 대상 정의 
    demo 를 예 로 들 면 (demo 데이터베이스 스 크 립 트 는 resources / schema. sql 참조) domain 은 사용자 클래스 를 정의 합 니 다.
    @Table(name = "user")
    @Getter
    @Setter
    @ToString
    public class User extends AutoIncrementKeyBaseDomain<Integer> {
        private String name;
        @ColumnType(jdbcType = JdbcType.CHAR)
        private Gender gender;
        private List<String> favor;
        private Map<String, String> address;
    
        public enum Gender{
            M,
            F
        }
    }

     
    지정 한 데이터베이스 테이블 이름 @Table 주석 을 추가 해 야 합 니 다. 계승 AutoIncrementKeyBaseDomain 을 통 해 홈 키 를 추가 하거나 UUIDKeyBaseDomain UUID 홈 키 를 구현 할 수 있 습 니 다. 다른 유형의 홈 키 를 사용자 정의 하면 계승 BaseDomain 합 니 다. 
    이 프레임 워 크 서비스 계층 의 일반적인 방법 실현 BaseService 은 단일 열 메 인 키 만 지원 하고 그룹 메 인 키 는 지원 되 지 않 습 니 다 (조합 메 인 키 를 사용 하 는 것 도 권장 하지 않 습 니 다)
    프레임 워 크 는 기본적으로 List, Map 등 복잡 한 유형 속성 에 my sql 의 json 형식 이나 post gresql 의 jsonb 형식 을 반영 합 니 다. 만약 에 특정한 속성 이 맵 이 필요 하지 않 으 면 @ Transient 주 해 를 추가 할 수 있 습 니 다.매 거 진 형식 은 @ ColumnType 지정 jdbc Type 을 추가 해 야 합 니 다.
    dao 층 정의 UserMapper,
    @Repository
    public interface UserMapper extends BaseMapper<User> {
    }

      BaseMapper 기본적으로 단일 표 의 추가 삭제 및 일괄 삽입 등 기능 을 실현 합 니 다. 복잡 한 조 회 를 정의 하려 면 이 인터페이스 에서 정의 한 다음 에 mapper xml 파일 을 통 해 작성 할 수 있 습 니 다. 
    서비스 계층 정의  UserServiceBaseService 의 유 니 버 설 기능 (원본 코드 를 구체 적 으로 볼 수 있 음) 을 계승 하여 이 클래스 에서 사용자 정의 방법 을 사용 할 수 있 습 니 다.
    @Service
    public class UserService extends BaseService<Integer, User> {
    
        @Transactional
        public void createWithTransaction(User user){
            create(user);
            //      
            throw new RuntimeException("    ,           ");
        }
    }

     
    controller 계층 정의  UserController, 계승 BaseController 의 유 니 버 설 인터페이스 (구체 적 으로 소스 코드 를 볼 수 있 음) 
    @RestController
    @RequestMapping("/user")
    public class UserController extends BaseController<Integer, User> {
    }

     
    예 를 들 어 각 층 에 대응 하 는 인터페이스 나 클래스 만 정의 하고 기초 인터페이스 나 클래스 를 계승 하면 사용자 의 기본 적 인 삭제 와 검사 기능 을 완성 할 수 있 으 며 구체 적 인 실현 코드 를 쓸 필요 가 없다. 
    5. 테스트, 실행
  • 예제 에서 두 개의 새로운 사용자 의 유닛 테스트 를 제공 하 였 으 며, 참고 SpringbootTkmapperApplicationTests
  • 실행 하고 주 클래스 에서 직접 실행 한 다음 브 라 우 저 에서 엽 니 다. http://localhost:8080/user 유닛 테스트 에서 만 든 사용자 (기타 인터페이스 참조 BaseController 구현)
  • 를 보 여 줍 니 다.
    6. 총화
    본 고 는 프레임 워 크 tk.mybatis:mapper-spring-boot-starter 를 바탕 으로 사용자 정의 확장 을 하여 어느 정도 재 활용 을 실현 하도록 한다.실제 프로젝트 개발 에 사용 할 수 있 고 사용 과정 에서 문제 가 발생 하면 공중 번호 댓 글 피드백 에 주목 할 수 있다.나의 개인 블 로그 주소:http://blog.jboost.cn나의 톱 공간: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112나의 github 주소:https://github.com/ronwxy나의 위 챗 공식 번호: jboost - ksxy
    ————————————————————————————————————————
    나의 위 챗 공식 번 호 를 주목 하고 최신 공 유 를 얻 는 것 을 환영 합 니 다.

    좋은 웹페이지 즐겨찾기