SpringBoot与MyBatis整合实战:从CRUD到动态SQL优化

🎓博主介绍:Java、Python、js全栈开发 “多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。
📖DeepSeek-行业融合之万象视界(附实战案例详解100+)
📖全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)
👉感兴趣的可以先收藏起来,希望帮助更多的人
在这里插入图片描述

SpringBoot与MyBatis整合实战:从CRUD到动态SQL优化

一、引言

在当今的Java开发领域,Spring Boot和MyBatis是两个非常流行的技术框架。Spring Boot以其快速搭建项目、简化配置的特性,极大地提高了开发效率;而MyBatis作为优秀的持久层框架,提供了灵活的SQL映射和执行功能。将Spring Boot与MyBatis进行整合,能够让开发者更加高效地进行数据库操作。本文将带领大家从最基础的CRUD操作开始,逐步深入到动态SQL的优化,帮助大家掌握这一重要的开发技能。

二、项目环境搭建

2.1 创建Spring Boot项目

我们可以使用Spring Initializr(https://start.spring.io/ )来快速创建一个Spring Boot项目。具体步骤如下:

  1. 打开Spring Initializr网站。
  2. 选择项目的基本信息,如项目类型(Maven Project)、语言(Java)、Spring Boot版本等。
  3. 在Dependencies中添加以下依赖:
    • Spring Web:用于构建Web应用。
    • MyBatis Framework:集成MyBatis。
    • MySQL Driver:如果使用MySQL数据库。
  4. 点击“Generate”按钮下载项目压缩包,解压后导入到IDE中。

2.2 配置数据库连接

src/main/resources目录下找到application.properties文件,添加以下数据库连接配置:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

请将your_database_nameyour_usernameyour_password替换为实际的数据库名、用户名和密码。

2.3 配置MyBatis

application.properties中添加MyBatis的相关配置:

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity

其中,mybatis.mapper-locations指定MyBatis映射文件的位置,mybatis.type-aliases-package指定实体类所在的包。

三、实现基本的CRUD操作

3.1 创建实体类

com.example.demo.entity包下创建一个简单的实体类,例如User

package com.example.demo.entity;

public class User {
    private Integer id;
    private String name;
    private Integer age;

    // 构造方法、Getter和Setter方法
    public User() {}

    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

3.2 创建Mapper接口

com.example.demo.mapper包下创建UserMapper接口:

package com.example.demo.mapper;

import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    // 查询所有用户
    List<User> getAllUsers();

    // 根据ID查询用户
    User getUserById(Integer id);

    // 插入用户
    int insertUser(User user);

    // 更新用户信息
    int updateUser(User user);

    // 删除用户
    int deleteUser(Integer id);
}

3.3 创建Mapper XML文件

src/main/resources/mapper目录下创建UserMapper.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.demo.mapper.UserMapper">

    <select id="getAllUsers" resultType="com.example.demo.entity.User">
        SELECT * FROM user
    </select>

    <select id="getUserById" parameterType="int" resultType="com.example.demo.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <insert id="insertUser" parameterType="com.example.demo.entity.User">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>

    <update id="updateUser" parameterType="com.example.demo.entity.User">
        UPDATE user
        SET name = #{name}, age = #{age}
        WHERE id = #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

3.4 创建Service层

com.example.demo.service包下创建UserService接口和UserServiceImpl实现类:

package com.example.demo.service;

import com.example.demo.entity.User;

import java.util.List;

public interface UserService {
    List<User> getAllUsers();
    User getUserById(Integer id);
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(Integer id);
}
package com.example.demo.service.impl;

import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

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

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

    @Override
    public int insertUser(User user) {
        return userMapper.insertUser(user);
    }

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

    @Override
    public int deleteUser(Integer id) {
        return userMapper.deleteUser(id);
    }
}

3.5 创建Controller层

com.example.demo.controller包下创建UserController

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

    @Autowired
    private UserService userService;

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

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

    @PostMapping
    public int insertUser(@RequestBody User user) {
        return userService.insertUser(user);
    }

    @PutMapping
    public int updateUser(@RequestBody User user) {
        return userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public int deleteUser(@PathVariable Integer id) {
        return userService.deleteUser(id);
    }
}

四、动态SQL优化

4.1 动态SQL简介

动态SQL是MyBatis的强大特性之一,它允许我们根据不同的条件动态地生成SQL语句。常见的动态SQL标签有<if><choose><when><otherwise><where><set><foreach>等。

4.2 使用<if>标签实现条件查询

假设我们要根据用户的姓名和年龄进行条件查询,修改UserMapper.xml文件:

<select id="getUsersByCondition" parameterType="com.example.demo.entity.User" resultType="com.example.demo.entity.User">
    SELECT * FROM user
    WHERE 1 = 1
    <if test="name != null and name != ''">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
</select>

同时,在UserMapper接口中添加对应的方法:

List<User> getUsersByCondition(User user);

UserServiceUserServiceImpl中添加相应的方法,在UserController中添加对应的接口。

4.3 使用<choose><when><otherwise>标签实现多条件选择

如果我们希望根据不同的条件选择不同的查询语句,可以使用<choose><when><otherwise>标签:

<select id="getUsersByChoose" parameterType="com.example.demo.entity.User" resultType="com.example.demo.entity.User">
    SELECT * FROM user
    WHERE 1 = 1
    <choose>
        <when test="name != null and name != ''">
            AND name = #{name}
        </when>
        <when test="age != null">
            AND age = #{age}
        </when>
        <otherwise>
            AND 1 = 2
        </otherwise>
    </choose>
</select>

同样,在UserMapperUserServiceUserServiceImplUserController中添加相应的方法和接口。

4.4 使用<foreach>标签实现批量操作

如果我们要实现批量插入或删除操作,可以使用<foreach>标签。以下是批量插入的示例:

<insert id="batchInsertUsers" parameterType="java.util.List">
    INSERT INTO user (name, age)
    VALUES
    <foreach collection="list" item="user" separator=",">
        (#{user.name}, #{user.age})
    </foreach>
</insert>

UserMapper接口中添加方法:

int batchInsertUsers(List<User> users);

UserServiceUserServiceImplUserController中添加相应的方法和接口。

五、总结

通过本文的学习,我们完成了Spring Boot与MyBatis的整合,并实现了基本的CRUD操作。同时,我们深入了解了MyBatis的动态SQL特性,学会了使用<if><choose><when><otherwise><foreach>等标签来优化SQL语句。动态SQL能够让我们的代码更加灵活,提高开发效率。在实际项目中,我们可以根据具体需求灵活运用这些技术,构建高效、稳定的数据库操作层。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fanxbl957

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

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

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

打赏作者

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

抵扣说明:

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

余额充值