Spring Boot数据访问篇:整合MyBatis操作数据库

Spring Boot数据访问篇:整合MyBatis操作数据库

在前面的文章中,我们介绍了Spring Boot的基本概念、配置管理等内容。在实际的Web应用开发中,数据访问是一个核心环节。MyBatis作为Java世界中最受欢迎的持久层框架之一,与Spring Boot的整合可以大大简化数据库操作。本文将详细介绍如何在Spring Boot项目中整合MyBatis进行数据访问操作。

MyBatis简介

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。

MyBatis的主要优点包括:

  1. 简单易学,学习成本低
  2. 灵活,SQL写在XML里,便于统一管理和优化
  3. 解除SQL与程序代码的耦合
  4. 提供映射标签,支持对象与数据库的ORM字段关系映射
  5. 提供对象关系映射标签,支持对象关系组件维护

创建Spring Boot项目并添加MyBatis依赖

首先,我们创建一个Spring Boot项目并添加MyBatis相关依赖。在pom.xml中添加以下依赖:

xml 复制代码
    4.0.0

    
        org.springframework.boot
        spring-boot-starter-parent
        2.7.0
        
    

    com.example
    springboot-mybatis-demo
    1.0.0
    springboot-mybatis-demo
    Spring Boot整合MyBatis示例

    
        8
    

    
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.2.2
        

        
        
            mysql
            mysql-connector-java
            runtime
        

        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

配置数据库连接

在application.yml中配置数据库连接信息:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# MyBatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity
  configuration:
    map-underscore-to-camel-case: true

创建实体类

创建一个用户实体类User:

java 复制代码
package com.example.entity;

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

    // 构造方法
    public User() {}

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

    // Getter和Setter方法
    public Long getId() {
        return id;
    }

    public void setId(Long 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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                ", email='" + email + ''' +
                '}';
    }
}

创建Mapper接口

创建UserMapper接口:

java 复制代码
package com.example.mapper;

import com.example.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;

@Mapper
public interface UserMapper {
    
    /**
     * 插入用户
     */
    @Insert("INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    /**
     * 根据ID查询用户
     */
    @Select("SELECT id, name, age, email FROM user WHERE id = #{id}")
    User selectById(Long id);

    /**
     * 查询所有用户
     */
    @Select("SELECT id, name, age, email FROM user")
    List selectAll();

    /**
     * 更新用户信息
     */
    @Update("UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}")
    int update(User user);

    /**
     * 根据ID删除用户
     */
    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(Long id);
}

使用XML配置Mapper

除了使用注解方式,我们也可以使用XML文件来配置Mapper。首先创建UserMapper.xml文件:

xml 复制代码
    
    
    
        
        
        
        
    
    
    
    
        INSERT INTO user(name, age, email) 
        VALUES(#{name}, #{age}, #{email})
    
    
    
    
        SELECT id, name, age, email 
        FROM user 
        WHERE id = #{id}
    
    
    
    
        SELECT id, name, age, email 
        FROM user
    
    
    
    
        UPDATE user 
        SET name = #{name}, age = #{age}, email = #{email} 
        WHERE id = #{id}
    
    
    
    
        DELETE FROM user 
        WHERE id = #{id}
    
    
    
    
        SELECT id, name, age, email 
        FROM user 
        WHERE name LIKE CONCAT('%', #{name}, '%')
    

对应的Mapper接口方法:

java 复制代码
package com.example.mapper;

import com.example.entity.User;
import java.util.List;

@Mapper
public interface UserMapper {
    
    // 注解方式的方法...
    
    // XML方式的方法
    int insertUser(User user);
    User selectUserById(Long id);
    List selectAllUsers();
    int updateUser(User user);
    int deleteUserById(Long id);
    List selectUsersByName(String name);
}

创建Service层

创建UserService接口和实现类:

java 复制代码
package com.example.service;

import com.example.entity.User;
import java.util.List;

public interface UserService {
    User createUser(User user);
    User getUserById(Long id);
    List getAllUsers();
    User updateUser(User user);
    void deleteUserById(Long id);
    List getUsersByName(String name);
}
java 复制代码
package com.example.service.impl;

import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.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 User createUser(User user) {
        userMapper.insert(user);
        return user;
    }
    
    @Override
    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }
    
    @Override
    public List getAllUsers() {
        return userMapper.selectAll();
    }
    
    @Override
    public User updateUser(User user) {
        userMapper.update(user);
        return user;
    }
    
    @Override
    public void deleteUserById(Long id) {
        userMapper.deleteById(id);
    }
    
    @Override
    public List getUsersByName(String name) {
        return userMapper.selectUsersByName(name);
    }
}

创建Controller层

创建UserController:

java 复制代码
package com.example.controller;

import com.example.entity.User;
import com.example.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;
    
    /**
     * 创建用户
     */
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
    
    /**
     * 根据ID获取用户
     */
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }
    
    /**
     * 获取所有用户
     */
    @GetMapping
    public List getAllUsers() {
        return userService.getAllUsers();
    }
    
    /**
     * 更新用户
     */
    @PutMapping
    public User updateUser(@RequestBody User user) {
        return userService.updateUser(user);
    }
    
    /**
     * 删除用户
     */
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUserById(id);
    }
    
    /**
     * 根据名称搜索用户
     */
    @GetMapping("/search")
    public List searchUsers(@RequestParam String name) {
        return userService.getUsersByName(name);
    }
}

创建主应用类

创建Spring Boot主应用类:

java 复制代码
package com.example;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.mapper")
public class SpringBootMyBatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMyBatisApplication.class, args);
    }
}

数据库表结构

创建user表:

sql 复制代码
CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    email VARCHAR(100)
);

测试接口

启动应用后,可以使用以下API进行测试:

  1. 创建用户:

    复制代码
    POST http://localhost:8080/users
    Content-Type: application/json
    
    {
        "name": "张三",
        "age": 25,
        "email": "zhangsan@example.com"
    }
  2. 获取用户:

    复制代码
    GET http://localhost:8080/users/1
  3. 获取所有用户:

    复制代码
    GET http://localhost:8080/users
  4. 更新用户:

    复制代码
    PUT http://localhost:8080/users
    Content-Type: application/json
    
    {
        "id": 1,
        "name": "张三丰",
        "age": 30,
        "email": "zhangsanfeng@example.com"
    }
  5. 删除用户:

    复制代码
    DELETE http://localhost:8080/users/1
  6. 搜索用户:

    复制代码
    GET http://localhost:8080/users/search?name=张

MyBatis高级特性

1. 分页查询

使用PageHelper插件实现分页查询:

添加依赖:

xml 复制代码
    com.github.pagehelper
    pagehelper-spring-boot-starter
    1.4.2

在Service中使用分页:

java 复制代码
@Override
public PageInfo getUsersByPage(int pageNum, int pageSize) {
    PageHelper.startPage(pageNum, pageSize);
    List users = userMapper.selectAll();
    return new PageInfo<>(users);
}

2. 动态SQL

在XML中使用动态SQL:

xml 复制代码
    SELECT id, name, age, email 
    FROM user
    
        
            AND name LIKE CONCAT('%', #{name}, '%')
        
        
            AND age = #{age}
        
    

3. 批量操作

批量插入用户:

xml 复制代码
    INSERT INTO user(name, age, email) VALUES
    
        (#{user.name}, #{user.age}, #{user.email})
    

最佳实践

  1. 使用Mapper接口注解:对于简单的CRUD操作,可以使用注解方式,代码更简洁。

  2. 复杂SQL使用XML:对于复杂的SQL语句,建议使用XML配置,便于维护和优化。

  3. 合理使用事务:在Service层使用@Transactional注解管理事务。

  4. 避免N+1查询问题:合理设计查询,避免循环查询数据库。

  5. SQL优化:注意SQL语句的优化,添加合适的索引。

  6. 连接池配置:合理配置数据库连接池参数。

总结

本文详细介绍了如何在Spring Boot项目中整合MyBatis进行数据访问操作。我们学习了:

  1. MyBatis的基本概念和优势
  2. 如何在Spring Boot中添加MyBatis依赖
  3. 数据库连接配置
  4. 实体类、Mapper接口和XML配置的创建
  5. Service层和Controller层的实现
  6. MyBatis的高级特性和最佳实践

通过整合Spring Boot和MyBatis,我们可以快速构建功能完善的Web应用,同时享受两者带来的便利。在下一篇文章中,我们将介绍如何构建RESTful API。

作者:CSDN博客助手

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。

相关推荐
鳳舞酒天4 小时前
Maven 下载和 Spring Boot 搭建
java·spring boot·maven
银河技术4 小时前
Redis 限流最佳实践:令牌桶与滑动窗口全流程实现
数据库·redis·缓存
小白考证进阶中5 小时前
如何拿到Oracle OCP(Oracle 19c)?
数据库·oracle·dba·开闭原则·ocp认证·oracle认证·oracleocp
I'm Jie5 小时前
Gradle 的项目结构与源码集(Source Sets)详解(Kotlin DSL)
android·java·开发语言·spring boot·spring·kotlin·gradle
IAR Systems5 小时前
使用J-Link Attach NXP S32K3导致对应RAM区域被初始化成0xDEADBEEF
arm开发·数据库·嵌入式软件开发·iar
RestCloud5 小时前
OceanBase 分布式数据库的 ETL 实践:从抽取到实时分析
数据库·分布式·postgresql·oceanbase·etl·数据处理·数据同步
码顺6 小时前
记录一次Oracle日志listener.log文件大小超过4G后出现Tomcat服务启动一直报错的原因【ORACLE】
数据库·oracle·tomcat
一只小透明啊啊啊啊6 小时前
SQL 查询语句的子句的执行顺序
数据库·sql