以前在网上搜的问题多了,第一次写博客,说明的可能不足,望指出改善。
学技术有一段时间了,最近想搭建一套框架,做些小项目,搭建项目的时候才发现比开发难的多了,不过难得好,学的多嘛,这里就先讲一下遇到的一个问题。
编译器是idea,框架是spring boot + jpa,构建工具为gradle(不得不说,是比maven好不少,尤其是引入依赖的时候),在原先的配置中一开始先引入的mapstruct,建立了userMapper的接口,与正常的接口不同的是多了一个@Mapper(componentModel = "spring")的注解,当然,毕竟是才搭建框架,没写复杂。
springboot配置jpa的,可以在(https://mapstruct.org/documentation/dev/reference/html/#_gradle)里面看怎么在gradle文件中配置mapstruct,
plugins { ... id 'net.ltgt.apt' version '0.20' } // You can integrate with your IDEs. // See more details: https://github.com/tbroyer/gradle-apt-plugin#usage-with-ides apply plugin: 'net.ltgt.apt-idea' apply plugin: 'net.ltgt.apt-eclipse' dependencies { ... implementation "org.mapstruct:mapstruct:${mapstructVersion}" annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" // If you are using mapstruct in test code testAnnotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" }
这是里面简单配置的,单配置一个还是可以的,配置完以后,在mapper接口类上加上@Mapper注解,就在编译出的build文件里会生成generated文件夹,一直往下层找,在generated/sources/annotationProcessor/main的文件夹下就能找到自己配置过mapper的包了,包内是配置上@Mapper注解的接口生成的实现类,里面就是对接口里面写的方法的实现,与手写的一样,都是给一个个属性set值,当然,类型不同可能还会加些判断,比如判断是不是null,还有枚举的转换。
然后再配置jpa,jpa的配置就得用到数据库了,可以自己在本地建立一个,也可以在阿里云,腾讯云上购买一个,要是自己学习用,1核1G就差不多了,也不贵,当然,主要是为了自己能够随时用,省的到哪都还得安装数据库,然后导入数据库脚本。
说到jpa,就不得不说querydsl了,早期的时候用jdbc,后面学ssh以后觉得hql很晦涩难懂(主要是当时技术不高,当然,现在也不高),之后就用mybatis,用mybatis的时候还挺不错,主要是mybatis支持普通的sql查询,存储过程和高级映射,配置上generator后,直接根据数据库字段以及关系生成实体类以及dao接口。用mybatis的时候确实很爽,然后现在用的是jpa,好歹有写过hql,上手jpa难度不算很大,至于玩花那就得多写多学多研究了。废话不多说了,接着说集成jpa
jpa的配置分两方面,一是gradle文件中的依赖,二是application.yml(是的,我就不用properties)中jpa相关的配置
这是在yml文件配置的jpa相关的
datasource: url: 数据库url地址 username: 用户名 password: 密码 tomcat: init-s-q-l: "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;" test-on-borrow: false validation-query: select 1 test-on-connect: false test-on-return: false test-while-idle: false driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update naming: physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy show-sql: false properties.hibernate: enable_lazy_load_no_trans: false dialect: org.hibernate.dialect.MySQL5Dialect generate_statistics: false cache: use_second_level_cache: false use_query_cache: false region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory database: MYSQL 下面是jpa相关的依赖 compile 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'mysql:mysql-connector-java' compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.4.2.Final' compile group: 'com.querydsl', name: 'querydsl-jpa', version: '4.2.1'
配置完jpa以及querydsl的依赖以后,实体类就用到了@Entity注解,在注解里配置上要生成的表名,这样在生成表的同时,也会在项目中生成querydsl文件,querydsl文件中会生成Q类,以供后面的查询使用
这时候真正的问题来了,mapstruct和jpa同时配置以后,只生成了mapper的文件,Q类并没有生成,于是我用task来指定生成的文件,由于本人Groovy语法几乎是一点不懂,所以在生成文件的时候还是只生成一个,于是就换了别的方式,下面是最新的配置文件
plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' id 'war' id "net.ltgt.apt-idea" version "0.21" id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } apply plugin: 'io.spring.dependency-management' apply plugin: "net.ltgt.apt" group = 'com.game' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { compile 'org.springframework.boot:spring-boot-starter-web' compile 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' compile group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: '2.1.5.RELEASE' testImplementation 'org.springframework.boot:spring-boot-starter-test' compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '5.4.2.Final' compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.4.2.Final' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9' compile group: 'com.querydsl', name: 'querydsl-jpa', version: '4.2.1' compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.3' compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3' /** * mapStruct依赖 */ compile('org.mapstruct:mapstruct-jdk8:1.3.0.Final') annotationProcessor("org.mapstruct:mapstruct-processor:1.3.0.Final") compile("org.projectlombok:lombok:1.16.18") annotationProcessor("org.projectlombok:lombok:1.16.18") /** * redis依赖 */ compile("org.springframework.boot:spring-boot-starter-data-redis") /** * token相关依赖 */ compile group: 'com.auth0', name: 'java-jwt', version: '3.8.1' } clean{ delete '/src/querydsl' } querydsl { jpa = true }
token和redis的忽略,这里配置上了querydsl,在gradle命令中,也有了querydsl相关的命令
这样配置以后,就好用了,这个问题可能有些偏,但架不住人多用,总会有一两个碰上的