Giter VIP home page Giter VIP logo

mybatis-plus-samples's Introduction

MyBatis-Plus Samples

贡献代码

企业版 Mybatis-Mate 高级特性

本工程为 MyBatis-Plus 的官方示例,项目结构如下:

  • mybatis-plus-sample-quickstart: 快速开始示例
  • mybatis-plus-sample-quickstart-springmvc: 快速开始示例(Spring MVC版本)
  • mybatis-plus-sample-reduce-springmvc: 简化掉默认mapper类示例(Spring MVC版本)
  • mybatis-plus-sample-generator: 代码生成器示例
  • mybatis-plus-sample-crud: 完整 CRUD 示例
  • mybatis-plus-sample-ddl-mysql: SQL 脚本自动维护 示例
  • mybatis-plus-sample-wrapper: 条件构造器示例
  • mybatis-plus-sample-pagination: 分页功能示例
  • mybatis-plus-sample-active-record: ActiveRecord示例
  • mybatis-plus-sample-sequence: Sequence示例
  • mybatis-plus-sample-execution-analysis: Sql执行分析示例
  • mybatis-plus-sample-performance-analysis: 性能分析示例
  • mybatis-plus-sample-optimistic-locker: 乐观锁示例
  • mybatis-plus-sample-sql-injector: 自定义全局操作示例
  • mybatis-plus-sample-auto-fill-metainfo: 公共字段填充示例
  • mybatis-plus-sample-logic-delete: 逻辑删除示例
  • mybatis-plus-sample-multi-datasource: 多数据源示例
  • mybatis-plus-sample-enum: 枚举注入示例
  • mybatis-plus-sample-dynamic-tablename: 动态表名示例
  • mybatis-plus-sample-tenant: 多租户示例
  • mybatis-plus-sample-typehandler: 类型处理器示例,例如 json 字段对象转换
  • mybatis-plus-sample-deluxe: 完整示例(包含 分页、逻辑删除、自定义全局操作 等绝大部分常用功能的使用示例,相当于大整合的完整示例)
  • mybatis-plus-sample-assembly: 分离打包示例
  • mybatis-plus-sample-resultmap: 使用 resultMap 示例
  • mybatis-plus-sample-id-generator: 自定义ID生成示例
  • mybatis-plus-sample-id-string: 字符串ID生成示例
  • mybatis-plus-sample-no-spring: 不使用spring下的示例
  • mybatis-plus-sample-pagehelper: 使用pagehelper进行分页
  • mybatis-plus-sample-association: 联表查询示例
  • mybatis-plus-sample-jsonb: 数据库 postgres 字段 jsonb 示例
  • mybatis-plus-startup-analysis : 启动性能测试示例

微信 wx153666

  • 可加作者,进入微信群

mybatis-plus-samples's People

Contributors

binarywang avatar huayanyu avatar jihch avatar jlleitschuh avatar juststarnew avatar lanjerry avatar miemieyaho avatar nancheung avatar nieqiurong avatar qmdx avatar sundongkai avatar yangyang0507 avatar yuxiaobin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-plus-samples's Issues

springboot启动报错java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSession

2018-09-10 17:14:25.974 ERROR 20024 --- [ main] o.s.boot.SpringApplication : Application run failed

java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSession
at org.mybatis.spring.mapper.ClassPathMapperScanner.(ClassPathMapperScanner.java:72) ~[mybatis-spring-1.3.2.jar:1.3.2]
at org.mybatis.spring.annotation.MapperScannerRegistrar.registerBeanDefinitions(MapperScannerRegistrar.java:59) ~[mybatis-spring-1.3.2.jar:1.3.2]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:358) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at java.util.LinkedHashMap.forEach(LinkedHashMap.java:676) ~[na:1.8.0_60]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:357) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:145) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:271) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:91) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:398) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:330) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:139) [spring-boot-test-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:44) [spring-boot-test-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:379) [surefire-booter-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:340) [surefire-booter-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125) [surefire-booter-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:413) [surefire-booter-2.21.0.jar:2.21.0]
Caused by: java.lang.ClassNotFoundException: org.apache.ibatis.session.SqlSession
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_60]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_60]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_60]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_60]
... 47 common frames omitted

2018-09-10 17:14:25.978 INFO 20024 --- [ main] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@76b07f29: startup date [Mon Sep 10 17:14:25 CST 2018]; root of context hierarchy
2018-09-10 17:14:25.982 ERROR 20024 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@229f66ed] to prepare test instance [com.baomidou.mybatisplus.samples.quickstart.SampleTest@fa4c865]

java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSession
at org.mybatis.spring.mapper.ClassPathMapperScanner.(ClassPathMapperScanner.java:72) ~[mybatis-spring-1.3.2.jar:1.3.2]
at org.mybatis.spring.annotation.MapperScannerRegistrar.registerBeanDefinitions(MapperScannerRegistrar.java:59) ~[mybatis-spring-1.3.2.jar:1.3.2]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:358) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at java.util.LinkedHashMap.forEach(LinkedHashMap.java:676) ~[na:1.8.0_60]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:357) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:145) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:271) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:91) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:398) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:330) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:139) ~[spring-boot-test-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ~[spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108) ~[spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) ~[spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) ~[spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:44) ~[spring-boot-test-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246) ~[spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) [spring-test-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159) [surefire-junit4-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:379) [surefire-booter-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:340) [surefire-booter-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125) [surefire-booter-2.21.0.jar:2.21.0]
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:413) [surefire-booter-2.21.0.jar:2.21.0]
Caused by: java.lang.ClassNotFoundException: org.apache.ibatis.session.SqlSession
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_60]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_60]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_60]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_60]
... 47 common frames omitted

大佬包更新不下来啊,

http://repo.maven.apache.org/maven2/.error=
http://gnet-central.quanshi.com:9001/nexus/content/groups/public/.lastUpdated=1575281831752
http://maven.aliyun.com/nexus/content/groups/public/.error=Could not transfer artifact com.baomidou:mybatis-plus:pom:3.2.1 from/to aliyun_1 (http://maven.aliyun.com/nexus/content/groups/public/): java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

我已经不清楚现在到底用那个版本了,那个版本更新下来都是好多错

TenantLineInnerInterceptor使用报异常

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.select.PlainSelect.getGroupByColumnReferences()Ljava/util/List;
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.github.xiaoymin.knife4j.spring.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

同时存在: LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(ItmsTaskInfo::getExceptionStatus, ExceptionStatusEnum.EXCEPTION.getCode())
.set(ItmsTaskInfo::getModifiedBy,currUserName)
.set(ItmsTaskInfo::getGmtModified,utc8Date)
.eq(ItmsTaskInfo::getId, itmsTaskInfo.getId());
this.baseMapper.update(null, updateWrapper);

2种都满足如何接,现在情况是满足一个另外一个就报错

query

晴雯你的接口不写方法,而是继承,呐个父接口在哪里?写出来的东西最起码可以对别人有点用,别人才会感谢你。

分页不正确吧


 currentpage = 1;
 limit = 5;
 IPage<Category> page = categoryService.page(
                new Page<>(currentpage,limit),
                new QueryWrapper<>()

        );

        return R.ok().put("page", page);

得出来的结果却是这个样子如果是这样我就用list了


{
  "msg": "操作成功",
  "code": 0,
  "page": {
    "current": 1,
    "pages": 0,
    "records": [
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/92357337378cce650797444bc107b0f7.jpg",
        "frontDesc": "回家,放松身心",
        "frontName": "回家,放松身心",
        "iconUrl": "http://yanxuan.nosdn.127.net/a45c2c262a476fea0b9fc684fed91ef5.png",
        "id": 1,
        "imgUrl": "//nos.netease.com/yanxuan/f0d0e1a542e2095861b42bf789d948ce.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "居家",
        "parentId": 0,
        "showIndex": 1,
        "sortOrder": 2,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/e8bf0cf08cf7eda21606ab191762e35c.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/f4ff8b3d5b0767d4e578575c1fd6b921.jpg",
        "frontDesc": "厨房",
        "frontName": "爱,囿于厨房",
        "iconUrl": "http://yanxuan.nosdn.127.net/ad8b00d084cb7d0958998edb5fee9c0a.png",
        "id": 2,
        "imgUrl": "//nos.netease.com/yanxuan/88855173a0cfcfd889ee6394a3259c4f.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "餐厨",
        "parentId": 0,
        "showIndex": 2,
        "sortOrder": 3,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/3708dbcb35ad5abf9e001500f73db615.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/dd6cc8a7e996936768db5634f12447ed.jpg",
        "frontDesc": "好吃,高颜值美食",
        "frontName": "好吃,高颜值美食",
        "iconUrl": "http://yanxuan.nosdn.127.net/c9280327a3fd2374c000f6bf52dff6eb.png",
        "id": 3,
        "imgUrl": "//nos.netease.com/yanxuan/9a29ef4f41c305a12e1459f12abd290f.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "饮食",
        "parentId": 0,
        "showIndex": 8,
        "sortOrder": 9,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/fb670ff3511182833e5b035275e4ac09.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/cad5aba2bc52d3b8adfd0232c9814de2.jpg",
        "frontDesc": "配角,亦是主角",
        "frontName": "配角,亦是主角",
        "iconUrl": "http://yanxuan.nosdn.127.net/11abb11c4cfdee59abfb6d16caca4c6a.png",
        "id": 4,
        "imgUrl": "//nos.netease.com/yanxuan/935f1ab7dcfeb4bbd4a5da9935161aaf.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "配件",
        "parentId": 0,
        "showIndex": 3,
        "sortOrder": 4,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/02f9a44d05c05c0dd439a5eb674570a2.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/003e1d1289f4f290506ac2aedbd09d35.jpg",
        "frontDesc": "贴身的,要亲肤",
        "frontName": "贴身的,要亲肤",
        "iconUrl": "http://yanxuan.nosdn.127.net/28a685c96f91584e7e4876f1397767db.png",
        "id": 5,
        "imgUrl": "//nos.netease.com/yanxuan/135113d6a43536b717063413fa24d69a.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "服装",
        "parentId": 0,
        "showIndex": 4,
        "sortOrder": 5,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/622c8d79292154017b0cbda97588a0d7.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/7dc78383e44df530f543659a977740de.jpg",
        "frontDesc": "爱,从心开始",
        "frontName": "爱,从心开始",
        "iconUrl": "http://yanxuan.nosdn.127.net/1ba9967b8de1ac50fad21774a4494f5d.png",
        "id": 6,
        "imgUrl": "//nos.netease.com/yanxuan/8ab3c73fe90951a942e8b06d848f8743.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "婴童",
        "parentId": 0,
        "showIndex": 6,
        "sortOrder": 7,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/9cc0b3e0d5a4f4a22134c170f10b70f2.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/d233a1a9060a22e8eb0e2b326252eece.jpg",
        "frontDesc": "解忧,每个烦恼",
        "frontName": "解忧,每个烦恼",
        "iconUrl": "http://yanxuan.nosdn.127.net/c2a3d6349e72c35931fe3b5bcd0966be.png",
        "id": 7,
        "imgUrl": "//nos.netease.com/yanxuan/a0c91ae573079830743dec6ee08f5841.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "杂货",
        "parentId": 0,
        "showIndex": 7,
        "sortOrder": 8,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/547853361d29a37282f377b9a755dd37.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/ef8c49f8c92d1f86eb76dec0b5bc7cef.jpg",
        "frontDesc": "亲肤之物,严选天然",
        "frontName": "亲肤之物,严选天然",
        "iconUrl": "http://yanxuan.nosdn.127.net/9fe068776b6b1fca13053d68e9c0a83f.png",
        "id": 8,
        "imgUrl": "//nos.netease.com/yanxuan/14bb4a29498a0f93a1ea001f26fea1dd.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "洗护",
        "parentId": 0,
        "showIndex": 5,
        "sortOrder": 6,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/1526ab0f5982722adbc8726f9f2a338c.png"
      },
      {
        "bannerUrl": "http://yanxuan.nosdn.127.net/99107fbd76eb66cd537213e478189ae1.png",
        "frontDesc": "爱好,点缀生活",
        "frontName": "周边精品,共享热爱",
        "iconUrl": "http://yanxuan.nosdn.127.net/7093cfecb9dde1dd3eaf459623df4071.png",
        "id": 9,
        "imgUrl": "//nos.netease.com/yanxuan/72de912b6350b33ecf88a27498840e62.jpg",
        "isShow": 1,
        "keywords": "",
        "level": "L1",
        "name": "志趣",
        "parentId": 0,
        "showIndex": 9,
        "sortOrder": 10,
        "type": 0,
        "wapBannerUrl": "http://yanxuan.nosdn.127.net/1706e24a5e605870ba3b37ff5f49aa18.png"
      }
    ],
    "size": 5,
    "total": 0
  }
}

xml中自定义SQL分页查询,使用Map传参报错

今天从2.x 升级到3.0.7后,报错

  1. xml
<!-- 列表分页查询 -->
    <select id="selectImagesList"  parameterType="java.util.Map" resultMap="BaseResultMap">
		select
		     t.id,
  		     t.name,
  		     t.url,
  		     t.path,
  		     t.type,
  		     t.ctime,
  		     t.isdel  
		from
			t_images as t
        <where>
			<if test="id != null">
				t.id = #{id}
			</if>
			<if test="name != null">
				AND t.name like CONCAT('%',#{name},'%')
			</if>
        </where>
    </select>
  1. mapper
/**
     * 列表分页查询
     * @param page
     * @return
     */
    List<Images> selectImagesList(Page<Images> page, Map paramMap);
  1. 报错信息
2019-06-10 09:34:33,327 ERROR ExceptionFilter:96 -  [DUBBO] Got unchecked and undeclared exception which called by 192.168.56.1. service: com.xlauch.mall.api.facade.deve.IImagesSvc, method: selectImagesList, exception: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [, arg0, param1, param2], dubbo version: 2.7.0, current host: 192.168.56.1
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [, arg0, param1, param2]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy62.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:158)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:76)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:62)
	at com.sun.proxy.$Proxy63.selectImagesList(Unknown Source)
	at com.xlauch.mall.svc.service.deve.impl.ImagesServiceImpl.selectImagesList(ImagesServiceImpl.java:31)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:206)
	at com.sun.proxy.$Proxy66.selectImagesList(Unknown Source)
	at com.xlauch.mall.svc.facade.deve.ImagesSvc.selectImagesList(ImagesSvc.java:38)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:206)
	at com.sun.proxy.$Proxy85.selectImagesList(Unknown Source)

快速开始例子运行执行 sql 报语法错误

  • 问题
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT  id,name,age,email  FROM [*]user"; expected "identifier"; SQL statement:
SELECT  id,name,age,email  FROM user [42001-214]
  • 环境

    • springboot 2.7.1
    • 其他使用官方例子的版本依赖
  • 暂时解决

    • 将 springboot 退回 2.6.7 版本即可正常使用例子,2.7.1 springboot 配置作了修改,希望官方可以修改例子或者说明支持的 springboot 版本

sample没有tag?

您好,

建议Sample能够按照Mybatis-Plus的版本来打tag,这样方便不同版本的用户能够直接找到适应版本的sample,以方便进行学习。

现在只能通过找Git History的方法来找到老版本的使用用法。但确实不太方便。

所以,考虑一下?

mapping.xml

您好:
有个问题请教一下 这个项目中不用写xml文件吗 我使用的mysql数据库 不写xml 报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.demo.mapper.UserMapper.selectById

mybatisplus.samples.generator中H2CodeGenerationTest生成文件内容为空

操作:通过GeneratorH2Application运行初始化生成D:/mybatisplus.mv文件后
修改H2CodeGenerationTest文件dsc.setUrl("jdbc:p6spy:h2:file:d:/mybatisplus;TRACE_LEVEL_FILE=0;IFEXISTS=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE");
testGetTableNames运行有USER表;generateCode()运行后User.java无字段信息
控制台:SQL Exception:Column "Extra" not found [42122-200]
生成文件:package com.baomidou.mybatisplus.samples.generator.h2.entity;

               /**
              仅演示使用自定义模板
              */
              public class User {
              }

rabbit事务消息演示有误

mybatis-plus-sample-dts-rabbit这部分代码中,
send-receive-error 这个接口,并没有实现消费者消费异常之后,消息进入到死信队列中。
RabbitRmtListener这里消费的时候,对异常应该抛出才会进入到死信队列

关于MP+Springboot service层方法互相调用会循环引用的解决方法探索

1.场景:

class AServiceImpl extends ServiceImpl<AMapper, A> implements IAService{

//一个findByName比较通用的自定义方法

LambdaQueryWrapper<A> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(A::getName,name);
return baseMapper.selectOne(wrapper);

}

2.问题:

class B serviceImp类中需要调用A的findByName,
然后A serviceImpl类中也有方法需要调用B中的方法,
那么就会存在循环引用,类似这种类型的case,一般可以怎么调整代码结构解除循环引用?

  1. 注意:
    通过传统的mybatis的方法能够将类似findByName的基础方法下放到mapper实现可以解决以上问题,但是仍想保留mybatis plus的特性的话,并不想每次通过AMapper.selectOne(new QueryWrapper().eq(A::getName)),那样就缺乏了通用性,
    应该如何调整代码结构,谢谢!

当生成器设置字段去掉is前缀时,生成的字段没有@TableField标签

当生成器在StrategyConfig中设置setEntityBooleanColumnRemoveIsPrefix为 true 时,生成的字段没有@TableField标签,导致查询时字段不对应报错,通过查看源码发现在TableField.setConvert(StrategyConfig strategyConfig)方法中的判断有问题

源代码片段如下

    protected void setConvert(StrategyConfig strategyConfig) {
        if (strategyConfig.isCapitalModeNaming(this.name)) {
            this.convert = false;
        } else if (NamingStrategy.underline_to_camel == strategyConfig.getColumnNaming()) {
            //如果我的表字段为is_deleted,则会进来这里,但是不会进入下面的判断,导致convert未赋值为true
            if (StringUtils.containsUpperCase(this.name)) {
                this.convert = true;
            }
        } else if (!this.name.equals(this.propertyName)) {
            this.convert = true;
        }

    }

typehandler的使用

image
image
image
在我的TableName和TableField注解中,autoResultMap和typeHandler都是报错的,这是为什么呢,mybatisplus版本为3.1.0,在springboot项目中

如何自定义生成主键啊?

3.正常配置GlobalConfiguration.keyGenerator
@bean
public GlobalConfiguration globalConfiguration() {
GlobalConfiguration conf = new GlobalConfiguration();
conf.setKeyGenerator(new OracleKeyGenerator());
return conf;
}
请问官网的这步骤在哪配置?, 这个GlobalConfiguration类找不到啊

这是我的依赖

com.baomidou mybatis-plus-boot-starter 3.0.6

TestTypeHandler 返回值没有被处理

com.baomidou.mybatisplus.samples.deluxe.DeluxeTest
这个Test类里面的testInsert 方法里面
在selectById 时,取得的email的值是不是应该是TestTypeHandler 里面 get方法里面的放回值?

com.baomidou.mybatisplus.samples.generator 注释是undefined

com.baomidou.mybatisplus.samples.generator.MysqlGenerator 生成的类, 注释是undefined

/**
 * <p>
 * undefined
 * </p>
 *
 * @author toryzhou
 * @since 2019-04-10
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class User extends BaseEntity {

}

DM数据库测试未通过

测试步骤如下:
运行mysqlgenerator类main 方法
输入模块名
输入表名

结果:
报有歧义的列名[TABLE_NAME]错误。

rabbit事务消息演示有误

mybatis-plus-sample-dts-rabbit这部分代码中,
send-receive-error 这个接口,并没有实现消费者消费异常之后,消息进入到死信队列中。
RabbitRmtListener这里消费的时候,对异常应该抛出才会进入到死信队列

Cannot load driver class: com.h2.Driver

导入samples项目到eclipse,编译无错,运行mybatis-plus-sample-pagination,一直会有异常:
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.h2.Driver at org.springframework.util.Assert.state(Assert.java:94) ~[spring-core-5.1.2.RELEASE.jar:5.1.2.RELEASE] at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:224) ~[spring-boot-autoconfigure-2.1.0.RELEASE.jar:2.1.0.RELEASE] at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:176) ~[spring-boot-autoconfigure-2.1.0.RELEASE.jar:2.1.0.RELEASE] at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:43) ~[spring-boot-autoconfigure-2.1.0.RELEASE.jar:2.1.0.RELEASE] at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:83) ~[spring-boot-autoconfigure-2.1.0.RELEASE.jar:2.1.0.RELEASE] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] ... 44 common frames omitted

但是查看maven依赖中已经引入h2-1.4.197.jar

no-spring

hi 使用 nospring 的时候,很好,但是 只有mapper 的设置,一般来说,我们的.xml 文件,关联mapper 这个步骤怎么使用的,直接执行sql的步骤该怎么使用呢 类似@Sql

达梦(DM)生成的表映射实体中没有Schema属性

数据库为达梦数据库,我在DataSourceConfig中设置了SchemaName后,发现生成的表映射实体中没有Schema属性,导致查询失败,必须手机把schema属性加上才可以,请问这种情况怎么解决?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.