Sharding-Jdbc在springboot中配置

  • 更新时间:
  • 3970人关注
  • 点击下载

这是一个不错的springboot类学习资源,由潘凝云 提供,主要知识点是关于Sharding-Jdbc、springboot、配置、springboot的内容,已被413人关注,同类资源中评分为7.2分。

精选笔记:springboot @Valid注解对嵌套类型的校验功能

5小时32分钟前回答

@Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用:

实体:

public class DepartmentDto {
 @ApiModelProperty("id")
 private String id;
 @ApiModelProperty("上级Id")
 private String parentId;
 @ApiModelProperty("编号")
 @NotBlank(message = "部门编号不能为空。")
 private String code;
 @ApiModelProperty("名称")
 @NotBlank(message = "部门名称不能为空。")
 private String name;
 @ApiModelProperty("员工集合")
 @Builder.Default
 private List<Employee> employees = new ArrayList<>();
}

Restful接口:

 @PostMapping()
 public Response<ClientAccount> initialAccount(
   @ApiParam("客户编号") @PathVariable String code,
   @ApiParam("账期") @PathVariable YearMonth accountPeriod,
   @ApiParam("请求体") @Valid @RequestBody Request<DepartmentDto> request) {
  ClientAccount result = clientAccountService.initialAccount(
    code,
    accountPeriod,
    request.getOperator(),
    request.getBody());{}

上面代码中,我们为请求体Request<DepartmentDto>添加了校验,在测试时,如果你的DepartmnetDto.name为空字符时,当出现400的异常,丽时异常消息是『部门名称不能为空』,这对于我们来说是没有问题的,也是符合我们要求的,下面看另一个场景。

需要验证的实体是另一个实休的属性

这种方式我们也需要会看到,一个大对象,如被封装的其它小对象组成,比如部门下面有员工,这时如果需要验证员工的有效性,需要如何实现呢?如果我们不修改源代码,执行结果是否定的, 它并不会校验员工这个对象,而只针对第一层对象的属性 。

我们将实体的员工属性添加上@Valid即可实现对这个属性的校验

public class DepartmentDto {
 @ApiModelProperty("id")
 private String id;
 @ApiModelProperty("上级Id")
 private String parentId;
 @ApiModelProperty("编号")
 @NotBlank(message = "部门编号不能为空。")
 private String code;
 @ApiModelProperty("名称")
 @NotBlank(message = "部门名称不能为空。")
 private String name;
 @Valid
 @ApiModelProperty("员工集合")
 @Builder.Default
 private List<Employee> employees = new ArrayList<>();
}

下面看一下验证结果,我们的400错误就可以在单元测试下面正常输出了!

@Test
 public void initialAccount_employee_name_empty() {
  List<Employee> employees = new ArrayList<>();
  employees.add(Employee.builder()
    .name("")
    .email("zzl@sina.com")
    .idNumber("110111198203182012")
    .build());
  List<DepartmentDto> departments = new ArrayList<>();
  departments.add(DepartmentDto.builder()
    .name("部门")
    .description("技术部")
    .salaryType(SalaryType.ResearchAndDevelopmentCosts)
    .employees(employees)
    .build());
  ClientAccountDto clientAccountDto = ClientAccountDto.builder()
    .name("客户")
    .departments(departments)
    .build();
  Request<ClientAccountDto> request = buildRequest(clientAccountDto);
  api.post()
    .uri("/v1/12345/2018-03")
    .body(BodyInserters.fromObject(request))
    .exchange()
    .expectStatus().isEqualTo(400)
    .expectBody()
    .jsonPath("$.errors[0].message").isEqualTo("姓名不能为空");
 }

 结果如下,测试通过

springboot @Valid注解对嵌套类型的校验功能 

如果是测试它是IsOk的话,由于用户名为空,所以会出现错误提示

api.post()
    .uri("/v1/12345/2018-03")
    .body(BodyInserters.fromObject(request))
    .exchange()
    .expectStatus().isOk();

springboot @Valid注解对嵌套类型的校验功能 

可以看一下结果的提示信息

springboot @Valid注解对嵌套类型的校验功能 

总结

以上所述是小编给大家介绍的springboot @Valid注解对嵌套类型的校验,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

展开阅读
精选笔记:SpringBoot整合MongoDB的示例

24小时9分钟前回答

本节使用SpringBoot 2.1.9.RELEASE,示例源码在https://github.com/laolunsi/spring-boot-examples/tree/master/06-spring-boot-mongo-demo

SpringBoot可以非常方便地引入和操作MongoDB。本节分两部分,记录个人学习SpringBoot使用MongoDB数据库的一些知识。

第一部分是一个简单的springboot连接mongo的demo,测试查询功能。

第二部分是基于mongo实现的增删改查数据示例。

本节使用SpringBoot 2.1.9.RELEASE

一、A simple demo

首先来演示SpringBoot项目引入MongoDB,以及一个简单的findAll操作。

maven依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

环境配置:

application.yml文件中写入如下配置,test表示MongoDB中的test表

spring:
 data:
  mongodb:
   uri: "mongodb://localhost:27017/test"

以一个bean类为例:

package com.example;

public class User {

  private String id;
  private String name;
  private Integer age;
  private Integer grade;

  // ... ignore getter and setter


  // override its toString method
  @Override
  public String toString() {
    return "User{" +
        "id='" + id + '\'' +
        ", name='" + name + '\'' +
        ", age=" + age +
        ", grade=" + grade +
        '}';
  }
}

在MongoDB数据库中新建一个collection(也就是表),名字叫user,插入几条数据,比如:

注:这里用的可视化工具是robo 3t:https://www.xz577.com/database/567493.html

我们这里先默认JavaBean的字段与user表的字段名保持一致。

下面我们编写测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
public class MongoTest {

  @Autowired
  private MongoTemplate mongoTemplate;

  @Test
  public void test1() {
    List<User> userList = mongoTemplate.findAll(User.class);
    if (userList != null && userList.size() > 0) {
      userList.forEach(user -> {
        System.out.println(user.toString());
      });
    }
  }

}

运行测试类,输出如下:

User{id='5d243534514701183f5fcab8', name='zf0', age=12, grade=1}
User{id='5d243534514701183f5fcab9', name='zf1', age=13, grade=2}
User{id='5d243534514701183f5fcaba', name='zf2', age=14, grade=3}
User{id='5d243534514701183f5fcabb', name='zf3', age=15, grade=4}
User{id='5d243534514701183f5fcabc', name='zf4', age=16, grade=5}

二、基于SpringBoot的MongoDB增删改查操作

下面来实现一个基于SpringBoot的对MongoDB增删改查操作的简单示例,依然使用上面的环境:

maven:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.60</version>
</dependency>

yml:

server:
 port: 8866

spring:
 data:
  mongodb:
   uri: "mongodb://localhost:27017/test"

User类:

这里我们清楚一下之前的数据,把mongo里的user表里的数据全部删掉。

注:这里用的可视化工具admin-mongo:https://github.com/mrvautin/adminMongo

新建一个不同的user类:

@Document("user")
public class User {

  @Id
  private String id;

  @Field("name")
  private String name;

  @Field("password")
  private String password;

  @Field("address")
  private String address;

  @Field("create_time")
  private Date createTime;

  @Field("last_update_time")
  private Date lastUpdateTime;

  // ... ignore getter and setter methods

  @Override
  public String toString() {
    return JSONObject.toJSONString(this);
  }
}

此处定义一个JsonResult类,用于封装接口返回数据:

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class JsonResult {

  /**
   * 未登录
   */
  public static final int NO_LOGIN = 400;

  /**
   * 登录失败
   */
  public static final int LOGIN_FAILED = 401;

  /**
   * TOKEN过期
   */
  public static final int TOKEN_EXPIRED = 402;

  /**
   * 无权限
   */
  public static final int NO_PERMISSION = 403;


  private Boolean success;
  private Integer code;
  private String msg;
  private Object data;

  public JsonResult(Boolean success) {
    this.success = success;
  }

  public JsonResult(Boolean success, String msg) {
    this.success = success;
    this.msg = msg;
  }

  public JsonResult(Integer code, Boolean success, String msg) {
    this.code = code;
    this.success = success;
    this.msg = msg;
  }

  public JsonResult(Boolean success, Object data) {
    this.success = success;
    this.data = data;
  }

  public JsonResult(Boolean success, Integer code, String msg, Object data) {
    this.success = success;
    this.code = code;
    this.msg = msg;
    this.data = data;
  }

  // ... ignore getter and setter methods

  public void put(String key, Object value) {
    if (data == null) {
      data = new HashMap<>();
    }
    ((Map) data).put(key, value);
  }

  public void putAll(Map<String, Object> map) {
    if (data == null) {
      data = new HashMap<>();
    }
    ((Map) data).putAll(map);
  }

  @Override
  public String toString() {
    return JSONObject.toJSONString(this);
  }
}

下面编写测试接口类,实现用户的新增、删除、更新、查询功能

UserController类:

@RestController
@RequestMapping(value = "user")
public class UserController {

  @Autowired
  private MongoTemplate mongoTemplate;

  @GetMapping(value = "")
  public JsonResult list() {
    List<User> userList = mongoTemplate.findAll(User.class, "user");
    return new JsonResult(true, userList);
  }

  @PostMapping(value = "")
  public JsonResult add(User user) {
    String msg = verifySaveForm(user);
    if (!StringUtils.isEmpty(msg)) {
      return new JsonResult(false, msg);
    }

    if (user.getId() == null) {
      user.setCreateTime(new Date());
      user.setLastUpdateTime(new Date());
      User newUser = mongoTemplate.insert(user, "user");
      return new JsonResult(true, newUser);
    } else {
      Query query = new Query();
      query.addCriteria(Criteria.where("_id").is(user.getId()));

      Update update = new Update();
      update.set("name", user.getName());
      update.set("password", user.getPassword());
      update.set("address", user.getAddress());
      update.set("last_update_time", new Date());

      UpdateResult updateResult = mongoTemplate.updateFirst(query, update, "user");
      return new JsonResult(true, updateResult);
    }
  }

  @DeleteMapping(value = "{id}")
  public JsonResult delete(@PathVariable String id) {
    Query query = new Query();
    query.addCriteria(Criteria.where("_id").is(id));
    DeleteResult deleteResult = mongoTemplate.remove(query, User.class, "user");
    return new JsonResult(true, deleteResult);
  }

  // private methods

  private String verifySaveForm(User user) {
    if (user == null || StringUtils.isEmpty(user.getName())) {
      return "用户名不能为空";
    } else if (user.getPassword() == null) {
      return "密码不能为空";
    }

    return null;
  }
}

下面用postman模拟一下请求:

新增用户:

查看Mongodb:

更改数据,新增多个用户:

列表查询:

更改user:

删除user:

以上就是SpringBoot整合MongoDB的示例的详细内容,更多关于SpringBoot整合MongoDB的资料请关注码农之家其它相关文章!

展开阅读

相关资源

  • SpringBoot从入门到进阶系列官方手册

    SpringBoot从入门到进阶系列官方手册

    SpringBoot系列从入到进阶小册 是一套SpringForAll社区整理的简小而又实用的一份小册子,对于整理快速学习SpringBoot是一份很好的教程。 本教程分为Spring Boot 快速入门、Spring Boot Web 开发、Spring Boot 数据访问、Spring Boot 日志管理、Spring Boot 整合 Dubbo、Spring Boot 整合 Elasticsearch、Spring Boot 监控管理等。 目录 Spring Boot 入门系列 Spring Boo

    大小:21.7 MBSpringBoot

    立即下载
  • Spring Boot 2精髓:从构建小系统到架构分布式大系统

    Spring Boot 2精髓:从构建小系统到架构分布式大系统

    这本书系统介绍了Spring Boot 2的主要技术,涵盖Spring Boot框架、Spring MVC、视图技术、数据库访问技术,并且介绍多环境部署、自动装配、单元测试等高级特性,介绍如何平滑地用Spring Boot实现分布式架构等

    大小:174.8 MBSpringBoot

    立即下载
  • Spring Boot 2企业应用实战

    Spring Boot 2企业应用实战

    本书全面介绍了全新的Spring Boot 2和常用第三方框架整合开发相关的各方面知识。书中操作步骤细致,编程思路清晰,语言平实易懂。读者参考本书的架构,可以身临其境地感受企业实际项目开发。

    大小:92.99 MBSpring Boot

    立即下载
  • SpringBoot揭秘:快速构建微服务体系

    SpringBoot揭秘:快速构建微服务体系

    《SpringBoot揭秘:快速构建微服务体系》 以微服务的基本概念介绍性开篇, 逐步引出Java平台下打造微服务的利器SpringBoot微框架,从SpringBoot微框架的出身和源头,循序渐进,一步步为大家剖析

    大小:29.5 MBSpringBoot

    立即下载
  • 深入实践Spring Boot

    深入实践Spring Boot

    深入实践Spring Boot 是Spring Boot领域的经典著作,从技术、实践和原理3个维度对Spring Boot进行了系统且深入的讲解。作者是Spring Boot领域的资深专家,有超过15年的IT行业从业经验。 技术维度 第一

    大小:141 MBSpring

    立即下载

学习笔记

19小时58分钟前回答

解决idea spring boot 修改html等不重启即时生效的问题

一、spring-boot-devtools 在pom中直接引入依赖 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId optionaltrue/optional/dependency 设置以下两项(第一项如已设置直接设置第二项) 1) “File” - “Settings” - “Build,Execution,Deplyment” - “Compiler”,选中打勾 “Build project automatically” 。 2) 组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running” 补充:彻底解决springboot修改页面和代码会自动重启 1.解决修改代码会重启: 导入jar包 dependency groupIdorg.springframework/groupId artifactIdspringloaded/artifactId version1.2.8.RELEASE/version /dependency 2.设置启动arguments -javaagent:F:\m2\m3\reposito……

5小时25分钟前回答

SpringBoot+Lucene实例介绍

一、案例介绍 模拟一个商品的站内搜索系统(类似淘宝的站内搜索); 商品详情保存在mysql数据库的product表中,使用mybatis框架; 站内查询使用Lucene创建索引,进行全文检索; 增、删、改,商品需要对Lucene索引修改,搜索也要达到近实时的效果。 对于数据库的操作和配置就不在本文中体现,主要讲解与Lucene的整合。 二、引入lucene的依赖 向pom文件中引入依赖 !--核心包-- dependency groupIdorg.apache.lucene/groupId artifactIdlucene-core/artifactId version7.6.0/version /dependency !--对分词索引查询解析-- dependency groupIdorg.apache.lucene/groupId artifactIdlucene-queryparser/artifactId version7.6.0/version /dependency !--一般分词器,适用于英文分词-- dep……

7小时53分钟前回答

详解SpringBoot配置文件启动时动态配置参数方法

序言 当我们要同时启用多个项目而又要使用不同端口或者变换配置属性时,我们可以在配置文件中设置${变量名}的变量来获取启动时传入的参数,从而实现了动态配置参数,使启用项目更加灵活 例子 server: port: ${PORT:50101} #服务端口spring: application: name: xc‐govern‐center #指定服务名eureka: client: registerWithEureka: true #服务注册,是否将自己注册到Eureka服务中 fetchRegistry: true #服务发现,是否从Eureka中获取注册信息 serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口) defaultZone: ${EUREKA_SERVER:http://eureka02:50102/eureka/} #向该地址上报心跳信息……