SpringBoot案例(数据层、业务层、表现层)

news2024/11/24 19:43:42

1.创建项目

2.选择坐标

3.添加坐标

说明:为了便于开发,引入了lombak坐标。

        <!--添加mybatis-plus坐标-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
<!--        添加Druid坐标-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
        <!--      lombok  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

4.Lombok

说明:Lombok是java类库,提供了一组注解,简化POJO实体列开发 ;它有SpringBoot提供,无需指定版本。为当前实体类在编译期设置对应的get/set方法,toString方法,hashCode方法,equals方法等。

5.实体类

package com.forever.domain;

import lombok.Data;


@Data    //Data中封装了getter方法,setter方法,toString封装;没有构造方法

public class User {
    private  Integer id;
    private  String username;
    private  String  password;
    private  String gender;
    private  String addrCity;

}

6.数据层开发

说明:技术实现方案

MyBatisPlus;数据源用Druid;bookDao和bookMapper是同一个意思。

6.1dao层

package com.forever.dao;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.forever.domain.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao extends BaseMapper<User> {


}

6.2测试类

package com.forever.dao;

import com.forever.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class daoTest {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetByid() {
        System.out.println(userDao.selectById(1));
    }
    @Test
    void testInsert(){
        User user=new User();
        user.setGender("男");
        user.setUsername("天王");
        user.setPassword("123456");
        user.setAddrCity("成都市");
        userDao.insert(user);
    }

}

6.3注意

问题:

解决:将id-type的值设置为auto

#配置数据库
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
      username: root
      password: 123456
server:
  port: 80
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_
      id-type: auto  #auto是自增策略 assign_id是雪花算法自增id

6.5成功 

 

7.mp日志

说明:mybatis-plus开启日志,  配置configuration下的log-impl的值就行了。

#配置数据库
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
      username: root
      password: 123456
server:
  port: 80
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_
      id-type: auto  #auto是自增策略 assign_id是雪花算法自增id
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #标准输出日志

8.分页功能实现

说明:需要加入拦截器类

8.1拦截器类

package com.forever.config;


import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MPConfig {
    @Bean
    //创建了mybatis拦截器的壳
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //拦截分页功能
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return  interceptor;
    }



}

8.2测试类

 说明:加入测试方法。

    @Test
    void testPage(){

        IPage page=new Page(1,5);
        userDao.selectPage(page,null);
    }

8.3成功 

 8.4知识点

说明:分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus:拦截器实现。

9.按条件进行查询

9.1QueryWrapper

说明:QueryWrapper手工录入属性名;LambdaQueryWrapper不用手工录入属性名。

    @Test
    void testGetBy(){
        //按条件查询
        QueryWrapper qw = new QueryWrapper<>();
        qw.like("username","李");
        userDao.selectList(qw);
    }

9.2LambadQueryWrapper

    @Test
    void testGetBy2() {
        String name=null;
        //按条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.like(name!=null, User::getUsername, name);
        userDao.selectList(lqw);
    }

10.业务层

说明:创建了业务层接口,和实现类。

10.1业务接口

package com.forever.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.forever.domain.User;

import java.awt.print.Book;
import java.util.List;

public interface UserService {
   Boolean save(User user);
   Boolean update(User user);
   Boolean delete(Integer id);
   User getByID(Integer id);
   List<User> getAll();
   //分页实现用int类型
   IPage<User> getPage(int currentPage,int pageSize);

}

10.2业务实现类

package com.forever.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.forever.dao.UserDao;
import com.forever.domain.User;
import com.forever.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.awt.print.Book;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public Boolean save(User user) {
        //对于数据层的操作都是影响行数
        return userDao.insert(user) > 0;
    }

    @Override
    public Boolean update(User user) {
        return userDao.updateById(user) > 0;
    }

    @Override
    public Boolean delete(Integer id) {
        return userDao.deleteById(id) > 0;
    }

    @Override
    public User getByID(Integer id) {
        return userDao.selectById(id);
    }

    @Override
    public List<User> getAll() {
        return userDao.selectList(null);
    }

    @Override
    public IPage<User> getPage(int currentPage, int pageSize) {
        IPage page = new Page(currentPage, pageSize);
         userDao.selectPage(page, null);
         return  page;
    }
}

 10.3测试类

package com.forever.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.forever.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTestCase {
    @Autowired
    private  UserService userService;
    @Test
    void testGetById(){
        //关注的是数据能否正常的显示
        System.out.println( userService.getByID(1));;
    }
    @Test
    void  testGetAll(){
        User user=new User();
        user.setGender("男");
        user.setUsername("李四");
        user.setPassword("123456");
        user.setAddrCity("成都市");
        userService.save(user);
    }
    @Test
    void testGetPage(){
       IPage page=userService.getPage(1,5);
        System.out.println(page.getTotal());
    }


}

 10.4简化业务层

说明:业务接口

package com.forever.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.forever.domain.User;

//业务层接口

public interface IUserService extends IService<User> {

}

业务接口实现类

package com.forever.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.forever.dao.UserDao;
import com.forever.domain.User;
import com.forever.service.IUserService;
import org.springframework.stereotype.Service;

//泛型第一个是实现类,第二个模型类
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements IUserService {
}

 测试类

package com.forever.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.forever.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTestCase {
    @Autowired
    private  IUserService userService;
    @Test
    void testGetById(){
        //关注的是数据能否正常的显示
        System.out.println( userService.getById(1));;
    }
    @Test
    void  testGetAll(){
        User user=new User();
        user.setGender("男");
        user.setUsername("李四");
        user.setPassword("123456");
        user.setAddrCity("成都市");
        userService.save(user);
    }
    @Test
    void testGetPage(){
        IPage<User> page=new Page<User>(1,5);
        userService.page(page);
        System.out.println(page.getTotal());
    }


}

11.表现层

说明:基于Restful进行表现层接口开发;使用Postman测试表现层接口功能。

package com.forever.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.forever.domain.User;
import com.forever.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private IUserService userService;
    @GetMapping
    public List<User> getAll(){
        return userService.list();
    }

    @PostMapping
    public  Boolean save(@RequestBody User user){
        return  userService.save(user);
    }

    @GetMapping("{id}")
    public User getByid(@PathVariable Integer id){
        return  userService.getById(id);
    }
    //占位符
    @GetMapping("{currentPage}/{pageSize}")
    public IPage<User> getPage(@PathVariable int currentPage,@PathVariable int pageSize){
        return userService.getPage(currentPage,pageSize);
    }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1173962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavassmMySQL宠物网站系统07183-计算机毕业设计项目选题推荐(附源码)

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于B/S&#xff08;浏览器/服务器&#xff09;模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…

【Mac环境搭建】JDK安装、多JDK安装与切换

文章目录 JDK下载与安装下载安装 配置环境变量安装多个JDK共存 JDK下载与安装 下载 Oracle官网提供了非常多个版本的JDK供下载&#xff0c;可以点击如下链接重定向到JDK下载页面 ORACLE官网JDK下载 安装 下面的官方文档可以点开收藏到浏览器的收藏夹&#xff0c;这样后续在开…

【算法】新年好(堆优化dijkstra)

题目 重庆城里有 n 个车站&#xff0c;m 条 双向 公路连接其中的某些车站。 每两个车站最多用一条公路连接&#xff0c;从任何一个车站出发都可以经过一条或者多条公路到达其他车站&#xff0c;但不同的路径需要花费的时间可能不同。 在一条路径上花费的时间等于路径上所有公路…

选择困难症的我,最终选择了Amazon EC2 云服务器

前言 作为一名开发者&#xff0c;如果要部署一个自己的网站&#xff0c;选择一个好的服务器是非常重要的。本文依据我个人使用服务器的经验&#xff0c;给大家在选择时一些建议。我非常推荐大家使用 Amazon EC2 云服务器。 Amazon EC2 云服务器 提供了最广泛、最深入的计算平…

yum提示Another app is currently holding the yum lock

打算centos 7配置一下docker&#xff0c;报错了&#xff0c;yum提示Another app is currently holding the yum lock; waiting for it to exit... 可能是系统自动升级正在运行&#xff0c;yum在锁定状态中。已经有一个yum进程在运行了&#xff0c;使用kill干掉它&#xff1a; …

【DevChat】智能编程助手,告别敲代码烦恼,从此爱上AI编程

&#x1f50e;官方网站&#xff1a;https://www.devchat.ai/ 文章目录 一、DevChat介绍&#x1f447;二、DevChat优势&#x1fa81;三、DevChat注册流程篇&#x1f380;四、DevChat使用教程篇&#x1f4e2;1. DevChat插件安装配置⚒️2. 与DevChat问答交流&#x1f523;3. DevC…

【Kotlin精简】第7章 泛型

1 泛型 泛型即 “参数化类型”&#xff0c;将类型参数化&#xff0c;可以用在类&#xff0c;接口&#xff0c;函数上。与 Java 一样&#xff0c;Kotlin 也提供泛型&#xff0c;为类型安全提供保证&#xff0c;消除类型强转的烦恼。 1.1 泛型优点 类型安全&#xff1a;通用允许…

分享68个工作总结PPT,总有一款适合您

分享68个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1juus0gmesBFxJ-5KZgSMdQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

【数据结构】数组和字符串(十五):字符串匹配2:KMP算法(Knuth-Morris-Pratt)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作4.3.3 模式匹配算法0. 朴素模式匹配算法1. ADL语言2. KMP算法分析3. 手动求失败函数定义例1例2例3 4. 自动求失败函数&#xff08;C语言&#xff09;5. KMP算法&#xff08;C语言&#xff09;6. 失败函数答案…

思维模型 凡勃伦效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。为什么有些人愿意为高价商品买单&#xff1f;请看凡勃伦效应。 1 凡勃伦效应的应用 1.1 奢侈品市场中的凡勃伦效应 茅台酒&#xff1a;茅台酒是中国的一种高档白酒&#xff0c;价格非常昂…

在本地安装LLAMA 2

方法一&#xff1a; Meta已将llama2开源&#xff0c;任何人都可以通过在meta ai上申请并接受许可证、提供电子邮件地址来获取模型。 Meta 将在电子邮件中发送下载链接。 下载llama2 获取download.sh文件&#xff0c;将其存储在mac上打开mac终端&#xff0c;执行 chmod x ./do…

namespace

1.namespace技术 namespace是Linux内核的一组特性&#xff0c;支持对内核资源进行分区隔离&#xff0c;让一组进程只能看到一组资源&#xff0c;而另一组进程只能看到另一组不同的资源。换句话说&#xff0c;namespace的关键特性是进程隔离。在运行许多不同服务的服务器上&…

计网【链路带宽100Mbps代表什么,“翻译”成人话是?】

这里写目录标题 带宽的概念本来的意思【通信领域】计网中的意思 结论【100Mbps代表什么】 带宽的概念 本来的意思【通信领域】 带宽这个概念本来是通信领域的&#xff0c;表示通信线路允许通过的信号频带范围&#xff0c;单位是赫兹Hz 感觉最简单的意思&#xff0c;例如如果…

Javascript知识点详解:数组、Array 对象

目录 数组 定义 数组的本质 对象有两种读取成员的方法&#xff1a; length 属性 in 运算符 for...in 循环和数组的遍历 数组的空位 类似数组的对象 Array 构造函数 静态方法 Array.isArray() 实例方法 valueOf()&#xff0c;toString() push()&#xff0c;pop(…

ruby、Python 以及 Swift 语言关于 “Finally” 实现的趣谈

0. 概览 结构化代码语义是任何语言入门之必备基本功&#xff0c;想写出“意大利面条”似的美味代码么&#xff1f;直接干就对了&#xff01; 虽然上面有些“话糙理不糙”&#xff0c;但不可否认的是现今几乎所有高级语言都对代码结构化语义提供了良好的支持。入门码农们的第一…

循环队列练习

循环队列练习 相关内容&#xff1a; 1.队列顺序存储的不足 2.循环队列&#xff08;队列头尾相接的顺序存储结构&#xff09; //队列的初始化、入队、出队、取对头、计算队长度 #include<stdio.h> #define MAXSIZE 10 typedef int Status; #define OK 1 #define ERROR 0…

虚幻C+++基础 day2

角色移动与视角控制 Character类与相关API 创建Character子类MainPlayer.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameFramework/Character.h" #include &q…

centos7.0+最快速安装docker的方法

先安装yum工具&#xff0c;然后添加阿里云的docker仓库&#xff0c;然后yum安装&#xff0c;然后启动 安装yum-config yum install yum-utils -y yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce do…

一款简单而强大的文档翻译网站

一款文字/文件翻译的网站,支持多个领域的翻译&#xff0c;支持常见的语言翻译(韩/日/法/英/俄/德…),最大百分比的保持原文排版(及个别除外基本100%还原)。 新用户注册就有100页的免费额度&#xff0c;每月系统还会随机赠送翻译额度&#xff0c;说实话这比好多的企业要好的多了…

为什么没有面试机会?是因为你没有掌握这套完整的性能测试流程,

一、准备工作 在什么阶段开展性能测试工作&#xff1f;一般情况下&#xff0c;是在被测系统已完成功能测试、系统趋于稳定的情况下&#xff0c;才会进行性能测试。 1. 组建测试团队 根据被测系统的实际情况&#xff0c;组建一个性能测试团队&#xff0c;团队成员包括&#xff…