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
                }
            )
        },




相关文章
|
2天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1517 4
|
29天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
492 19
|
2天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
179 1
|
8天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
448 5
|
7天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
314 2
|
23天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
25天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2608 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析