剖析Java中的Entity、service、serviceImpl、Mapper以及Controller层之间的关系(代码诠释)

前言

学习了Java的相关方面知识之后,但对于各层次之间的关系以及部署,可能还会有些陌生感,下面以代码讲解各层之间的关系。
(企业中多数以Springboot为例,下面的代码都是以Springboot为例)
如果还停留在SSM基础或者补充Springboot的基础知识,也可在我的博客搜索。

1. Demo1

简单的Spring Boot项目的基本结构,其中包含了实体类、Mapper接口和XML文件、Service接口和实现类以及Controller。

根据实际需求进行适当的调整和扩展。在实际项目中,还需要配置数据库连接、事务管理等相关内容

一、定义实体类(Entity):

// User.java
public class User {
    private Long id;
    private String username;
    private String email;

    // Getters and setters
}

二、创建Mapper接口:

// UserMapper.java
import java.util.List;

public interface UserMapper {
    List<User> getAllUsers();
    User getUserById(Long id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(Long id);
}

三、创建Mapper XML文件:(在resources目录下创建一个与Mapper接口同名的XML文件,定义SQL语句):

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM users;
    </select>

    <select id="getUserById" parameterType="Long" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id};
    </select>

    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (username, email) VALUES (#{username}, #{email});
    </insert>

    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id};
    </update>

    <delete id="deleteUser" parameterType="Long">
        DELETE FROM users WHERE id = #{id};
    </delete>
</mapper>

四、创建Service接口和实现类:(实现类记得写@Service):

// UserService.java
public interface UserService {
    List<User> getAllUsers();
    User getUserById(Long id);
    void saveUser(User user);
    void updateUser(User user);
    void deleteUser(Long id);
}
// UserServiceImpl.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    private final UserMapper userMapper;

    @Autowired
    public UserServiceImpl(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    @Override
    public User getUserById(Long id) {
        return userMapper.getUserById(id);
    }

    @Override
    public void saveUser(User user) {
        userMapper.insertUser(user);
    }

    @Override
    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    @Override
    public void deleteUser(Long id) {
        userMapper.deleteUser(id);
    }
}

五、创建Controller:(用于处理HTTP请求)

// UserController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public void saveUser(@RequestBody User user) {
        userService.saveUser(user);
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}

2. Demo2

上述改进方案可以摘Service中继承Iservice,使用继承类中的方法:

一、 修改UserService接口:在com.example.service包下创建一个UserService接口,继承IService:

// UserService.java
import com.example.model.User;
import com.baomidou.mybatisplus.extension.service.IService;

public interface UserService extends IService<User> {
    // 这里可以添加自定义的业务方法
}

二、创建UserServiceImpl实现类:(ServiceImpl已经实现了IService中的基本方法,在此基础上添加自定义的业务方法)

// UserServiceImpl.java
import com.example.mapper.UserMapper;
import com.example.model.User;
import com.example.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 这里可以添加自定义的业务方法的实现
}

三、使用UserService:在Controller中注入UserService,即可使用自动生成的方法

// UserController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import com.example.model.User;
import com.example.service.UserService;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.list();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    @PostMapping
    public void saveUser(@RequestBody User user) {
        userService.save(user);
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        userService.updateById(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.removeById(id);
    }
}

3. Demo3

对于MybatisPlus中,其实更多的是Mapper来操作,上述Service的操作,最后都会通过Mapepr来操作

可以看这篇文章的示例讲解:快速理解Mybatis-plus中BaseMapper、IService和ServiceImpl

类似如下:

    @Test
    public void getUserById() {

        List<User> one = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getUsername,"manong"));
        System.out.println(one);
    }

3. Mybatis自动生成

使用Spring Boot和MyBatis的整合框架,可以借助MyBatis Generator自动生成实体类、Mapper接口以及XML文件。

以下是一个使用MyBatis Generator生成代码的简单示例:

一、pom.xml的依赖包:

<dependencies>
    <!-- 其他依赖 -->

    <!-- MyBatis Generator 依赖 -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.4.0</version>
    </dependency>
</dependencies>

二、创建MyBatis Generator配置文件:在src/main/resources目录下创建一个generatorConfig.xml文件,用于配置生成器的参数:

<!-- generatorConfig.xml -->
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="default" targetRuntime="MyBatis3">

        <!-- 数据库连接配置 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/your_database" userId="your_username" password="your_password"/>

        <!-- 实体类生成位置 -->
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>

        <!-- Mapper接口生成位置 -->
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/java"/>

        <!-- XML文件生成位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>

        <!-- 表配置 -->
        <table tableName="users" domainObjectName="User"/>

    </context>
</generatorConfiguration>

三、通过命令行或者IDE插件运行MyBatis Generator,生成代码:

mvn mybatis-generator:generate
  • 36
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在一个典型的Java web项目controllerserviceserviceimplmapperentity、vo的运行逻辑如下: 1. 前端请求数据 前端发送请求到controller,请求数据。 2. Controller接收请求 Controller接收请求,对请求进行解析,提取出请求参数,然后调用Service相应的接口方法,将请求参数传递给Service。 3. Service处理业务逻辑 Service接收到Controller传递过来的请求参数,处理业务逻辑,调用Mapper相应的接口方法,将请求参数传递给Mapper。 4. Mapper访问数据库 Mapper接收到Service传递过来的请求参数,访问数据库,将查询结果封装到Entity的实体对象,然后将实体对象返回给Service。 5. Service返回数据 Service接收到Mapper返回的实体对象,将其转换成VO的对象,然后将VO的对象返回给Controller。 6. Controller响应请求 Controller接收到Service返回的VO的对象,将其转换成前端需要的数据格式,然后将数据返回给前端,响应请求。 在这个过程Mapper封装了对数据库的访问,Service封装了业务逻辑处理,Controller负责接收请求和响应请求,Entity定义了与数据库对应的实体类,VO用于在前端展示数据时封装数据。 通过上述的流程,可以让代码更加清晰,职责更加明确,实现更好的代码复用和模块化,同时也方便代码的维护和升级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值