Spring Boot整合Mybatis之前后端分离开发

本篇主要在Spring Boot项目基础上整合Mybatis实现一个前后端分离开发的小案例,简单实现一些增删改查和条件查询,不涉及log日志、结果集、全局异常处理等操作,纯后台,只做数据处理,暂不涉及前台。不会搭建Spring Boot项目的小伙伴可以参考我的上一篇文章:30分钟快速上手从0搭建Spring boot项目https://blog.csdn.net/weixin_46214451/article/details/106657894
本篇的所有实现均在上篇所搭建的项目之上进行开发。

第一步 建表

CREATE TABLE employee
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);
#添加数据
INSERT INTO employee (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

第二步 根据JavaEE开发的三层架构(表现层、业务层、数据层)建立如下类、接口和映射文件
在这里插入图片描述
实体类没什么好说的这里略过
我们从底层往上写,先在Mapper接口写一个简单的查询方法

package com.example.mapper;

import com.example.entity.Employee;
import org.springframework.stereotype.Repository;

import java.util.List;

// @Repository注解表示该类是一个数据层的Bean并交给Spring的IOC容器托管
@Repository
public interface EmployeeMapper {
	// 接口中的方法不需要用权限修饰,默认为public
    List<Employee> selectEmp();

}

有了mapper接口就要有与之对应的xml映射文件

<?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.mapper.EmployeeMapper">
<!--  sql标签中的id值要与mapper接口中的方法名对应  -->
    <select id="selectEmp" resultMap="Employee">
        SELECT
        *
        FROM
        employee
    </select>
<!--  在正常开发中我们的数据库字段和实体类中的属性名往往不一致(我这里写的是一致的),
	  resultMap的作用就是解决这一问题property代表我们的实体类属性column代表数据库字段
  -->
    <resultMap id="Employee" type="com.example.entity.Employee">
        <result property="id" column="id" />
        <result property="name" column="name" />
        <result property="age" column="age" />
        <result property="email" column="email" />
    </resultMap>
</mapper>

之后写业务层接口和业务层实现类,这里很多人不明白为什么要写接口不能直接写实现类,这就涉及到了Java设计原则中的依赖倒置原则,想深入了解设计原则的可以看我的《Java七大设计原则》https://blog.csdn.net/weixin_46214451/article/details/106680521
接口和Mapper接口差不多没有什么好说的

package com.example.service;

import com.example.entity.Employee;

import java.util.List;

public interface EmployeeService {
    List<Employee> selectEmp();

}

然后是实现类

package com.example.service.impl;

import com.example.entity.Employee;
import com.example.mapper.EmployeeMapper;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

// @Service注解表示该类是一个业务层的Bean并交给Spring的IOC容器托管
@Service
public class EmployeeServiceImpl implements EmployeeService {
	// @Autowired是Spring中的自动注入功能 
    @Autowired
    private EmployeeMapper employeeMapper;


    @Override
    public List<Employee> selectEmp() {
		// 在这里调用Mapper中的selectEmp方法
        List<Employee> employees = employeeMapper.selectEmp();

        return employees;

    }
}

最后是表示层

package com.example.controller;


import com.example.entity.Employee;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

// @RestController注解表示该类是一个表示层的Bean并交给Spring的IOC容器托管
// 该注解是一个复合注解包括了@Controller和@RequestBody
// @RequestBody主要用来接收前端传递给后端的json字符串中的数据
// 简单理解就是@Controller会返回视图@RestController注解会返回数据
@RestController
// @RequestMapping这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上
// 它的method = RequestMethod.POST参数可以可以将我们的请求方式变为post请求
@RequestMapping("employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    @RequestMapping(value = "select",method = RequestMethod.POST)
    public List<Employee> selectEmp(){

        List<Employee> employees = employeeService.selectEmp();

        return employees;
    }


}

到这里我们一个非常简单的查询操作就写完了,由于没有前台页面我们需要一个测试数据的工具——postman,没有的小伙伴可以百度自己下载
之后启动postman 更改请求为POST然后输入我们的url地址 请求参数改为json 点击Send发送请求就OK了
在这里插入图片描述
我们数据库里的所有数据就被查询出来了,我们只需要把接口交给前台就可以了具体页面是什么样的就跟我们没有关系了,前后端分离我们后台只关心数据处理就OK 了(这里的接口其实就是我们的url地址,并不是我们的Java接口)
写完了查询功能后边的增删改功能其实也是差不多的,这里我把代码放在下边感兴趣的可以自己研究一下
重点说一下容易踩坑的地方:
1.除了简单查询以外,其他功能需要输入参数我们用实体类来接受前台传过来的参数(@RequestBody Employee employee)这里的@RequestBody注解的主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的)。
2.模糊查询的Sql语句:name like ‘%${name}%’,中不能用#{}而是用${},因为Mybatis的底层是封装了JDBC, #{} 会把参数解析成一个占位符,而${}会把参数解析成字符串。
3.查询功能的Sql标签里需要resultMap结果映射,增删改功能的Sql标签里需要:parameterType 参数类型 这里的值写实体类类名

controller

package com.example.controller;


import com.example.entity.Employee;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;
    // 简单查询
    @RequestMapping(value = "select",method = RequestMethod.POST)
    public List<Employee> selectEmp(){

        List<Employee> employees = employeeService.selectEmp();

        return employees;
    }
    // 条件查询
    @RequestMapping(value = "conditionselect",method = RequestMethod.POST)
    public List<Employee> conditionSelectEmp(@RequestBody Employee employee){

        List<Employee> employees = employeeService.conditionSelectEmp(employee);

        return employees;
    }
    // 添加
    @RequestMapping(value = "insert",method = RequestMethod.POST)
    public String insertEmp(@RequestBody Employee employee){

        String insertEmp = employeeService.insertEmp(employee);

        return insertEmp;
    }
    // 删除
    @RequestMapping(value = "delete",method = RequestMethod.POST)
    public String deleteEmp(@RequestBody Employee employee){
        String insertEmp = employeeService.deleteEmp(employee);

        return insertEmp;
    }
    // 修改
    @RequestMapping(value = "update",method = RequestMethod.POST)
    public String updateEmp(@RequestBody Employee employee){

        String updateEmp = employeeService.updateEmp(employee);

        return updateEmp;
    }


}

service

package com.example.service;

import com.example.entity.Employee;

import java.util.List;

public interface EmployeeService {
    // 查询
    List<Employee> selectEmp();

    // 条件查询
    List<Employee> conditionSelectEmp(Employee employee);

    // 增加
    String insertEmp(Employee employee);

    // 删除
    String deleteEmp(Employee employee);

    // 修改
    String updateEmp(Employee employee);

}

serviceimpl 再强调一遍这里不严谨,没有做结果集和异常处理

package com.example.service.impl;

import com.example.entity.Employee;
import com.example.mapper.EmployeeMapper;
import com.example.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;


    @Override
    public List<Employee> selectEmp() {

        List<Employee> employees = employeeMapper.selectEmp();

        return employees;

    }

    @Override
    public List<Employee> conditionSelectEmp(Employee employee) {

        List<Employee> employees = employeeMapper.conditionSelectEmp(employee);

        return employees;
    }

    @Override
    public String insertEmp(Employee employee) {
        int insertEmp = employeeMapper.insertEmp(employee);
        if(insertEmp != 0){
            return "添加成功";
        } else {
            return "添加失败";
        }

    }

    @Override
    public String deleteEmp(Employee employee) {
        int deleteEmp = employeeMapper.deleteEmp(employee);
        if(deleteEmp != 0){
            return "删除成功";
        } else {
            return "删除失败";
        }
    }

    @Override
    public String updateEmp(Employee employee) {

        int updateEmp = employeeMapper.updateEmp(employee);
        if(updateEmp != 0){
            return "修改成功";
        } else {
            return "修改失败";
        }

    }


}

mapper

package com.example.mapper;

import com.example.entity.Employee;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface EmployeeMapper {
    // 查询
    List<Employee> selectEmp();

    // 条件查询
    List<Employee> conditionSelectEmp(Employee employee);

    // 增加
    int insertEmp(Employee employee);

    // 删除
    int deleteEmp(Employee employee);

    // 修改
    int updateEmp(Employee employee);


}

mapper.xml

<?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.mapper.EmployeeMapper">

    <select id="selectEmp" resultMap="Employee">
        SELECT
        *
        FROM
        employee
    </select>

    <select id="conditionSelectEmp" resultMap="Employee">
        SELECT
        *
        FROM
        employee
        where
        name like '%${name}%'
    </select>

    <insert id="insertEmp" parameterType="com.example.entity.Employee">
        INSERT INTO employee (id, name, age, email)
        VALUES
        (#{id},#{name},#{age},#{email})
    </insert>

    <delete id="deleteEmp" parameterType="com.example.entity.Employee">
        delete from employee where id = #{id}
    </delete>

    <update id="updateEmp" parameterType="com.example.entity.Employee">
        UPDATE employee
        SET
        name=#{name},
        age=#{age},
        email=#{email}
        WHERE id=#{id}
    </update>

    <resultMap id="Employee" type="com.example.entity.Employee">
        <result property="id" column="id" />
        <result property="name" column="name" />
        <result property="age" column="age" />
        <result property="email" column="email" />
    </resultMap>
</mapper>

放一个运行结果
在这里插入图片描述
在这里插入图片描述
如果这篇文章对你有帮助记得来波三连哦,拒绝白嫖。有问题在下面评论,我会回复

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于 Spring BootMyBatis Plus和Vue的开发框架是现代Web应用开发的主要选择之一。Spring Boot是一个轻量级的Java开发框架,提供了快速构建独立应用程序所需的所有功能。它简化了传统的Spring应用程序开发过程,让开发者能够更专注于业务逻辑。 MyBatis Plus是一个对MyBatis进行封装的工具,提供了更简单、更方便的方式来操作数据库。它使用注解和代码生成器来减少开发时间,使得数据库操作更加高效和可维护。 Vue是一个流行的JavaScript框架,用于构建用户界面。它的特点是轻量级、易于学习和使用,并且具有非常高的性能。Vue可以与服务器端的后端框架(如Spring Boot)无缝集成,在前后端分离的项目中,提供了极佳的开发体验。 使用基于Spring BootMyBatis Plus和Vue的开发框架,开发者可以快速搭建一个完整的Web应用。首先,使用Spring Boot来创建后端应用,配置数据源和集成MyBatis Plus以简化数据库操作。然后,使用Vue来创建用户界面,通过REST API与后端进行通信。 这个开发框架的优点是集成了强大的Java后端和灵活的JavaScript前端,开发者可以使用多种技术栈来完成各种功能。同时,Spring Boot提供了很好的项目结构和配置管理,MyBatis Plus简化了数据库操作,Vue提供了丰富的界面组件和开发工具,整合后的开发框架提供了高效、可维护和可扩展的开发环境。 总之,基于Spring BootMyBatis Plus和Vue的开发框架提供了一种现代化、高效和灵活的Web应用开发方式。它适用于各种规模的项目,可以提高开发效率,降低维护成本,并且提供良好的开发体验。 ### 回答2: 基于Spring BootMyBatis Plus和Vue框架的开发可以实现一个完整的前后端分离的应用。以下是具体方面的解释: 1. Spring Boot是一个快速开发Java框架,可以轻松搭建后端服务器。它提供了自动配置、快速开发等功能,大大简化了Java后端开发的步骤。 2. MyBatis Plus是一个基于MyBatis的增强工具,可以简化与数据库的交互。它提供了更简单的API、更强大的查询功能和代码生成等特性,可以极大提高后端开发的效率。 3. Vue是一个流行的前端框架,用于构建用户界面。它具有简单易学、灵活和高性能等特点,可以帮助我们编写交互式、响应式的前端应用。 基于这三个框架的组合,可以实现前后端完全分离的开发模式。后端使用Spring Boot搭建服务器,处理业务逻辑,并与数据库进行交互。MyBatis Plus可以简化与数据库的交互,提供了更简单的CRUD操作和强大的查询功能。 前端使用Vue进行开发,可以实现灵活的用户界面。通过Restful API与后端进行通信,实现数据的交互。 总而言之,基于Spring BootMyBatis Plus和Vue的开发模式,可以高效地实现前后端分离的应用。后端使用Spring Boot提供服务,MyBatis Plus简化数据库交互,前端使用Vue构建用户界面。这种组合可以提高开发效率,让开发人员更专注于业务逻辑的实现。 ### 回答3: 基于Spring BootMyBatis Plus和Vue的开发,可以实现一个全栈的Web应用程序。 Spring Boot是一个基于Spring框架的快速开发工具,它简化了Spring项目的配置,提供了一套约定大于配置的开发模式。使用Spring Boot可以快速搭建一个Web应用程序的后端,处理数据层和业务逻辑。 MyBatis Plus是基于MyBatis框架之上的增强工具,它进一步简化了在Java应用程序中操作数据库的流程。MyBatis Plus提供了很多常用的功能和特性,如代码生成器、自动填充、分页插件等,可以极大地提高开发效率。 Vue是一种现代化的JavaScript框架,用于构建用户界面。它提供了一套响应式组件系统和强大的工具集,可以帮助开发者快速构建单页应用程序。Vue可以与其他后端技术,如Spring BootMyBatis Plus一起使用,实现前后端分离开发模式。 在基于这些技术的开发过程中,可以将后端的数据处理和业务逻辑实现放在Spring Boot中,使用MyBatis Plus进行数据库操作。前端使用Vue构建用户界面,并通过异步请求与后端进行数据交互。通过这种方式,可以实现一个功能完善的全栈Web应用程序。 使用Spring BootMyBatis Plus可以快速搭建后端框架,并提供强大的数据库操作能力。而Vue作为前端框架,可以提供友好的用户界面和交互体验。通过这些技术的结合,可以实现高效、灵活的全栈开发,为用户提供优质的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值