Spring Boot入坑-5-数据访问

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

概述


  • 步伐中的各种数据,包括业务、日志、监控、行为等数据都需要存储起来,存储数据的就是数据库,常指关系型数据库
  • 任何一种编程语言或是框架都会提供对数据库进行操作的通用API
  • 各种数据库产品的厂商也会提供自身数据库产品针对常用语言的数据库驱动
  • Java亦是云云
  • Java提供了底子的数据访问接口JDBC,在此底子上,也衍生了一些功能更加强盛的数据访问的第三方库或组件
常用的数据访问组件


  • JDBC:Java语言提供的最底子的数据访问
  • JdbcTemplate:Spring提供的数据操作组件,比JDBC操作更加方便
  • MyBatis:一个优秀的,也是最简朴的长期层框架,可通过XML或注解来配置数据表与实体关系,灵活性高;但需要有一定的SQL语言底子
  • MyBatis-Plus:基于MyBatis的一款优秀的国产长期层框架,可免去SQL语句,完全面向对象
  • JPA(Java Persistence API):Java的一个长期层API,使用简朴方便,不需要步伐中使用SQL语句,有一套JPQL支持对象式的查询相关操作
  • Hibernate实现了JPA,并提供了;提供标准的ORM处置惩罚;且具有移植性好、提供缓存、HQL等特点,使用简朴
实例数据E-R图


  • 下图是本章及后续业务会讲解的数据的E-R(Entity-Relationship)图(非标准图)
  • 其中,id都为int型,自增;所有表都具有的create_bycreate_timeupdate_byupdate_time字段

    ​实例数据E-R图​
JDBC【扩展】

概述


  • Java数据库连接(Java Database Connectivity),是Java API紧张的构成部分,是应用步伐与数据库之间的桥梁
  • 提供了一组接口,提供给不同的数据库产品实现
  • 不同的数据库产品根据JDBC的接口,提供不同版本的 JDBC驱动
  • Java语言中,使用相应数据库产品的驱动,就能连接指定数据库进行数据操作
  • JDBC连接表示图如下

    ​JDBC连接表示图​
主要对象


  • DriverManager:驱动管理,负责创建数据库连接
  • Connection:数据库连接,负责打开/关闭数据库连接,并负责创建Statement
  • Statement:数据处置惩罚,负责对数据库的查询、新增、修改、删除等操作
  • PreparedStatement,多次使用时,会先将SQL语句提交到数据库做预处置惩罚,多次使用能提高服从,支持?变量形式,避免SQL注入问题,相比Statement安全
  • ResultSet:查询结果集,提供对返回结果集的一系列操作,能够遍历获取数据表数据,提供了next、getString、getInt等方法获取数据
数据范例映射


  • Java中有自身的基本数据范例和常用的引用数据范例,如String、日期类
  • 每个数据库产品中,也有自身的数据范例,各不雷同,也与Java中有一定的差别,如MySQL、Oracle等
  • Java步伐中处置惩罚时需要与数据库中数据范例进行映射
  • 下面列出了Java与MySQL中的范例映射关系

    ​Java范例与MySQL范例映射​
使用步骤


  • 引入依靠,在pom.xml中添加对mysql-connector-java的依靠
    1. <dependency>
    2.    <groupId>mysql</groupId>
    3.    <artifactId>mysql-connector-java</artifactId>
    4.    <version>8.0.33</version>
    5. </dependency>
    复制代码
  • 添加配置,在项目配置文件application.properties中添加JDBC连接配置
    1. #jdbc连接配置
    2. jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot
    3. jdbc.driver-class-name=com.mysql.cj.jdbc.Driver
    4. jdbc.username=root
    5. jdbc.password=root
    复制代码
  • 定义实体类,在演示项目entity包下添加与数据库表匹配的实体类
  • 使用JDBC,在演示项目repository下实现数据库的访问
JdbTemplate【扩展】

概述


  • Spring在数据库的操作上,对JDBC做了再次的封装,即JdbcTemplate
  • 同时,可以配置默认的HikariCP数据库连接池参数
连接池【扩展】


  • 连接的频繁创建与销毁,是有很大的开销的,于是就有了连接池
  • 连接池主要作用

    • 限定总量,连接本身比力泯灭资源,且过多容易导致数据库可用性差,让超过限定问题的连接等候
    • 复用,预先创建一定量的数据库连接,需要时直接使用,低落创建、销毁频率,提高数据库连接使用率

  • JDBC有一个标准的连接池接口javax.sql.DataSource,实现该接口的产品,即可快速接入
  • 业界提供了一系列的连接池实现技术

    • HikariCP(Spring Boot默认连接池)
    • Druid
    • C3P0
    • BoneCP

使用步骤


  • 引入依靠,在pom.xml中添加对spring-boot-starter-jdbc、mysql-connector-java的依靠
    1. <dependency>
    2.    <groupId>mysql</groupId>
    3.    <artifactId>mysql-connector-java</artifactId>
    4.    <version>8.0.33</version>
    5. </dependency>​    org.springframework.boot    spring-boot-starter-jdbc
    复制代码
  • 添加配置,在项目配置文件application.properties中添加JdbcTemplate数据库连接配置和HikariCP连接池配置
    1. #JdbcTemplate配置,并且适用所有后续的数据库连接方式,像MyBatis等
    2. spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    3. spring.datasource.username=root
    4. spring.datasource.password=root
    5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    6. #hikariCP连接池配置
    7. spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    8. spring.datasource.hikari.minimum-idle=5
    9. spring.datasource.hikari.maximum-pool-size=15
    10. spring.datasource.hikari.auto-commit=true
    11. spring.datasource.hikari.idle-timeout=30000
    12. spring.datasource.hikari.pool-name=MyHikariCP
    13. spring.datasource.hikari.max-lifetime=1800000
    14. spring.datasource.hikari.connection-timeout=30000
    15. spring.datasource.hikari.connection-test-query=SELECT 1
    复制代码
  • 配置日志,在项目配置文件application.properties中添加SQL语句debug日志信息输出,【可选】
    1. #JdbcTemplate日志配置
    2. logging.level.org.springframework.jdbc.core.JdbcTemplate=debug
    复制代码
  • 定义实体类,在演示项目entity包下添加与数据库表匹配的实体类
  • 使用JdbcTemplate,在需要使用的地方主动装配JdbcTemplate使用,并将操作数据与实体类进行手动映射,具体见演示项目的repository包下
留意:日期格式在application.properties中配置
MyBatis【扩展】

概述


  • MyBatis是一款优秀的长期层框架,支持自定义SQL、存储过程以及高级映射
  • MyBatis免除了险些所有的JDBC代码以及设置参数和获取结果集的工作
  • MyBatis可以通过简朴的XML配置注解配置,将Java POJO( Plain Ordinary Java Object / Pure Old Java Object ,普通老式 Java 对象)映射为数据库中的记载
  • 现在指的是MyBatis 3,具体使用方式,参考官网文档:https://mybatis.org/mybatis-3/zh/index.html
XML方式

概述


  • 传统的MyBatis使用方式,多使用XML配置进行
  • 相对来说,这种方式稍显复杂,且没有结构化语法支持,出现问题也不容易排查
使用步骤


  • 引入依靠,在pom.xml中添加对mysql-connector-java、mybatis-spring-boot-starter的依靠
    1. <dependency>
    2.    <groupId>mysql</groupId>
    3.    <artifactId>mysql-connector-java</artifactId>
    4.    <version>8.0.33</version>
    5. </dependency>    org.mybatis.spring.boot    mybatis-spring-boot-starter    2.2.0
    复制代码
  • 添加配置,在项目配置文件application.properties中添加MyBatis相关配置数据库连接配置和HikariCP连接池配置,其中比力紧张的是与@Mapper注解的接口关联的xml路径配置
    1. #数据库连接配置
    2. spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    3. spring.datasource.username=root
    4. spring.datasource.password=root
    5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    6. #mybatis配置
    7. #扫描的xml
    8. mybatis.mapper-locations=classpath:mapper/*.xml
    9. #xml配置中的type的基础包包
    10. mybatis.type-aliases-package=com.example.entity
    11. #mysql的下划线转驼峰,如数据库字段create_time映射到实体类的createTime
    12. mybatis.configuration.map-underscore-to-camel-case=true
    13. #mybatis日志配置
    14. logging.level.com.example.mapper=debug
    15. #是否开启二级缓存
    16. #mybatis.configuration.cache-enabled=true
    17. #hikariCP连接池配置
    18. #连接池类型
    19. spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    20. #最小空闲连接
    21. spring.datasource.hikari.minimum-idle=5
    22. #最大连接数
    23. spring.datasource.hikari.maximum-pool-size=15
    24. #连接池返回的连接自动提交
    25. spring.datasource.hikari.auto-commit=true
    26. #空闲连接超时时间,默认值600000(10分钟)
    27. spring.datasource.hikari.idle-timeout=30000
    28. #连接池名称
    29. spring.datasource.hikari.pool-name=MyHikariCP
    30. #连接最大存活时间
    31. spring.datasource.hikari.max-lifetime=1800000
    32. #连接超时时间
    33. spring.datasource.hikari.connection-timeout=30000
    34. #测试连接是否可用的查询语句
    35. spring.datasource.hikari.connection-test-query=SELECT 1
    复制代码
  • 配置日志,也可以添加SQL语句debug日志信息输出,使用logging.level.mapper所在包=debug使用,见上述代码中的配置,【可选】;留意,生产环境一般不输出此日志
  • 定义实体类,在entity包下添加与数据库表匹配的实体类;留意,实体类的属性一般需要与数据库表的字段名相一致,一般实体类属性使用小驼峰,数据库表的字段使用划线,如属性createBy对应表的create_by字段
  • 定义Mapper接口,在mapper包下添加对应数据表的Mapper接口及数据操作方法,并给接口添加@Mapper注解,将会主动注入Spring容器
  • 添加XML配置,针对定义的Mapper接口,添加标准的XML配置,需要指定XML配置存放目次(一般是在resources\mapper目次,并在application.properties中通过mybatis.mapper-locations指向该配置目次下的*.xml文件);同时,在XML配置中,添加针对Mapper接口中数据操作方法匹配的SQL语句;相当于定义了Mapper接口的实现类;具体的模板如下(如果没有,可以自行添加,在Settings菜单下的Editor->File and Code Templates下添加)
    1. [/code] 
    2. [*][b]使用MyBatis[/b],在相应的服务中,就可以[b]直接装配使用定义的Mapper接口[/b],并使用其数据操作方法执行数据操作
    3. [/list][size=3]注解方式[/size]
    4. [size=2]概述[/size]
    5. [list]
    6. [*]基于XML配置的复杂性和没有结构化语法支持,注解方式更容易被担当
    7. [*]注解方式与XML方式雷同
    8. [/list][size=2]使用步骤[/size]
    9. [list]
    10. [*]与XML配置方式雷同,只是将使用XML配置,替换成了在Mapper上使用@Select、@Insert、@Update、@Delete等注解完成
    11. [/list][size=3]动态SQL【扩展】[/size]
    12. [size=2]概述[/size]
    13. [list]
    14. [*]XML方式支持if、foreach、choosen(when、otherwise)、trim(where、set)等动态SQL支持
    15. [*]注解方式,使用Provider形式提供支持
    16. [/list][size=2]#和$[/size]
    17. [list]
    18. [*]#
    19. [list]
    20. [*]预编译,能防止SQL注入,主动添加[b]‘’[/b]
    21. [*]主要用于对应字段的数据值
    22. [*]只管使用#
    23. [/list]
    24. [*]$
    25. [list]
    26. [*]语句拼接,会有SQL注入风险,不会主动添加[b]’’[/b]
    27. [*]主要用于动态表名、Order By列、分页数据,使用时字符串要使用’${xxx}’格式
    28. [/list]
    29. [/list][size=2]关联查询[/size]
    30. [list]
    31. [*][b]一对一[/b]:XML方式使用多表association语法或join语法;注解方式使用@One注解
    32. [*][b]一对多[/b]:XML方式使用多表collection语法或join语法;注解方式使用@Many注解
    33. [*][b]多对多[/b]:一般会拆成不同方向的一对多处置惩罚
    34. [/list][size=3]缓存【扩展】[/size]
    35. [list]
    36. [*]MyBatis内置了一个强盛的事务性查询缓存机制,分为一级缓存和二级缓存,第一次查询时,会将数据缓存起来,再次查询,数据将从缓存中获取;固然,如果中心有新增、更新、删除等操作,缓存将失效
    37. [*][b]一级缓存[/b],基于同一次哀求的SqlSession,如果这个过程中一个雷同的查询会执行多次,可以在相应的服务入口方法添加@Transactional注解,会启用一级缓存,提高查询服从
    38. [*][b]二级缓存[/b],基于同一个namespace,也即同一个Mapper的缓存,在配置文件中添加(注解形式添加@CacheNamespace(blocking = true)注解),可启用二级缓存
    39. [*][b]留意[/b],如果是分布式的多节点部署,则不要开启一级缓存、二级缓存;直接使用第三方的Redis、Memcached等第三方缓存
    40. [*]详细先容MyBatis站点:[url=https://mybatis.org/mybatis-3/zh/index.html]https://mybatis.org/mybatis-3/zh/index.html[/url]
    41. [/list][size=3]Spring事务[/size]
    42. [list]
    43. [*]Spring Boot中提供了[b]事务处置惩罚机制[/b],[b]针对各种数据访问技术[/b] ,如JdbcTemplate、MyBatis、MyBatis Plus等,分声明式事务和编程式事务
    44. [*][b]声明式事务[/b],[b]掌握[/b]
    45. [list]
    46. [*]基于AOP
    47. [*]使用注解@Transactional标注在public修饰的方法上
    48. [*]特点:使用简朴,但整个注解方法持续占用当前Connection,直到方法结束才释放Connection,服从相对相低
    49. [/list]
    50. [*][b]编程式事务[/b],了解【扩展】
    51. [list]
    52. [*]使用TransactionTemplate、TransactionCallback、TransactionStatus组合完成,底层使用的是PlatformTransactionManager类
    53. [*]特点:控制粒度更小,比声明式复杂,但可以控制只在TransactionTemplate.execute()方法中使用Connection,对于一些业务中具有事务特性,但也参杂大量数据查询、IO非事务特性场景,可考虑使用编程式事务
    54. [/list]
    55. [*][b]留意[/b]:在其他的数据访问组合中,可以使用雷同机制使用Spring事务
    56. [/list][size=4]MyBatis-Plus[/size]
    57. [size=3]概述[/size]
    58. [list]
    59. [*]润物无声:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    60. [*]服从至上:只需简朴配置,即可快速进行单表 CRUD 操作,从而节流大量时间
    61. [*]丰富功能:代码天生、物理分页、性能分析等功能包罗万象
    62. [*]最紧张特点:基于MyBatis,但去除掉了MyBatis对于SQL语句的依靠,使用更简朴
    63. [/list][size=3]使用步骤[/size]
    64. [list=1]
    65. [*][b]引入依靠[/b]:MyBatis Plus需要的依靠包mysql-connector-java、mybatis-plus-boot-starter
    66. [code]<dependency>
    67.    <groupId>mysql</groupId>
    68.    <artifactId>mysql-connector-java</artifactId>
    69.    <version>8.0.33</version>
    70. </dependency>    com.baomidou    mybatis-plus-boot-starter    3.5.3.1
    复制代码
  • 添加配置:与MyBatis雷同,在项目配置文件application.properties中添加MyBatis相关配置数据库连接配置和HikariCP连接池配置;与MyBatis雷同
  • 定义实体类

    • 表名映射:在与表对应的实体类上添加@TableName("表名")
    • 主键属性:添加@TableId(type= IdType.AUTO)
    • 普通属性:如果实体类属性与数据库中字段名不同,可添加 @TableField(value = "列名")进行映射

  • 定义Mapper:针对实体,定义Mapper接口,并继承BaseMapper;如下面就是用户的Mapper
    1. package com.example.mapper;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import com.example.entity.UserEntity;
    4. public interface UserMapper extends BaseMapper<UserEntity> {
    5. }
    复制代码
  • 添加@MapperScan注解:在配置类或启动类添加@MapperScan(mapper包),扫描指定mapper包下的所有继承于BaseMapper的类
    -------------------------------------------------此时,就可以使用Mapper进行数据访问,但方法不够丰富-------------------------------------------------
  • 定义Service:针对实体,定义Service接口,并继承IService;针对实体,定义Service接口实现,并继承服务接口与ServiceImpl,此时,在Service实现中,可使用ServiceImpl的众多对Mapper的封装方法;提供了一系列的便利操作,【可选】
  • 分页,需要返回一个指定数据库范例的分页配置MybatisPlusInterceptor对象,因为不同的数据库范例分布逻辑并不雷同(如SQL Server是top xxx,My SQL是limit),见config\MybatisPlusConfig类
  • 使用MyBatis-Plus,在相应的服务中,可直接使用Mapper,也可直接使用Service
多层结构中的问题

问题一

  • 新增/修改时,需要调用方提供创建人/修改人和时间信息吗?新增/修改时,需要调用方提供主键ID吗?
  • 返回响应信息时,需要包罗密码么?
  • 返回底子字典数据作为前端页面中的被选择项时,需要返回创建人/修改人和时间等信息么?
问题二

  • 登录时,如果不成功,可能返回[用户名不存在]、[密码错误]、[密码次数超限]不同形式的错误提示信息;如果成功,则返回用户及相关详细信息,两者结构不同,接口使用者如何方便判定、兼容?
  • 如果返回时不仅需要返回数据聚集,还需要有如分布的汇总等信息输出,如何兼容?
DTO


  • 数据传输对象(Data Transfer Object),用于项目各个层次数据传输,主要针对Service、Controller层吸收和返回的都应该是DTO,是面向对象的
  • 有了DTO后,entity将会专注于与数据表一对一映射
  • DTO可能是多个entity属性的组合,也可能是某个entity的一部分属性,重点是呈现接口需要的输入/输出数据,不包罗一些接口无关的数据,比如查询时的密码、生存时的创建时间和更新时间等
  • DTO应用目的:让接口或服务,只吸收需要的输入,只返回必须的输出
  • 解决上述问题一
哀求封装和响应封装

哀求封装


  • 一般会兼容比力丰富的哀求数据,不做过多封装,一般是Java包装类、DTO,分页哀求除外
  • 一般的项目,可以不对哀求进行封装,直接使用DTO即可
响应封装


  • 一般会封装成标准格式,并提供一些便利操作方法,标准格式包括code、message、data、total等
  • 一个项目,必须有一个标准的响应封装,甚至一个团队所有的项目保持雷同的响应封装,给外部提供的服务接口更易读
  • 响应封装应用目的:提供标准的响应,让调用方法处置惩罚更简朴
  • 解决上述问题二
对象映射

概述


  • 由于引入了DTO,就存在比力频繁的DTO与Entity之间的对象相互赋值,逐个属性的getter和setter赋值相对代码比力贫困
  • 可使用Spring中的BeanUtils进行映射,也可以使用第三方的工具
  • ModelMapper能够实现具有雷同属性的对象间的属性值主动映射
使用步骤


  • 引入依靠,在pom.xml中引入modelmapper-jackson依靠
    1. <dependency>
    2.    <groupId>org.modelmapper.extensions</groupId>
    3.    <artifactId>modelmapper-jackson</artifactId>
    4.    <version>2.4.5</version>
    5. </dependency>
    复制代码
  • 将ModelMapper注入Spring容器,通过添加一个配置类实现
    1. package com.example.config;
    2. import org.modelmapper.ModelMapper;
    3. import org.modelmapper.convention.MatchingStrategies;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. /**
    7. * 对象映射工具Bean
    8. */
    9. @Configuration
    10. public class ModelMapperConfig {
    11.    @Bean
    12.    public ModelMapper modelMapper() {
    13.        ModelMapper modelMapper = new ModelMapper();
    14.        //设置映射时匹配策略
    15.        //Standard表示标准匹配策略,为默认选项
    16.        //Loose表示松散匹配策略
    17.        //Strict表示严格匹配策略
    18.        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
    19.        return modelMapper;
    20.    }
    21. }
    复制代码
  • 主动装配使用,需要的类中装配就好,也可以直接new ModelMapper使用;如下面的代码返回一个
    1. UserOutputDto userOutputDto = modelMapper.map(userEntity, UserOutputDto.class);
    复制代码
范畴驱动设计(Domain-Driven Design)【扩展】

概述


  • 主要是由范畴专家、业务人员、技术人员组合一起进行业务建模的一种设计方式
  • 并构建出一个大家都能担当的业务模型,勾勒出产品全貌,最后交付可吸收的产品
  • 涉及到很多概念,可扩展学习
各种Object封装的特点


  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来
  • DTO(Data Transfer Object):数据传输对象,这个概念最早泉源于J2EE,泛指用于展示层与服务层之间的数据传输对象
  • DO(Domain Object):范畴对象,就是从现实世界中抽象出来的有形或无形的业务实体,会是多个PO的组合
  • PO(Persistent Object):长期化对象,也就是Entity,它跟长期层(通常是关系型数据库)的数据结构形成一一对应的映射关系
     

    ​各种Object的关系(图片来自网络)​
实例项目中的DTO与Entity


  • 具体见附件的springboot-data-mybatis-plus项目

​实例项目中的DTO与Entity关系​数据验证

概述


  • 在实际的项目中,接口对于哀求参数是要进行一定的合理性验证
  • 常用的验证有两种处置惩罚方式

    • 通用性验证,可借助第三方组件(如Spring Boot Validation)进行,验证通常包括非空,长度,格式化等
    • 业务性验证,一般需要手写代码实现

Spring Boot Validation


  • 提供了一系列注解来对需要验证的Dto进行验证标识,如@NotNull、@Length、@Min、@Max等
  • 底层依靠hibernate-validator
Spring Boot Validation使用步骤

  • 添加依靠:在pom中引入spring-boot-starter-validation
    1. <dependency>
    2.    <groupId>org.springframework.boot</groupId>
    3.    <artifactId>spring-boot-starter-validation</artifactId>
    4. </dependency>
    复制代码
  • 添加通用异常处置惩罚:添加ControllerAdvice针对BindException数据绑定异常的通用处置惩罚,代码片断如下
    1. package com.example.advice;
    2. import com.example.dto.common.ResponseData;
    3. import com.fasterxml.jackson.databind.ObjectMapper;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.validation.BindException;
    6. import org.springframework.validation.FieldError;
    7. import org.springframework.web.bind.annotation.ControllerAdvice;
    8. import org.springframework.web.bind.annotation.ExceptionHandler;
    9. import org.springframework.web.bind.annotation.ResponseBody;
    10. import java.io.IOException;
    11. import java.util.ArrayList;
    12. import java.util.List;
    13. import java.util.stream.Collectors;
    14. @ControllerAdvice
    15. public class GlobalExceptionHandler {
    16.    @Autowired
    17.    ObjectMapper objectMapper;
    18.    /**
    19.     * 【通用验证】1、添加依赖
    20.     * 拦截BindException,所有的验证框架spring-boot-starter-validation里的注解如果不符合规则都会抛出此异常
    21.     * @param ex
    22.     * @throws IOException
    23.     */
    24.    @ExceptionHandler(BindException.class)
    25.    @ResponseBody
    26.    public ResponseData handleBindException(BindException ex) {
    27.        //获取错误信息
    28.        List<FieldError> fieldErrors = ex.getFieldErrors();
    29.        List<String> errors = new ArrayList<>();
    30.        fieldErrors.stream().forEach(s->{
    31.            errors.add(s.getDefaultMessage());
    32.        });
    33.        //构建标准响应
    34.        ResponseData responseData = new ResponseData();
    35.        responseData.setCode(996);
    36.        responseData.setMessage(errors.stream().collect(Collectors.joining(",")));
    37.        return responseData;
    38.    }
    39. }
    复制代码
  • 输入DTO添加验证注解:在接口哀求参数的DTO上添加相应验证注解,代码片断如下
    1. package com.example.dto.input.user;
    2. import io.swagger.annotations.ApiModel;
    3. import io.swagger.annotations.ApiModelProperty;
    4. import lombok.Data;
    5. import org.hibernate.validator.constraints.Length;
    6. import javax.validation.constraints.NotNull;
    7. /**
    8. * 用户创建传入DTO
    9. */
    10. @ApiModel(value = "用户创建传入DTO",description = "用户创建传入信息DTO")
    11. @Data
    12. public class UserCreateInputDto {
    13.    //【通用验证】3、输入DTO添加验证注解
    14.    @ApiModelProperty(value = "用户名")
    15.    @NotNull(message = "用户名不能为空")
    16.    @Length(min = 2,max = 20,message = "用户名长度必须在2-20个字符之间")
    17.    private String username;
    18.    //【通用验证】3、输入DTO添加验证注解
    19.    @ApiModelProperty(value = "密码")
    20.    @NotNull(message = "密码不能为空")
    21.    @Length(min = 6,max = 20,message = "密码长度必须在6-50个字符之间")
    22.    private String password;
    23.    //【通用验证】3、输入DTO添加验证注解
    24.    @ApiModelProperty(value = "姓名")
    25.    @NotNull(message = "姓名不能为空")
    26.    @Length(min = 4,max = 20,message = "姓名长度必须在4-50个字符之间")
    27.    private String name;
    28.    @ApiModelProperty(value = "描述")
    29.    private String description;
    30. }
    复制代码
  • HTTP哀求接口添加@Validated注解:在Controller接口哀求参数DTO前添加@Validated注解,代码片断如下
    1. /**
    2. * 【通用验证】4、HTTP请求接口添加@Validated注解
    3. * @param inputDto
    4. * @return
    5. */
    6. @ApiOperation(value = "创建",notes = "创建一条新数据")
    7. @PostMapping("/")
    8. ResponseData create(@RequestBody @Validated UserCreateInputDto inputDto){
    9.   return userService.create(inputDto);
    10. }
    复制代码
  • 见效,将会主动拦截见效
MyBatis-Plus的其他功能

主动添补

概述


  • 对于一些底子的数据,是要根据数据产生的上下文主动产生的,如创建某条数据时的创建人、创建时间,多租户的租户信息等
  • MyBatis-Plus中使用MetaObjectHandler接口,并配合@TableField注解实现主动添补
使用步骤


  • 添加拦截

    • 添加MetaObjectHandler接口实现,并重写insertFill、updateFill方法
    • 在方法中,使用登录时生存在Session中的登录人信息,添补创建人、更新人信息
    • 在方法中,使用当前时间,设置创建时间、更新时间

  • 关联到实体类

    • 创建人/创建时间拦截,在实体类使用@TableField(fill = FieldFill.INSERT)注解实现拦截
    • 更新人/更新时间拦截,在实体类使用@TableField(fill =FieldFill.INSERT_UPDATE)注解实现拦截

多数据源【扩展】

概述


  • MyBatis-Plus中,能方法的支持多数据源
使用步骤


  • 引入依靠:MyBatis-plus需要的依靠包mysql-connector-java、 mybatis-plus-boot-starter、 dynamic-datasource-spring-boot-starter
  • 在application.properties中添加数据库连接和相应配置
  • 其他Entity、Mapper、Service同单数据源
  • 在Service上添加@DS(“数据源”)使用指定的数据源即可
JPA【扩展】

概述


  • 除了上述的数据访问方式,Spring Boot中还集成了JPA
  • Java长期层API(Java Persistence API),提供了一套标准的ORM规范,目的是让开辟人员少写或不写SQL语句,主要实现产品有Hibernate、TopLink、Eclipselink等
  • 特点:简朴易用,集成方便,支持面向对象的特性,提供独特的JPQL查询语言
  • 底层使用的是Hibernate
使用方式


  • 引入依靠,JPA需要的依靠包mysql-connector-java、 spring-boot-starter-data-jpa
  • 添加配置,在application.properties中添加数据库连接和相应配置
  • 定义实体类

    • 表名映射:在与表对应的实体类上添加@Table(“表名”)、@Entity
    • 主键属性:添加@Id、@GeneratedValue(strategy=GenerationType.IDENTITY)
    • 普通属性:如果与数据库中列名不同,可添加 @Column(value = "列名")进行映射

  • 定义Repository,针对实体,定义Repository接口,并继承JpaRepository ,此时,Repository就可以用于做数据访问
此外,在定义的Repository接口中,还提供了findByXXX声明式的查询
留意

留意
项目比力多,争取掌握springboot-data-mybatis-plus项目的数据访问、DTO、ResponseData封装、对象映射、主动添补
代码

网盘地址:链接:https://pan.baidu.com/s/18DaKpTTx9T__XG8jkv3naw?pwd=8888

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表