SpringBoot(四)()

  本篇文章为你整理了SpringBoot(四)()的详细内容,包含有 SpringBoot(四),希望能帮助你了解 SpringBoot(四)。

   driver-class-name: com.mysql.cj.jdbc.Driver

   url: jdbc:mysql://localhost:3306/kh96_ssm_airms?useUnicode=true characterEncoding=utf-8 useSSL=false serverTimezone=GMT

   username: root

   password: root

  # mybatis 核心配置

  mybatis:

   configuration:

   map-underscore-to-camel-case: true # 下划线 映射 驼峰

   mapper-locations: classpath:mybatis/mapper/*.xml # 自定义mapper映射路径

  # config-location: classpath:mybatis-config.xml # mysql配置文件

  

 

 

  1.2 实体类

  

@Data

 

  public class Quality {

   //编号

   private Integer id;

   //地区id

   private Integer did;

   //检测时间

   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone =" GMT+8")

   private Date monitorTime;

   //pm10

   private Integer pm10;

   //pm25

   private Integer pm25;

   //监测站

   private String monitorStation;

   //修改时间

   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone =" GMT+8")

   private Date lastModifyTime;

  

 

  1.3 mapper 和 service

  1.3.1 QualityMapper

  

public interface QualityMapper {

 

   //根据空气质量编号,修改空质量

   Integer updateQualityById(Quality qualityForm);

  

 

  1.3.2 QualityMapper.xml

  

 !--

 

   根据空气质量编号,修改空质量

   Integer updateQualityById(Quality qualityForm);

   update id="updateQualityById"

   update air_quality

   set

   if test="id != null" `id` = #{id}, /if

   if test="did != null" `did` = #{did}, /if

   if test="monitorTime != null" `monitor_time` = #{monitorTime}, /if

   if test="pm10 != null" `pm10` = #{pm10}, /if

   if test="pm25 != null" `pm25` = #{pm25}, /if

   if test="monitorStation != null" `monitor_station` = #{monitorStation}, /if

   if test="lastModifyTime != null" `last_modify_time` = #{lastModifyTime}, /if

   /set

   where `id` = #{id}

   /update

  

 

  1.3.3 service

  

//接口

 

  public interface QualityService {

   boolean modifyQualityById(Quality qualityForm);

  //实现类

  @Service

  public class QualityServiceImpl implements QualityService {

   @Autowired

   private QualityMapper qualityMapper;

   @Override

   public boolean modifyQualityById(Quality qualityForm) {

   return qualityMapper.updateQualityById(qualityForm)

  

 

  1.4 测试

  1.4.1 控制层

  

@Slf4j

 

  @RestController

  public class AirQualityController {

   @Autowired

   private QualityService qualityService;

   //根据空气质量编号,修改空质量,使用xml映射文件

   @PostMapping("/modQuality")

   public Map String,String testModifyQualityMapperXml(@RequestBody Quality qualityForm){

   //返回集合

   Map String,String returnMap = new HashMap ();

   //调用业务接口,修改空气详情

   if(qualityService.modifyQualityById(qualityForm)){

   returnMap.put("code","200");

   returnMap.put("msg","Success");

   return returnMap;

   returnMap.put("code","9999");

   returnMap.put("msg","Fail");

   return returnMap;

  

 

  1.4.2 Postman 测试

  测试:

  测试结果:

  2、逆向工程 better-mybatis-generator 插件

  2.1 下载插件 better-mybatis-generator

  2.2 自动生成代码

  2.2.1 idea连接数据库

  2.2.2 生成代码

  2.2.2.1 选中表,右键点击 mybatis-gengrate

  2.2.2.2 生成代码 设置

  生成的代码:
 

  2.3 测试

  2.3.1 service

  2.3.1.1 接口

  

public interface AirQualityService {

 

   //根据条件查询空气质量列表

   List AirQuality getQualityListByExample(AirQualityExample airQualityExample);

  

 

  2.3.1.2 实现类

  

@Service

 

  public class AirQualityServiceImpl implements AirQualityService {

   @Autowired(required = false)

   private AirQualityMapper airQualityMapper;

   @Override

   public List AirQuality getQualityListByExample(AirQualityExample airQualityExample) {

   return airQualityMapper.selectByExample(airQualityExample);

  

 

  2.3.1 测试代码

  

@GetMapping("/airQualities")

 

  public List AirQuality testAirQualityListUseBackward(){

   log.info("------ 根据 查询条件,查询空气质量的列表 --------");

   //创建查询条件对象

   AirQualityExample airQualityExample = new AirQualityExample();

   //如果需要去重,增加条件

   airQualityExample.setDistinct(true);

   //如果需要排序,增加排序条件

   airQualityExample.setOrderByClause(" id desc ");

   //添加自定义查询 条件,监测站名称中包含检测的

   AirQualityExample.Criteria criteria = airQualityExample.createCriteria();

   //criteria.andMonitorStationLike("%"+monitorStation+"%");

   criteria.andMonitorStationLike("%监测%");

   //区域编号 大于1

   //criteria.andDidGreaterThan(1);

   //区域编号在指定列表中

   //criteria.andDidIn(Arrays.asList(1,2,3,4,5));

   //增加or的查询条件

   AirQualityExample.Criteria criteriaOr = airQualityExample.createCriteria();

   criteriaOr.andPm10GreaterThan(100);

   //拼接or的查询条件

   airQualityExample.or(criteriaOr);

   //如果需要分页,增加分页参数 limit ${offset}, ${limit}

   //起始行 (偏移量参数)

   airQualityExample.setOffset(2l);

   //返回数据量

   airQualityExample.setLimit(5);

   //调用业务接口,查询空气质量列表

   List AirQuality qualityListByExample = airQualityService.getQualityListByExample(airQualityExample);

   return qualityListByExample;

  

 

  2.3.2 测试结果:

  2.4 分析查询条件对象

  2.4.1 基本查询条件

  2.4.2 字段上的查询条件

  2.5 分析 创建 xxxExample.Criteria 自定义查询条件

  

protected List Criteria oredCriteria; //oredCriteria 是一个 Criteria 的 集合

 

  //创建条件类 方法

  public Criteria createCriteria() {

   Criteria criteria = createCriteriaInternal();

   if (oredCriteria.size() == 0) {

   oredCriteria.add(criteria); // 创建第一个Criteria的时候会自动加入集合中

   return criteria;

  //or 拼接 条件 方法

  public void or(Criteria criteria) {

   oredCriteria.add(criteria); //其他Criteria 条件,调用方法拼接时 也会 动加入集合中

  

 

  3、JPA

  3.1 JPA 配置

  

# jpa 核心配置

 

  spring:

   jpa:

   show-sql: true # 显示sql查询

   hibernate:

   ddl-auto: update #如果不存在,就新建,如果存在只更新

  

 

  3.2 测试

  3.2.1 实体 bean

  3.2.1.1 实体类

  注意:

  1、如果数据库没有该表会自动生成该表;

  2、如果该表已经存在,也需要填写这些注解信息,要不然会出现实体跟数据库不对应的错误;

  

@SuppressWarnings("all") //会爆红不过没有事,抑制警告就好

 

  @Data

  @Entity

  @Table(name = "air_user",catalog = "kh96_ssm_airms")

  //指定jpa建表的表名,如果指定,默认使用类名作为表名,catalog是指定数据库实例名

  public class AirUser {

   @GeneratedValue(strategy = GenerationType.IDENTITY)

   private Integer id;

   //用户名

   @Column(name = "name",length = 32)

   private String name;

   //密码

   @Column(name = "pwd",length = 32)

   private String pwd;

   //手机号

   @Column(name = "tel",length = 11)

   private String tel;

  

 

  3.2.1.2 生成的表

  启动项目;

  3.2.2 AirUserRepository

  

public interface AirUserRepository extends JpaRepository AirUser,Integer {

 

  

 

  3.2.3 service

  3.2.3.1 接口

  

public interface AirUserService {

 

   //@description : 根据用户编号,查询用户详情

   AirUser getAirUserById(Integer id);

  

 

  3.2.3.2 实现类

  

@Service

 

  public class AirUserServiceImpl implements AirUserService {

   @Autowired

   private AirUserRepository airUserRepository;

   @Override

   public AirUser getAirUserById(Integer id) {

   return airUserRepository.findOne(id);

  

 

  3.2.4 测试代码

  

@RestController

 

  public class AirQualityController {

   @Autowired

   private AirUserService airUserService;

   @GetMapping("/airUser")

   public AirUser AirUserTestAirUserUserJPA(@RequestParam("Id") Integer Id){

   return airUserService.getAirUserById(Id);

  

 

  3.2.5 测试结果

  3.3 分页条件查询

  3.3.1 service

  3.3.1.1 接口

  

public interface AirUserService {

 

   //根据 name 模糊查询,根据 tel 精确查询 ,分页查询 用户列表

   List AirUser getAirUsersByPage(String name,String tel,Integer pageNo,Integer pageSize);

  

 

  3.3.1.2 实现类

  
matching = matching.withMatcher("name", matcher - matcher.contains());

  matching = matching.withMatcher("tel",matcher - matcher.exact());

  
​ Page AirUser airUserPage = airUserRepository.findAll(airUserExample, pageRequest);

  airUserPage 可以获取,符合条件的总条数,总页数,分页后的数据

  
@Override

   public List AirUser getAirUsersByPage(String name, String tel, Integer pageNo, Integer pageSize) {

   //创建查询实体对象

   AirUser airUserForm = new AirUser();

   airUserForm.setName(name);

   airUserForm.setTel(tel);

   //创建匹配器,组装查询条件

   ExampleMatcher matching = ExampleMatcher.matching();

   //注意:propertyPath 实体属性

   //注意这里添加一个条件后一点过要重新接收返回的 ExampleMatcher 否者条件没有添加进去

   matching = matching.withMatcher("name", matcher - matcher.contains());// 模糊查询name

   matching = matching.withMatcher("tel",matcher - matcher.exact()); //精确查询电话

   //创建条件查询对象,放入 查询实体 和 匹配器

   Example AirUser airUserExample = Example.of(airUserForm,matching);

   //一步到位,简洁方便 推荐

  // Example AirUser airUserExample = Example.of(airUserForm, ExampleMatcher.matching()

  // .withMatcher("name", matcher - matcher.contains())

  // .withMatcher("tel", matcher - matcher.exact()));

   //定义排序规则

   Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");

   //sort 对象封装排序规则

   Sort sort = new Sort(order);

   //分页对象 @param page zero-based page index. 所以我们的页码需要减1 处理

   //放入 分页参数 和排序规则

   PageRequest pageRequest = new PageRequest(pageNo - 1, pageSize,sort);

   //通过条件对象 和 分页对象 分页条件 查询

   Page AirUser airUserPage = airUserRepository.findAll(airUserExample, pageRequest);

   // 查询返回的分页对象中,可以获取符合条件的所有条数

  // long totalCount = airUserPage.getTotalElements();

   //可以获取总页数

  // int totalPages = airUserPage.getTotalPages();

   //获取分页条件查询的 数据

   List AirUser airUserList = airUserPage.getContent();

   return airUserList;

  

 

 

  3.3.2 测试

  3.2.2.1 请求

  

//根据 name 模糊查询,根据 tel 精确查询 ,分页查询 用户列表

 

  @GetMapping("/getAirUsersByPage")

  public List AirUser getAirUsersByPage(@RequestParam(value = "name",required = false,defaultValue = "") String name,

   @RequestParam(value = "tel",required = false,defaultValue = "13501020304") String tel,

   @RequestParam(value = "pageNo",required = false,defaultValue = "1") Integer pageNo,

   @RequestParam(value = "pageSize",required = false,defaultValue = "3") Integer pageSize){

   log.info("------ 根据 name 模糊查询,根据 tel 精确查询 ,分页查询 用户列表 ------");

   return airUserService.getAirUsersByPage(name, tel, pageNo, pageSize);

  

 

  3.2.2.2 测试结果

  3.4 ExampleMatcher.GenericPropertyMatchers(通用属性匹配器)的查询方式

  
jpa 模糊查询部分参考:-- https://blog.csdn.net/weixin_43481812/article/details/115615691

  3.5 指定 jpa 自动创建表的字符集

  3.5.1 自定义 配置类

  

// 如果数据库默认建表不是utf-8字符集,增加一个类,解决jpa自动创建表,字符集不支持中文(主要是8一下的数据库有足够问题)

 

  public class MyMySQL57InnoDBDialect extends MySQL57InnoDBDialect {

   @Override

   public String getTableTypeString() {

   return " ENGINE=InnoDB DEFAULT CHARSET=utf8 ";

  

 

  3.5.2 配置

  

spring:

 

   jpa:

   properties:

   hibernate:

   dialect: com.kgc.sbt.config.MyMySQL57InnoDBDialect

   # 自定义 配置类的路径

  

 

  4、Mybatis-plus

  4.1 依赖

  

 dependency 

 

   groupId com.baomidou /groupId

   artifactId mybatis-plus-boot-starter /artifactId

   version 3.4.3.4 /version

   /dependency

  

 

  4.2 配置

  4.2.1 mybatis-plus配置

  

#mybatis-plus 配置

 

  mybatis-plus:

   configuration:

   map-underscore-to-camel-case: true #下划线映射驼峰

   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启 mybatis 标准日志

  

 

  4.2.2 mybatis-plus的分页拦截器

  mybatis-plus的分页拦截器,有这个分页才有效果;

  

@Configuration

 

  public class MybatisPlusConfig {

   // mybatis-plus的分页拦截器

   @Bean

   public MybatisPlusInterceptor mybatisPlusInterceptor(){

   MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

   mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

   return mybatisPlusInterceptor;

  

 

  4.3 条件分页查询

  4.3.1 mapper

  注意:要@MapperScan("com.kgc.sbt.mapper");

  

public interface ContactMapper extends BaseMapper Contact {

 

   //特殊sql,可以自己添加 接口并实现

  

 

  4.3.2 service

  4.3.2.1 接口

  

// 根据 联系人 姓名 获取联系人详情

 

  List ContactVO getContactByName(String contactName,Integer pageNo,Integer pageSize);

  

 

  2.3.2.2 实现类

  创建查询对象

  QueryWrapper Contact contactQueryWrapper = new QueryWrapper ();

  
contactQueryWrapper.likeRight("cname",contactName);
 

  contactQueryWrapper.orderByDesc("id");、

  
Page Contact contactResultPage = contactMapper.selectPage(contactPage, contactQueryWrapper);

  


@Override

 

  public List ContactVO getContactByName(String contactName, Integer pageNo, Integer pageSize) {

   //mybatis-plus,创建一个查询对象,直接用

   QueryWrapper Contact contactQueryWrapper = new QueryWrapper ();

   contactQueryWrapper.likeRight("cname",contactName);

   contactQueryWrapper.orderByDesc("id");

   //or 条件拼接

   contactQueryWrapper.or().eq("cname","李四");

   //创建分页对象

   Page Contact contactPage = new Page (pageNo,pageSize);

   //查询联系人对象

   Page Contact contactResultPage = contactMapper.selectPage(contactPage, contactQueryWrapper);

   //处理返回的结果结果列表,将状态进行转化为描述

   List ContactVO contactVOList = contactResultPage.getRecords().stream().map(contact - {

   //创建新的VO 实体对象

   ContactVO contactVO = new ContactVO();

   //拷贝实体属性

   BeanUtils.copyProperties(contact,contactVO);

   //处理状态说明(可以定义枚举,也可以定义工具类)

   contactVO.setStatusDesc(contact.getStatus() == 1 ? "正常" : "异常");

   return contactVO;

   }).collect(Collectors.toList());

   log.info("------ 总页数:{},总条数:{},当前页:{},条数:{} -----",contactPage.getPages(),contactPage.getCurrent(),pageNo,pageSize);

   return contactVOList;

  

 

  4.4.4 请求测试

  

@@GetMapping("/contactByPage")

 

  public RequestResult List ContactVO getContactListByPage(@RequestParam(value = ("contactName"),required = false) String contactName,

   @RequestParam(value = ("pageNo"),required = false,defaultValue = "1") Integer pageNo,

   @RequestParam(value = ("pageSize"),required = false,defaultValue = "3") Integer pageSize){

   return ResultBuildUtil.success(contactService.getContactByName(contactName,pageNo,pageSize));

  

 

  测试结果:

  以上就是SpringBoot(四)()的详细内容,想要了解更多 SpringBoot(四)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: