为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatis Plus项目实战:新手入门教程

标签:
Java 数据库
概述

本文详细介绍了MyBatis Plus项目实战,包括环境搭建、快速入门、高级功能介绍和实战项目演练。通过具体示例展示了MyBatis Plus在项目中的应用,包括基础CRUD操作和高级功能的使用。文中不仅提供了实战项目的编码实现,还详细展示了项目需求分析和分页查询的代码实现,帮助读者更好地理解和掌握MyBatis Plus项目实战。

MyBatis Plus简介
MyBatis Plus是什么

MyBatis Plus是一个MyBatis的增强工具,它在MyBatis的基础上提供了包括CRUD操作、数据库层通用操作、分页操作等在内的大量简化功能,使得开发人员可以更快速地完成数据库操作相关的代码编写。

MyBatis Plus与MyBatis的区别
  • 功能增强:MyBatis Plus在MyBatis的基础上增加了许多功能,如自动填充、逻辑删除、乐观锁、全局数据缓存等,直接减少了开发人员的编码量。
  • 简化操作:MyBatis Plus简化了CRUD操作,提供了很多通用的增强功能,例如在编写数据库查询时,MyBatis Plus提供了一套默认的查询语句和返回值处理方式,而不需要开发人员手动写出SQL语句。
  • 性能优化:MyBatis Plus内置了分页插件、优化查询、插入、更新等操作,提高了系统的性能表现。
MyBatis Plus的核心优势
  1. 强大的CRUD支持:MyBatis Plus提供了大量的简化CRUD操作的方法,如selectByIdupdateByIddeleteById等,可以快速实现数据库的基本操作。
  2. 逻辑删除:支持字段级别的逻辑删除,不需要物理删除数据,同时支持多字段级联逻辑删除。
  3. 乐观锁:支持字段级别的乐观锁,提供了@Version注解。
  4. 全局数据缓存:支持全局的数据缓存,提高了查询性能。
  5. 自定义SQL支持:除了内置的CRUD方法,MyBatis Plus还支持自定义SQL语句。
  6. 分页插件:内置了分页插件,支持多模式的分页。
  7. 自动生成代码:支持自动生成Mapper、Service、Controller等基础代码,极大地方便了项目的快速搭建。
环境搭建
开发环境准备
  • 开发工具:建议使用IntelliJ IDEA或Eclipse等IDE,这里以IntelliJ IDEA为例。
  • 数据库:MySQL 5.7及以上版本或其他支持的数据库。
  • 编程语言:Java 8及以上版本。
  • 构建工具:Maven或Gradle。
Maven依赖配置

在项目的pom.xml文件中添加MyBatis Plus和MyBatis的依赖。

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
</dependencies>
数据库连接设置

在项目的application.properties文件中配置数据库连接信息。

spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
快速入门
创建第一个Mapper接口

定义一个实体类User,该类将映射到数据库表中。

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;

    // getters and setters
}

创建一个Mapper接口UserMapper

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
}
实现基础的CRUD操作

使用UserMapper接口实现基础的CRUD操作。

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
}

在Controller中使用UserService

package com.example.demo.controller;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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;

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

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

    @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);
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.list();
    }
}
使用注解简化代码

使用MyBatis Plus的注解简化代码,例如在实体类中使用@TableId@TableName注解。

@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;

    // getters and setters
}

在Mapper接口中直接继承BaseMapper接口。

public interface UserMapper extends BaseMapper<User> {
}
高级功能介绍
条件构造器的应用

使用QueryWrapperLambdaQueryWrapper进行条件构造。

package com.example.demo.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public List<User> getUsersByName(String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return list(queryWrapper);
    }
}
Lambda表达式的使用

使用Lambda表达式简化条件构造。

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

public List<User> getUsersByName(String name) {
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(User::getName, name);
    return list(queryWrapper);
}
自定义SQL的编写

通过@Select注解编写自定义SQL。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Select;

public interface UserMapper extends BaseMapper<User> {

    @Select("SELECT * FROM user WHERE age > #{age}")
    List<User> getUsersByAgeGreaterThan(Integer age);
}

自定义查询方法可以在Service中调用。

public List<User> getUsersByAgeGreaterThan(Integer age) {
    return userMapper.getUsersByAgeGreaterThan(age);
}
项目实战演练
实战项目需求分析

项目需求

  • 用户管理系统
    • 用户信息的增删改查
    • 分页查询用户列表
    • 根据用户名或邮箱模糊查询用户
数据表设计与建库

假设用户表结构如下:

CREATE TABLE `user` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL,
  `age` INT(11) NOT NULL,
  `email` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
实战项目的编码实现

创建实体类

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;

    // getters and setters
}

创建Mapper接口

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

实现Service

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public List<User> getUsersByName(String name) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(User::getName, name);
        return list(queryWrapper);
    }

    public List<User> getUsersByEmail(String email) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(User::getEmail, email);
        return list(queryWrapper);
    }

    public List<User> getUsersByPage(Integer page, Integer size) {
        Page<User> pagination = new Page<>(page, size);
        return page(pagination);
    }
}

实现Controller

package com.example.demo.controller;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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;

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

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

    @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);
    }

    @GetMapping("/name/{name}")
    public List<User> getUsersByName(@PathVariable String name) {
        return userService.getUsersByName(name);
    }

    @GetMapping("/email/{email}")
    public List<User> getUsersByEmail(@PathVariable String email) {
        return userService.getUsersByEmail(email);
    }

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

    @GetMapping("/page/{page}/{size}")
    public List<User> getUsersByPage(@PathVariable Integer page, @PathVariable Integer size) {
        return userService.getUsersByPage(page, size);
    }
}
常见问题与解决方案
常见错误及解决方法
  • MyBatis Plus找不到Mapper接口:确保Mapper接口继承了BaseMapper接口,并且对应的XML配置正确。
  • 数据库连接失败:检查数据库连接字符串是否正确,数据库是否启动。
性能优化技巧
  • 批量操作:使用batch方法进行批量插入或更新。
  • 缓存:启用二级缓存可以提高查询性能。
  • 分页插件:使用MyBatis Plus的分页插件实现高效的分页查询。
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.plugins.Pagination;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public List<User> getUsersByPage(Integer page, Integer size) {
        Pagination<User> pagination = new Pagination<>(page, size);
        return page(pagination);
    }
}
MyBatis Plus的调试和日志配置

通过调整配置文件中的日志级别,可以启用MyBatis Plus的SQL语句调试。

mybatis-plus.global-config.db-config.log-impl=ConsoleLog
mybatis-plus.global-config.db-config.sql-show=true

以上配置将开启SQL语句的打印,便于调试和分析SQL执行情况。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消