网站建设管理的建议,大连住房和城乡建设网站,网件路由器登陆网址,微信开放平台账号在当前微服务盛行的情况下#xff0c;Spring Boot 或 Spring Cloud 为基础的微服务体系是主流#xff0c; 也是目前业务场景中新的选型方向
数据库表
-- filesystem.user definitionCREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(50) NOT NULL,…在当前微服务盛行的情况下Spring Boot 或 Spring Cloud 为基础的微服务体系是主流 也是目前业务场景中新的选型方向
数据库表
-- filesystem.user definitionCREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(50) NOT NULL,password varchar(50) NOT NULL,created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4;
Maven 依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdJooqSpringBoot/artifactIdversion1.0.0/versionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.2.1.RELEASE/version/parentpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetjooq.version3.12.3/jooq.version/propertiesrepositoriesrepositoryidnexus/idnamenexus-repository/nameurlhttp://nexus.caih.local/repository/maven-public//urlreleasesenabledtrue/enabled/releases/repository/repositoriesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jooq/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependencydependencygroupIdorg.jooq/groupIdartifactIdjooq-codegen/artifactIdscopeprovided/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdexecutionsexecutiongoalsgoalbuild-info/goal/goals/execution/executionsconfigurationexecutabletrue/executable/configuration/plugin!-- 代码生成器插件 --plugingroupIdorg.jooq/groupIdartifactIdjooq-codegen-maven/artifactIdversion${jooq.version}/versionconfigurationjdbcdrivercom.mysql.cj.jdbc.Driver/driverurljdbc:mysql://112.126.80.77:12345/filesystem?serverTimezoneGMT%2B8/urluserroot/userpasswordadmin123456/password/jdbcgeneratordatabaseincludes.*/includesinputSchemafilesystem/inputSchema/databasetargetpackageNamecom.mxl.jooq/packageNamedirectory/src/main/java/directory/target/generator/configuration/plugin/plugins/build
/project
配置
Spring Boot最大的一个特性就是有很多 AutoConfiguration 自动配置, spring-boot-starter-jooq 依赖于 spring-boot-starter-jdbc 其自动配置了数据源事务管理器等
spring-boot-starter-jooq 自动配置了 org.jooq.Configuration 和 org.jooq.DSLContext 对象。 我们只需要在 src/main/resources/application.yml 内写好数据源相关配置其他的一切都可以交给Spring Boot进行处理
src/main/resources/application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/learn-jooq?serverTimezoneGMT%2B8username: rootpassword: root
新增springboot启动类
package com.mxl;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class JooqSpringBootDemo {public static void main(String[] args) {SpringApplication.run(JooqSpringBootDemo.class, args);}
}编译jooq代码
mvn jooq-codegen:generate
编写业务代码
package com.mxl.controller;import com.mxl.info.UserInfo;
import com.mxl.info.UserInfoRequest;
import com.mxl.jooq.tables.records.UserRecord;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.SerializationUtils;
import org.springframework.web.bind.annotation.*;import java.util.ArrayList;
import java.util.List;import static com.mxl.jooq.Tables.USER;RestController
RequestMapping(value /demo)
public class DemoController {private DSLContext dslContext;public DemoController(DSLContext dslContext) {this.dslContext dslContext;}GetMapping(/query)public ListUserInfo query(){// fetch方法可以返回一个结果集对象 Result// jOOQ的Result对象实现了List接口可以直接当做集合使用ListUserRecord fetchIntoClassResultList dslContext.select().from(USER).fetchInto(UserRecord.class);ListUserInfo result new ArrayList();for (UserRecord userRecord : fetchIntoClassResultList) {UserInfo userInfo new UserInfo();userInfo.setUserName(userRecord.getUsername());userInfo.setPassWord(userRecord.getPassword());result.add(userInfo);}return result;}PostMapping(/insert)public String insert(RequestBody UserInfoRequest request){UserRecord userRecord dslContext.newRecord(USER);userRecord.setUsername(request.getUserName());userRecord.setPassword(request.getPassWord());int insert userRecord.insert();return success: insert;}PostMapping(/update)public String update(RequestBody UserInfoRequest request){UserRecord userRecord dslContext.newRecord(USER);userRecord.setId(request.getId());userRecord.setUsername(request.getUserName());userRecord.setPassword(request.getPassWord());userRecord.update();return success;}DeleteMapping(/delete)public String delete(RequestBody UserInfoRequest request){UserRecord userRecord dslContext.newRecord(USER);userRecord.setId(request.getId());userRecord.delete();return success;}}
package com.mxl.info;public class UserInfo {private String userName;private String passWord;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord passWord;}
}
package com.mxl.info;public class UserInfoRequest {private String userName;private String passWord;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord passWord;}
}JooqAutoConfiguration 源码解析
以下是jOOQ的自动配置源码从 spring-boot-autoconfigure 内拷贝而来可以看出此配置会在数据源配置和事务配置之后执行
对于我们经常用到的就是 Bean dslContext 和 jooqConfiguration 大部分自动配置的Bean都会使用 ConditionalOnMissingBean 注解 此注解标识在没有某个Bean的情况下才会执行该注解所标注的配置
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration
/**link EnableAutoConfiguration Auto-configuration} for JOOQ.** author Andreas Ahlenstorf* author Michael Simons* author Dmytro Nosan* since 1.3.0*/* {
Configuration(proxyBeanMethods false)
ConditionalOnClass(DSLContext.class)
ConditionalOnBean(DataSource.class)
AutoConfigureAfter({ DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class })
public class JooqAutoConfiguration {BeanConditionalOnMissingBean(ConnectionProvider.class)public DataSourceConnectionProvider dataSourceConnectionProvider(DataSource dataSource) {return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource));}BeanConditionalOnBean(PlatformTransactionManager.class)public SpringTransactionProvider transactionProvider(PlatformTransactionManager txManager) {return new SpringTransactionProvider(txManager);}BeanOrder(0)public DefaultExecuteListenerProvider jooqExceptionTranslatorExecuteListenerProvider() {return new DefaultExecuteListenerProvider(new JooqExceptionTranslator());}Configuration(proxyBeanMethods false)ConditionalOnMissingBean(DSLContext.class)EnableConfigurationProperties(JooqProperties.class)public static class DslContextConfiguration {Beanpublic DefaultDSLContext dslContext(org.jooq.Configuration configuration) {return new DefaultDSLContext(configuration);}BeanConditionalOnMissingBean(org.jooq.Configuration.class)public DefaultConfiguration jooqConfiguration(JooqProperties properties, ConnectionProvider connectionProvider,DataSource dataSource, ObjectProviderTransactionProvider transactionProvider,ObjectProviderRecordMapperProvider recordMapperProvider,ObjectProviderRecordUnmapperProvider recordUnmapperProvider, ObjectProviderSettings settings,ObjectProviderRecordListenerProvider recordListenerProviders,ObjectProviderExecuteListenerProvider executeListenerProviders,ObjectProviderVisitListenerProvider visitListenerProviders,ObjectProviderTransactionListenerProvider transactionListenerProviders,ObjectProviderExecutorProvider executorProvider) {DefaultConfiguration configuration new DefaultConfiguration();configuration.set(properties.determineSqlDialect(dataSource));configuration.set(connectionProvider);transactionProvider.ifAvailable(configuration::set);recordMapperProvider.ifAvailable(configuration::set);recordUnmapperProvider.ifAvailable(configuration::set);settings.ifAvailable(configuration::set);executorProvider.ifAvailable(configuration::set);configuration.set(recordListenerProviders.orderedStream().toArray(RecordListenerProvider[]::new));configuration.set(executeListenerProviders.orderedStream().toArray(ExecuteListenerProvider[]::new));configuration.set(visitListenerProviders.orderedStream().toArray(VisitListenerProvider[]::new));configuration.setTransactionListenerProvider(transactionListenerProviders.orderedStream().toArray(TransactionListenerProvider[]::new));return configuration;}}
}
如果我们需要使用多数据源可以在启动入口中的 SpringBootApplication 中使用
exclude 选项不让 Spring Boot 自动配置数据源和 jOOQ 的配置。
SpringBootApplication(exclude {DataSourceAutoConfiguration.class, JooqAutoConfiguration.class, TransactionAutoConfiguration.class})