springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)

简介: 本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。

自定义一个mvc

package com.example.springboot01.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Locale;
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    public  static class MyViewResolver implements ViewResolver {
//         自定义一个 自己的视图解析器
        @Bean
        public ViewResolver myViewResolver(){
return new MyViewResolver();
        }
        @Override
        public View resolveViewName(String viewName, Locale locale) throws Exception {
            return null;
        }
    }
}

后端给前端传数据

后端

@RestController
public class IndexController {
@RequestMapping("/index")
    public String Hello(){
    return "hello";
}
}

前端

代理

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false, /*关闭语法检查*/
  devServer: {
    proxy: {
      // 代理 见到 api开头 拦截,然后替换 为 target里面的内容,所以需要将
      // ^/api 变为 空字符串
      '/api': { //表示  拦截  /api  开头的路径
        // 跨域 的域名(不需要写路径) 写 了的话需要替换 
        // 如果更改了地址就需要在后面加上
        target: "http://localhost:8080/",
        changeOrigin: true,     //  是否 开启跨域 
        pathRewrite: {
          '^/api': '',        //  把/api  变为 空字符串     
        }
      },
    }
  },
})

使用

methods: {
    test() {
      const a = axios.get("/api/index").then(res => res.data)
      console.log(a)
    }
  }

增删改查

先创建一个数据库

在 配置好 环境 变量下 完成 增删改查

查所有

查所有

先 写一个controller

@RequestMapping
    public List<User> index(){
        return userMapper.findAll();
    }

然后创建一个userMapper  接口

@Mapper
public interface UserMapper {
    @Select("select * from sys_user")
    List<User> findAll();
}

引用 mapper    注意注解

@Autowired
    private   UserMapper userMapper;


通过id删除

语句

调用mapper  一样

@Autowired
    private   UserMapper userMapper;
    //  删除
    @DeleteMapping("/{id}")
    public Integer delete(@PathVariable Integer id){
        return userMapper.deleteById(id);
    }

创建mapper 文件

@Delete("delete from sys_user where id = #{id}")
    Integer deleteById(@Param("id") Integer id);

即可

增加

//  增和 改 都在 这个里面
    @PostMapping
    public Integer save(@RequestBody User user){
//         新增或则 更新 都在里面
        return userService.save(user);
    }

此时 使用的 是 userService  文件

@Autowired
    private UserService userService;

使用一个 判断   整合  

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    public int save(User user){
        if(user.getId() == null){
           return userMapper.insert(user);
        }else {
//             否则为更新
         return userMapper.update(user);
        }
    }
}

主要的 增删 改查 还在   mapper 文件中

inser  为 增加

@Insert("INSERT into sys_user (username,password,nickname,email,phone,address) values(#{username},#{password},#{nickname},#{email},#{phone},#{address})")
int insert(User user);


更新

先定义一个语句

int update(User user);

在 resources 文件夹下面  创建一个mapper

并在application.yaml  里面配置好

mybatis:
  mapper-locations: classpath:mapper/*.xml
#   classpath  resources 文件夹 下面的 东西
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#     打印日志

再创建User.xml    

 为 el语法

updata id= update      为mapper 中 配置的 名字

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springboot.mapper.UserMapper">
<!--    id  和 方法名一样-->
    <update id="update">
    update sys_user
    <set>
    <if test="username != null">
        username=#{username},
    </if>
<!--        <if test="password != null">-->
<!--            password=#{password}-->
<!--        </if>-->
        <if test="nickname != null">
            nickname=#{nickname},
        </if>
        <if test="email != null">
            email=#{email},
        </if>
        <if test="phone != null">
            phone=#{phone},
        </if>
        <if test="address != null">
            address=#{address}
        </if>
    </set>
<where>
   id=#{id}
</where>
    </update>
</mapper>


分页and 查询


(pageNum-1)*pageSize

pageNum    显示第几页

pageSize    每页显示的 个数

//    limit 2,5
    // 2 下标0 开始  后面加一 开始,   5   表示 每页显示的 数量 
@Select("select * from sys_user Limit #{pageNum},#{page Size}")
    List <User>selectPage(Integer pageNum, Integer pageSize);
@Select("select count(*) from sys_user ")
    Integer selectTotal();
}
// count  表示 数量
//   分页查询接口
    //@RequestParam  接收 ?pageNum = 1 pageSize=10
    @RequestMapping("/page")
    public Map<String,Object> findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize) {
        pageNum=(pageNum-1)*pageSize;// 每页数量  开始的  下标
/ 你/         分页 的 方法  得到 data
        List<User>data=userMapper.selectPage(pageNum,pageSize);
//         全部的 数据
          Integer total=userMapper.selectTotal();
//           定义一个map  存入  数据
        Map<String,Object>res=new HashMap<>();
        res.put("data",data);
        res.put("total",total);
       return res;
    }
}

在 分页基础 上加一个username   参数  完成 查询

//   分页查询接口
    //@RequestParam  接收 ?pageNum = 1 pageSize=10
    @RequestMapping("/page")
    public Map<String,Object> findPage(@RequestParam Integer pageNum,
                                       @RequestParam Integer pageSize,
                                       @RequestParam String username) {
        pageNum=(pageNum-1)*pageSize;// 每页数量  开始的  下标
        username = "%"+username+"%";
//         分页 的 方法  得到 data
        List<User>data=userMapper.selectPage(pageNum,pageSize,username);
//         全部的 数据
          Integer total=userMapper.selectTotal(username);
//           定义一个map  存入  数据
        Map<String,Object>res=new HashMap<>();
        res.put("data",data);
        res.put("total",total);
       return res;
    }
}
//    limit 2,5
    // 2 下标0 开始  后面加一 开始,   5   表示 每页显示的 数量
@Select("select * from sys_user where username like #{username} Limit #{pageNum},#{pageSize}")
    List <User>selectPage(Integer pageNum, Integer pageSize,String username);
@Select("select count(*) from sys_user where username like #{username}")
    Integer selectTotal(String username);
}

前端 绑定

现在 el-input 里面绑定 username

在load 方法里面 加参数

点击按钮加载 方法

load() {
            //  请求分页
            fetch(`http://localhost:8081/user/page?pageNum=${this.pageNum}&pageSize=${this.pageSize}&username=${this.username}`).then(res => res.json()).then(
                res => {
                    this.tableData = res.data,
                        this.total = res.total
                }
            )
        },




相关文章
|
1天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
2天前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
6天前
|
JSON 缓存 前端开发
SpringBoot的 ResponseEntity类讲解(具体讲解返回给前端的一些事情)
本文讲解了SpringBoot中的`ResponseEntity`类,展示了如何使用它来自定义HTTP响应,包括状态码、响应头和响应体,以及如何将图片从MinIO读取并返回给前端。
19 3
|
1天前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
10天前
|
设计模式 算法 搜索推荐
后端开发中的设计模式应用与实践
在软件开发的广袤天地中,后端技术如同构筑高楼大厦的钢筋水泥,支撑起整个应用程序的骨架。本文旨在通过深入浅出的方式,探讨后端开发领域内不可或缺的设计模式,这些模式犹如精雕细琢的工具箱,能够助力开发者打造出既健壮又灵活的系统架构。从单例模式到工厂模式,从观察者模式到策略模式,每一种设计模式都蕴含着深刻的哲理与实践价值,它们不仅仅是代码的组织方式,更是解决复杂问题的智慧结晶。
|
8天前
|
JavaScript 前端开发 NoSQL
深入浅出Node.js后端开发
本文将引导你了解Node.js的基础知识,包括安装、运行环境搭建以及简单的代码示例。通过阅读本文,你将学会如何利用Node.js进行后端开发,并理解异步编程和事件驱动模型的核心概念。文章还将介绍一些实用的库和框架,帮助你快速开始Node.js项目。
28 4
|
9天前
|
存储 安全 Java
每日大厂面试题大汇总 —— 今日的是“美团-后端开发-一面”
文章汇总了美团后端开发一面的面试题目,内容涉及哈希表、HashMap、二叉树遍历、数据库索引、死锁、事务隔离级别、Java对象相等性、多态、线程池拒绝策略、CAS、设计模式、Spring事务传播机制及RPC序列化工具等。
23 0
|
9天前
|
存储 消息中间件 NoSQL
每日大厂面试题大汇总 —— 今日的是“京东-后端开发-一面”
文章汇总了京东后端开发一面的面试题目,包括ArrayList与LinkedList的区别、HashMap的数据结构和操作、线程安全问题、线程池参数、MySQL存储引擎、Redis性能和线程模型、分布式锁处理、HTTP与HTTPS、Kafka等方面的问题。
51 0
|
4天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第4天】本文将带你走进Node.js的世界,从基础的搭建到高级的应用,一步步揭示Node.js的强大与便捷。我们将通过实际的代码示例,让你在轻松的氛围中学习并掌握Node.js,开启你的后端开发之旅。
|
5天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第3天】在数字化时代的浪潮中,后端开发作为技术架构的核心,承载着数据处理和业务逻辑的重任。Node.js以其非阻塞I/O、事件驱动的特性,在众多后端技术中脱颖而出,成为高效、轻量级后端解决方案的代名词。本文将带领读者深入理解Node.js的精髓,从基础概念到实战应用,逐步揭示如何利用Node.js构建高性能的后端服务。通过浅显易懂的语言和实际案例分析,我们将探索Node.js在现代后端开发中的应用及其带来的变革。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往Node.js世界的大门,让你领略其背后的哲学和技术之美。