使用 Spring Boot +Mybatis 正式开发中对数据的增删改查接口模版和配置

在上一篇文章中,我们采用了从0-1完成一个架构的设计与实现可以帮助我们在实际开发过程中快速搭建一个项目整体架构,方便我们利用开发,今天我写的这篇仍然是纪录,纪录我们在开发中最基本的增删改查操作,本篇博客偏向于基础化,时候刚刚进入开发的同学观看,说不上有啥高大上,只不过是一些基础的增删改查操作,包括从控制层到Service层再到Dao层等等。

好了废话不多说了,本篇依旧使用的是Spring Boot和Mybatis进行demo开发。本文以User对象进行。

User 实体类

实体类的字段都是根据我们SQL中的表字段进行的:

sql 复制代码
create table user(
	id int ...,
	name varchar...,
	sex char ...,
	tell varchar...,
	....
)

对应Java中的实体类:

java 复制代码
public class User{
	private Long id;
	private String name;
	private String sex;
	private String tell;
	private String addr;
	private Integer age;
	....
	//构造方法,get Set方法等等啥的
}

控制层

我们在实际开发过程中最常调用的地方就是控制层的接口。

以下我将通过demo进行:

java 复制代码
@RestController
@RequestMapping("/users")
public class UserController {

//	用户Service接口
    @Autowired
    private IUserService userService;

	//获取全部用户信息
    @GetMapping("/getAllUsers")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }
	//根据用户Id进行查询相关信息
    @GetMapping("/getUserById/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        return userService.getUserById(id);
    }
	//新增用户
    @PostMapping("/createUser")
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
	//根据相关用户id去更新用户信息
    @PutMapping("/updateUser/{id}")
    public User updateUser(@PathVariable("id") Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }
	//删除用户
    @DeleteMapping("/deleteUser/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}

在以上代码中我们完成了在Controller层调用Service接口层的相关接口方法,接下来我们在Service层展示具体的操作,当然Controller层的相关代码需要根据你的需求进行拓展,比如方法的返回类型,以及判断数据是否为空的逻辑,更有日志打印等相关功能。

Service层

IUserService接口

java 复制代码
public interface IUserService{

	List<User> getAllUsers();

	User getUserById(Long id);

	User createUser(User user);

	User updateUser(Long id, User user);

	void deleteUser(Long id)
}

UserService 实现层

java 复制代码
@Service
public class UserService implements IUserService{

    @Autowired
    private UserMapper userMapper;

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

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

    public User createUser(User user) {
        userMapper.createUser(user);
        return user;
    }

    public User updateUser(Long id, User user) {
        user.setId(id);
        userMapper.updateUser(user);
        return user;
    }

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

Service层一般是我们实现业务逻辑的地方,具体的业务逻辑,还得是你自己进行详细补充,里边包括多种业务逻辑,均是我们作为开发者需要针对具体的业务进行开发。

接下来就是dao层,

Dao层

dao映射接口(可以写成dao,也可以写成mapper)

SQL语句放Java接口中

这是我们将数据库语句和dao层映射接口放一起的情况,但是你有没有发现这其实只适用于简单的SQL,万一我们需要查询复杂的SQL,那么这样的代码在后期维护就会贼困难,所以以下这种方式看看就好

java 复制代码
@Mapper
@Repository
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    void createUser(User user);

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(Long id);
}
SQL语句和Java接口分离
java 复制代码
@Mapper
@Repository
public interface UserMapper {

    List<User> getAllUsers();

    User getUserById(Long id);

    void createUser(User user);

    void updateUser(User user);

    void deleteUser(Long id);
}

数据库语句存放位置:
UserMapper.xml名字和Dao层的一定要对应上,我吃过几次亏了

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.miaow.dao.UserMapper ">
    <resultMap id="BaseResultMap" type="com.miaow.User">
        <result column="id" jdbcType="LONG" property="id"/>
        .....
    </resultMap>

    <sql id="Base_Column_List">
        id....
    </sql>
    <select id="getAllUsers">
   		 select 
            <include refid="Base_Column_List"/>
          from user
	</select>
    
    <insert id="createUser" parameterType="com.miaow.User" useGeneratedKeys="true"
            keyProperty="id">
        insert into user(*,...)
        values (#{*},..)
    </insert>
    
    <select id="getUserById" parameterType="com.miaow.user"
            resultType="com.miaow.user">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <update id="updateUser" parameterType="map">
       UPDATE users
        <set>
            <if test="name  != null">
                name = #{name},
            </if>
            <if test="email  != null">
                email = #{email},
            </if>
        </set>
        WHERE id = #{id}
    </update>
    <delete id="deleteUser">
		DELETE FROM users WHERE id = #{id}
	</delete>
</mapper>

这种方式就可以让SQL存放和接口分离,从而减少我们在开发过程中的代码维护量,并且修改的时候也不至于那么麻烦。

切记,本篇是应对我们在开发过程中的简单的任务,复杂的任务,包括整体的业务逻辑都是我们需要进行考虑的,当然我们还有重要的一点,就是我们需要在我们的启动类中添加相关注解,方便我们的Spring Boot可以标识到我们的Mapper文件。我存放在dao层,或者也可以说Mapper层,这个需要你注意

java 复制代码
@SpringBootApplication
@MapperScan("com.miawo.dao.*")
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication .class, args);
    }
}
相关推荐
中草药z1 分钟前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
m0_7482567820 分钟前
SpringBoot 依赖之Spring Web
前端·spring boot·spring
猿来入此小猿25 分钟前
基于SpringBoot在线音乐系统平台功能实现十二
java·spring boot·后端·毕业设计·音乐系统·音乐平台·毕业源码
愤怒的代码38 分钟前
Spring Boot对访问密钥加解密——HMAC-SHA256
java·spring boot·后端
栗豆包1 小时前
w118共享汽车管理系统
java·spring boot·后端·spring·tomcat·maven
万亿少女的梦1681 小时前
基于Spring Boot的网络购物商城的设计与实现
java·spring boot·后端
深海的鲸同学 luvi1 小时前
【HarmonyOS NEXT】hdc环境变量配置
linux·windows·harmonyos
开心工作室_kaic3 小时前
springboot485基于springboot的宠物健康顾问系统(论文+源码)_kaic
spring boot·后端·宠物
爱码少年7 小时前
springboot中责任链模式之简单应用
spring boot·责任链模式
苹果酱05677 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计