Spring Boot整合MyBatis-Plus简单demo

一、准备

新建Spring Boot项目

1.见文章
Intellij IDEA 2021.3搭建Spring Boot项目
2.引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!--mybatis-plus依赖-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.5.0</version>
    </dependency>
</dependencies>

3.配置application.yml(根据自己的配置调整)

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo
    username: demo
    password: demo
mybatis-plus:
  configuration:
    #控制台打印完整带参数SQL语句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #mapper映射文件路径
  mapper-locations: mapper/**.xml

4.添加@MapperScan

直接在Mapper类上面添加注解@Mapper,这种方式要求每一个Mapper类都需要添加此注解,比较麻烦,所以我们选择在启动类上添加@MapperScan,同时指定要扫描的Mapper类的路径

/**
 * @author zhangz1
 */
@MapperScan("com.zhangz1.springbootdemo.mapper")
@SpringBootApplication
public class SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(SpringBootDemoApplication.class);
        springApplication.run(args);
    }
}

在使用maven等构建工具时,默认会将源码(java文件夹)编译后再加上资源目录(resources文件夹)的文件放到target目录下作为最后运行的文件,xml文件放到java文件夹里,编译时会被maven忽略,因此常采用在resources下新建文件夹,用来存放mapper的xml映射文件。

项目结构:

二、实现

1.数据库表结构:

create table user
(
    id       int(5) auto_increment
        primary key,
    username varchar(10) not null,
    password varchar(20) not null
);

2.给表赋值

例值

`INSERT INTO user (id, username, password) VALUES (1, 'admin', 'admin');`
`INSERT INTO user (id, username, password) VALUES (2, 'zhangz1', 'zhangz1');`
`INSERT INTO user (id, username, password) VALUES (3, 'zhangz1', '123');`

3.实体类UserEntity.java

package com.zhangz1.springbootdemo.domain.entity;

import com.baomidou.mybatisplus.annotation.TableName;

/**
 * @author zhangz1
 * @date 2022/1/24 14:50
 */

@TableName("user")
public class UserEntity {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UserEntity() {
    }

    public UserEntity(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
}

4.数据访问层接口UserMapper.java

Mapper通用CRUD封装BaseMapper接口,自动解析实体表关系映射转换为Mybatis内部对象注入容器

package com.zhangz1.springbootdemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhangz1.springbootdemo.domain.entity.UserEntity;

import java.util.List;

/**
 * @author zhangz1
 * @date 2022/1/24 15:32
 */
public interface UserMapper extends BaseMapper<UserEntity> {
}

5.业务逻辑层Service

接口类UserService.java

通用Service CRUD封装IService接口

package com.zhangz1.springbootdemo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhangz1.springbootdemo.domain.entity.UserEntity;

import java.util.List;

/**
 * @author zhangz1
 * @date 2022/1/22 16:02
 */
public interface UserService extends IService<UserEntity> {
}

实现类UserServiceImpl.java

package com.zhangz1.springbootdemo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhangz1.springbootdemo.domain.entity.UserEntity;
import com.zhangz1.springbootdemo.mapper.UserMapper;
import com.zhangz1.springbootdemo.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author zhangz1
 * @date 2022/1/22 16:03
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {
}

6.控制器UserController.java

package com.zhangz1.springbootdemo.controller;

import com.zhangz1.springbootdemo.domain.entity.UserEntity;
import com.zhangz1.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author zhangz1
 * @date 2022/1/19 16:46
 */
@RestController
@RequestMapping("/user")
public class UserController {

    final
    UserService userService;

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

    @RequestMapping(value = "/getUser")
    public UserEntity getUser(Integer id) {
        return userService.getById(id);
    }

}

三、测试

1.通过ApiPost测试getUser()方法

http://localhost:8080/user/getUser?id=1

image-20220124183408197

输出结果如下:

{
	"id": 1,
	"username": "admin",
	"password": "admin"
}

可以看到,Service、Mapper一个方法都没写的情况下,从表里查出了id为1的信息,省去了MyBatis中xml的sql查询那一步,在官方给出的文档中,可以看到基本上都是基于主键id返回单一实体或实体list。

四、条件构造器QueryWrapper

设计自定义sql语句实现username查询

使用Wrapper构造条件自定义sql子句,官网提供了两种方案,一种是Mapper.java中使用注解,另一种是配置Mapper.xml映射文件,这里使用第二种

1.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.zhangz1.springbootdemo.mapper.UserMapper">

    <select id="getUserByUserName" resultType="com.zhangz1.springbootdemo.domain.entity.UserEntity">
        SELECT *
        FROM user
        where username = #{username}
    </select>
</mapper>

2.UserService.java中添加方法

/**
 * 通过名字查询
 *
 * @param username
 * @return
 */
List<UserEntity> getUserByUserName(String username);

3.UserServiceImpl.java中添加方法

@Override
public List<UserEntity> getUserByUserName(String username) {
    QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
    queryWrapper.lambda().eq(UserEntity::getUsername, username);
    return baseMapper.getUserByUserName(username);
}

4.UserMapper.java中添加方法

/**
 * 通过名字查询
 *
 * @param username
 * @return
 */
List<UserEntity> getUserByUserName(String username);

5.UserController.java中添加HTTP请求

@RequestMapping(value = "/getUserByUserName")
public List<UserEntity> getUserByUserName(String username) {
    return userService.getUserByUserName(username);
}

6.测试getUserByUserName

http://localhost:8080/user/getUserByUserName?username=zhangz1

image-20220124185415648

输出结果如下:

[
	{
		"id": 2,
		"username": "zhangz1",
		"password": "zhangz1"
	},
	{
		"id": 3,
		"username": "zhangz1",
		"password": "123"
	}
]

总结

1、MyBatis-Plus是MyBatis的增强版,在MyBatis的基础上只做增强不做改变;
2、MyBatis-Plus官网的条件构造器一节中提供了eq、ne、like、isNull、having等拼接的方法,使用lambda写法使之简洁有效,单表操作的情况下,使用Mapper和Service封装的CURD方法节约代码量和工作量,详见https://baomidou.com/pages/10c804/#abstractwrapper
3、在多表联合复杂查询的时候就需要在xml文件里写sql语句。

以上就是SpringBoot整合MyBatis-Plus简单demo的学习过程,关于MyBatis-Plus更多操作,后期还需结合官网加以实践,熟练操作。

参考:

MyBatis-Plus

SpringBoot整合mybatis-plus

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhangz1z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值