sql包含语句怎么写_有了这个,SQL语句都不用写了

769ec367a02afc3b2d070f4b58bfe3e6.png

  • 本次源码已放在Github:https://github.com/nateshao/MyBatis-Plus
  • 个人博客

    • https://nateshao.gitee.io

    • https://nateshao.github.io

简介

  MyBatis-Puls在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

国产的开源框架,基于 MyBatis,功能有点类似JPA,Hibernate

核心功能就是简化 MyBatis 的开发,提高效率。

MyBatis-Plus快速上手

本次是采用SpringBoot开发,所以前提你是要会熟悉 Spring Boot熟悉 Maven,关于Spring boot入门可以看我之前的文章哦

Spring Boot(2.3.1) + MyBatis Plus(国产的开源框架,并没有接入到 Spring 官方孵化器中)所以新建工程没有看到MyBatis Plus的选项。

1、创建  Spring Initializer 创建Spring Boot工程,勾选lombok,MySQL-Driver,SpringWeb,Thymeleaf

5a06ad7430299adb0c1d9885813c7a79.png

2、pom.xml 引入 MyBatis Plus 的依赖

<dependency>

<groupId>com.baomidougroupId>

<artifactId>mybatis-plus-boot-starterartifactId>

<version>3.3.1version>

dependency>

3、创建实体类

package com.stj.entity;

import lombok.Data;

/**

* @author shaotongjie

* @date 2020/6/18 21:11

*/

@Data

public class User {

private Integer id;

private String name;

private Integer age;

}

4、创建 Mapper 接口

package com.stj.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.stj.entity.User;

/**

* @author shaotongjie

* @date 2020/6/18 21:14

*/

public interface UserMapper extends BaseMapper<User> {

}

5、application.yml

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

username: root

password: 123456

mybatis-plus:

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

6、启动类需要添加 @MapperScan(“mapper所在的包”),否则无法加载 Mppaer bean。

package com.stj;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@MapperScan("com.stj.mapper") //一定要加@MapperScan()

public class MybatisplusApplication {

public static void main(String[] args) {

SpringApplication.run(MybatisplusApplication.class, args);

}

}

7、测试 (在UserMapper接口上goto新建UserMapperTest测试类)

package com.stj.mapper;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

/**

* @author shaotongjie

* @date 2020/6/18 22:31

*/

@SpringBootTest

class UserMapperTest {

@Autowired

private UserMapper userMapper;

@Test

void test() {

userMapper.selectList(null).forEach(System.out::println);

}

}

运行结果:

bf6a48744e81a2db77321b50f0dccc7c.png

小结

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。

常用注解

TableName

映射数据库的表名

package com.stj.entity;

import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

/**

* @author shaotongjie

* @date 2020/6/21 23:06

*/

@Data

@TableName(value = "user")

public class Persion { //当这个实体类与表名不一致时!!

private Integer id;

private String name;

private Integer age;

}

TableId

设置主键映射,value 映射主键字段名

type 设置主键类型,主键的生成策略,

AUTO(0),

NONE(1),

INPUT(2),

ASSIGN_ID(3),

ASSIGN_UUID(4),

下面三个被替换掉了,不常用

/** @deprecated */

@Deprecated

ID_WORKER(3),

/** @deprecated */

@Deprecated

ID_WORKER_STR(3),

/** @deprecated */

@Deprecated

UUID(4);

描述
AUTO数据库自增
NONEMP set 主键,雪花算法实现
INPUT需要开发者手动赋值
ASSIGN_IDMP 分配 ID,Long、Integer、String
ASSIGN_UUID分配 UUID,Strinig

INPUT 如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值,如果开发者手动赋值,则存入该值。

AUTO 默认就是数据库自增,开发者无需赋值。

ASSIGN_ID MP 自动赋值,雪花算法。

ASSIGN_UUID 主键的数据类型必须是 String,自动生成 UUID 进行赋值

TableField

映射非主键字段,value 映射字段名

exist 表示是否为数据库字段 false,如果实体类中的成员变量在数据库中没有对应的字段,则可以使用 exist,VO、DTO

select 表示是否查询该字段

fill 表示是否自动填充,将对象存入数据库的时候,由 MyBatis Plus 自动给某些字段赋值,create_time、update_time

1、给表添加 create_time、update_time 字段

2、实体类中添加成员变量

package com.stj.entity;

import com.baomidou.mybatisplus.annotation.*;

import lombok.Data;

import java.util.Date;

/**

* @author shaotongjie

* @date 2020/6/18 21:11

*/

@Data

@TableName(value = "user")

public class User {

@TableId //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private Integer age;

@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

// @TableField(exist = false)

// private String gender;

}

3、创建自动填充处理器

package com.stj.hander;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import org.apache.ibatis.reflection.MetaObject;

import org.springframework.stereotype.Component;

import java.util.Date;

/**

* @author shaotongjie

* @date 2020/6/19 10:19

*/

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

this.setFieldValByName("createTime",new Date(),metaObject);

this.setFieldValByName("updateTime",new Date(),metaObject);

}

@Override

public void updateFill(MetaObject metaObject) {

this.setFieldValByName("updateTime",new Date(),metaObject);

}

}

Version

标记乐观锁,通过 version 字段来保证数据的安全性,当修改数据的时候,会以 version 作为条件,当条件成立的时候才会修改成功。

version = 2

线程 1:update … set version = 2 where version = 1

线程2 :update … set version = 2 where version = 1

1、数据库表添加 version 字段,默认值为 1

2、实体类添加 version 成员变量,并且添加 @Version

package com.stj.entity;

import com.baomidou.mybatisplus.annotation.*;

import com.stj.enums.AgeEnums;

import com.stj.enums.StatusEnums;

import lombok.Data;

import java.util.Date;

/**

* @author shaotongjie

* @date 2020/6/18 21:11

*/

@Data

@TableName(value = "user")

public class User {

@TableId //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private AgeEnums age;

@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

// @TableField(exist = false)

// private String gender;

@Version

private Integer version;

}

3、注册配置类

package com.stj.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

* @author shaotongjie

* @date 2020/6/19 11:39

*/

@Configuration

public class MybatisPlusConfig {

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor(){

return new OptimisticLockerInterceptor();

}

}

EnumValue

1、通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

package com.stj.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

/**

* @author shaotongjie

* @date 2020/6/19 11:50

*/

public enum StatusEnums {

WORK(1,"上班"),

REST(0,"休息");

StatusEnums(Integer code, String msg) {

this.code = code;

this.msg = msg;

}

@EnumValue

private Integer code;

private String msg;

}

package com.stj.entity;

import com.baomidou.mybatisplus.annotation.*;

import com.stj.enums.AgeEnums;

import com.stj.enums.StatusEnums;

import lombok.Data;

import java.util.Date;

/**

* @author shaotongjie

* @date 2020/6/18 21:11

*/

@Data

@TableName(value = "user")

public class User {

@TableId //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private AgeEnums age;

@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

// @TableField(exist = false)

// private String gender;

@Version

private Integer version;

private StatusEnums status;

}

application.yml

type-enums-package:

com.stj.enums

2、实现接口

package com.stj.enums;

import com.baomidou.mybatisplus.core.enums.IEnum;

import org.thymeleaf.engine.IElementDefinitionsAware;

/**

* @author shaotongjie

* @date 2020/6/19 12:08

*/

public enum AgeEnums implements IEnum {

ONE(1,"一岁"),

TWO(2,"两岁"),

THREE(3,"三岁");

private Integer code;

private String msg;

AgeEnums(Integer code, String msg) {

this.code = code;

this.msg = msg;

}

@Override

public Integer getValue() {

return this.code;

}

}

TableLogic

映射逻辑删除 数据表虽存在,但是查不出来。

1、数据表添加 deleted 字段

2、实体类添加注解

package com.stj.entity;

import com.baomidou.mybatisplus.annotation.*;

import com.stj.enums.AgeEnums;

import com.stj.enums.StatusEnums;

import lombok.Data;

import java.util.Date;

/**

* @author shaotongjie

* @date 2020/6/18 21:11

*/

@Data

@TableName(value = "user")

public class User {

@TableId //(type = IdType.ASSIGN_ID)

private Long id;

@TableField(value = "name",select = false)

private String name;

private AgeEnums age;

@TableField(fill = FieldFill.DEFAULT)

private Date createTime;

@TableField(fill = FieldFill.UPDATE)

private Date updateTime;

// @TableField(exist = false)

// private String gender;

@Version

private Integer version;

private StatusEnums status;

@TableLogic //逻辑删除

private Integer deleted;

}

3、application.yml 添加配置

global-config:

db-config:

logic-not-delete-value: 0

logic-delete-value: 1

查询

//mapper.selectList(null); 不加任何条件全部查询

QueryWrapper wrapper = new QueryWrapper();

// Map map = new HashMap<>();

// map.put("name","小红");

// map.put("age",3);

// wrapper.allEq(map); 所有

// wrapper.gt("age",2); 大于

// wrapper.ne("name","小红"); 不等于

// wrapper.ge("age",2); 大于等于

模糊查询

//like '%小'

// wrapper.likeLeft("name","小");

//like '小%'

// wrapper.likeRight("name","小");

//inSQL 嵌套查询

// wrapper.inSql("id","select id from user where id < 10");

// wrapper.inSql("age","select age from user where age > 3");

// wrapper.orderByDesc("age"); 降序

// wrapper.orderByAsc("age"); 升序

// wrapper.having("id > 8");

mapper.selectList(wrapper).forEach(System.out::println);

// System.out.println(mapper.selectById(7));

// mapper.selectBatchIds(Arrays.asList(7,8,9)).forEach(System.out::println);

//Map 只能做等值判断,逻辑判断需要使用 Wrapper 来处理

// Map map = new HashMap<>();

// map.put("id",7);

// mapper.selectByMap(map).forEach(System.out::println);

QueryWrapper wrapper = new QueryWrapper();

wrapper.eq("id",7);

System.out.println(mapper.selectCount(wrapper));

//

// //将查询的结果集封装到Map中

// mapper.selectMaps(wrapper).forEach(System.out::println);

// System.out.println("-------------------");

// mapper.selectList(wrapper).forEach(System.out::println);

//分页查询

// Page page = new Page<>(2,2);

// Page result = mapper.selectPage(page,null);

// System.out.println(result.getSize());

// System.out.println(result.getTotal());

// result.getRecords().forEach(System.out::println);

// Page> page = new Page<>(1,2);

// mapper.selectMapsPage(page,null).getRecords().forEach(System.out::println);

// mapper.selectObjs(null).forEach(System.out::println);

System.out.println(mapper.selectOne(wrapper));

自定义SQL(多表关联查询)

package com.stj.mybatisplus.entity;

import lombok.Data;

@Data

public class ProductVO {

private Integer category;

private Integer count;

private String description;

private Integer userId;

private String userName;

}

package com.stj.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.southwind.mybatisplus.entity.ProductVO;

import com.southwind.mybatisplus.entity.User;

import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper extends BaseMapper<User> {

@Select("select p.*,u.name userName from product p,user u where p.user_id = u.id and u.id = #{id}")

ListproductList(Integer id);

}

添加

User user = new User();

user.setTitle("小明");

user.setAge(22);

mapper.insert(user);

System.out.println(user);

删除

//mapper.deleteById(1);

// mapper.deleteBatchIds(Arrays.asList(7,8));

// QueryWrapper wrapper = new QueryWrapper();

// wrapper.eq("age",14);

// mapper.delete(wrapper);

Map map = new HashMap<>();

map.put("id",10);

mapper.deleteByMap(map);

修改

// //update ... version = 3 where version = 2

// User user = mapper.selectById(7);

// user.setTitle("一号");

//

// //update ... version = 3 where version = 2

// User user1 = mapper.selectById(7);

// user1.setTitle("二号");

//

// mapper.updateById(user1);

// mapper.updateById(user);

User user = mapper.selectById(1);

user.setTitle("小红");

QueryWrapper wrapper = new QueryWrapper();

wrapper.eq("age",22);

mapper.update(user,wrapper);

MyBatis-Plus自动生成

根据数据表自动生成实体类、Mapper、Service、ServiceImpl、Controller

1、pom.xml 导入 MyBatis Plus Generator

<dependency>

<groupId>com.baomidougroupId>

<artifactId>mybatis-plus-generatorartifactId>

<version>3.3.1version>

dependency>

<dependency>

<groupId>org.apache.velocitygroupId>

<artifactId>velocityartifactId>

<version>1.7version>

dependency>

Velocity(默认)、Freemarker、Beetl

2、启动类

package com.stj.mybatisplus;

import com.baomidou.mybatisplus.annotation.DbType;

import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.config.DataSourceConfig;

import com.baomidou.mybatisplus.generator.config.GlobalConfig;

import com.baomidou.mybatisplus.generator.config.PackageConfig;

import com.baomidou.mybatisplus.generator.config.StrategyConfig;

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class Main {

public static void main(String[] args) {

//创建generator对象

AutoGenerator autoGenerator = new AutoGenerator();

//数据源

DataSourceConfig dataSourceConfig = new DataSourceConfig();

dataSourceConfig.setDbType(DbType.MYSQL);

dataSourceConfig.setUrl("jdbc:mysql://ip:3306/db?useUnicode=true&characterEncoding=UTF-8");

dataSourceConfig.setUsername("root");

dataSourceConfig.setPassword("root");

dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");

autoGenerator.setDataSource(dataSourceConfig);

//全局配置

GlobalConfig globalConfig = new GlobalConfig();

globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");

globalConfig.setOpen(false);

globalConfig.setAuthor("southwind");

globalConfig.setServiceName("%sService");

autoGenerator.setGlobalConfig(globalConfig);

//包信息

PackageConfig packageConfig = new PackageConfig();

packageConfig.setParent("com.southwind.mybatisplus");

packageConfig.setModuleName("generator");

packageConfig.setController("controller");

packageConfig.setService("service");

packageConfig.setServiceImpl("service.impl");

packageConfig.setMapper("mapper");

packageConfig.setEntity("entity");

autoGenerator.setPackageInfo(packageConfig);

//配置策略

StrategyConfig strategyConfig = new StrategyConfig();

strategyConfig.setEntityLombokModel(true);

strategyConfig.setNaming(NamingStrategy.underline_to_camel);

strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);

autoGenerator.setStrategy(strategyConfig);

autoGenerator.execute();

}

}

运行成功之后,会发现有Mapper、Service、ServiceImpl、Controller..等都帮你创建了。

769ec367a02afc3b2d070f4b58bfe3e6.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值