码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis-plus

时间:2020-05-17 21:45:04      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:prim   arraylist   spl   leo   prefix   代码生成器   rgs   start   父类   

1.简介

官网:https://mp.baomidou.com

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

2.入门

2.1数据库准备

使用mysql数据库创建数据,执行脚本如下:

create database test;
use test;

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT 主键ID,
    name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,
    age INT(11) NULL DEFAULT NULL COMMENT 年龄,
    email VARCHAR(50) NULL DEFAULT NULL COMMENT 邮箱,
    PRIMARY KEY (id)
);
DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, Jone, 18, test1@baomidou.com),
(2, Jack, 20, test2@baomidou.com),
(3, Tom, 28, test3@baomidou.com),
(4, Sandy, 21, test4@baomidou.com),
(5, Billie, 24, test5@baomidou.com);

2.2环境搭建

1)新建一个SpringBoot的项目,导入依赖

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mysql数据库依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>

2)yml配置

#数据源配置
spring:
  datasource:
    #使用阿里巴巴的druid
    type: com.alibaba.druid.pool.DruidDataSource
    #配置数据库的路径和用户名密码
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true
    username: root
    password: 123456

2.3引入mybatis-plus开发

1)导入依赖

      <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>

2)创建实体类

package com.zys.mybatisplusdemo.entity;

import lombok.Data;

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private String aaa;
}

3)创建dao继承BaseMapper

package com.zys.mybatisplusdemo.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zys.mybatisplusdemo.entity.User;

public interface UserDao extends BaseMapper<User> {

}

4)在启动类上加mapper扫描

@SpringBootApplication
@MapperScan("com.zys.mybatisplusdemo.dao")
public class MybatisPlusDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusDemoApplication.class, args);
    }

}

5)创建controller

package com.zys.mybatisplusdemo.controller;

import com.zys.mybatisplusdemo.dao.UserDao;
import com.zys.mybatisplusdemo.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Aauthor yushizhong
 * @Date 2020/5/17 10:19
 * @Dec
 */
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserDao userDao;

    @GetMapping("/list")
    public List<User> userList(){
        List<User> users = userDao.selectList(null);
        return  users;
    }

}

6)测试

启动项目,访问http://localhost:8080/users/list即可看到所有的数据。

3.常用注解

3.1@TableName

其用来将实体对象与数据库表名进行对应。当实体名与数据库表名不一致时使用。

3.2@TableId

其是主键注解,指明是主键,默认把id作为主键。属性type用来指定类型,值为IdType.AUTO是自动增长;IdType.ASSIGN_UUID是uuid,要使用接口IdentifierGenerator的方法nextUUID.

3.3@TableField

其是表的其他字段注解。属性exist用来指明是否是数据库的字段,值为false时不映射数据库表字段。

3.4注解开发

1)首先将数据库中表名改为t_user,然后实体User加上注解@TableName

@Data
@TableName(value = "t_user")
public class User {
     ......      
}

启动项目,访问http://localhost:8080/users/list可以正常返回数据。

2)将数据库中表t_user的字段id改为t_id,然后修改实体User的属性id并设置自动增长

@Data
@TableName(value = "t_user")
public class User {
    //指定自动增长
    @TableId(value = "t_id",type = IdType.AUTO)
    private Long id;
    ......
}

3)将数据表t_user的字段name改为t_name,然后修改实体User的属性name

 @TableField(value = "t_name")
    private String name;

4)在实体User上添加一个属性,设置不作为数据库的字段

 //不映射数据库表字段
    @TableField(exist = false)
    private String aaa;

启动项目,同上进行访问,数据正常返回。在实际开发过程中,可根据需求使用注解。

4.条件构造器

方法 说明 示例
eq 等于

allEq({id:1,name:"老王",age:null})--->

id = 1 and name = ‘老王‘ and age is null

allEq 全等于 eq("name", "老王")--->name = ‘老王‘
ne 不等于 ne("name", "老王")--->name <> ‘老王‘
gt 大于 gt("age", 18)--->age > 18
ge 大于等于 ge("age", 18)--->age >= 18
lt 小于 lt("age", 18)--->age < 18
le 小于等于 le("age", 18)--->age <= 18
between BETWEEN 值1 AND 值2 between("age", 18, 30)--->age between 18 and 30
notBetween NOT BETWEEN 值1 AND 值2 notBetween("age", 18, 30)--->age not between 18 and 30
like LIKE ‘%值%‘ like("name", "王")--->name like ‘%王%‘
notLike NOT LIKE ‘%值%‘ notLike("name", "王")--->name not like ‘%王%‘
likeLeft LIKE ‘%值‘ likeLeft("name", "王")--->name like ‘%王‘
likeRight LIKE ‘值%‘ likeRight("name", "王")--->name like ‘王%‘
isNull 字段为null isNull("name")--->name is null
isNotNull 字段不为null isNotNull("name")--->name is not null
in 同数据库in in("age",{1,2,3})--->age in (1,2,3)
notIn 同数据库not in notIn("age",{1,2,3})--->age not in (1,2,3)
inSql 相当于子查询和in

inSql("id", "select id from table where id < 3")--->

id in (select id from table where id < 3)

notInSql 相当于子查询和not in

notInSql("id", "select id from table where id < 3")--->

id not in (select id from table where id < 3)

groupBy 同数据库group by groupBy("id", "name")--->group by id,name
orderBy/orderByDesc 同数据库order by 字段/order by  字段 desc orderBy("id")--->order by id ASC
having 同数据库having having("sum(age) > 10")--->having sum(age) > 10
or/and 同数据库or/and 略 
netsted 正常嵌套 不带 AND 或者 OR nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = ‘李白‘ and status <> ‘活着‘)
apply 字符串拼接

apply("date_format(dateColumn,‘%Y-%m-%d‘) = {0}", "2008-08-08")--->

date_format(dateColumn,‘%Y-%m-%d‘) = ‘2008-08-08‘")

last 拼接在最后,谨慎使用 last("limit 1")---> limit 1
exists/notExists 拼接sql exists("select id from table where age = 1")--->exists (select id from table where age = 1)
select 指定要查询的字段 select("id", "name", "age")--->只查询这三个字段的内容
set 全局修改 set("name", "")--->数据库字段值变为空字符串

 

5.CRUD

只进行简单的介绍,具体需求请自行查看文档。

5.1添加insert

    @PostMapping("/")
    public String save(User user){
        int count = userDao.insert(user);
        if(count!=0){
            return "添加成功";
        }else{
            return "添加失败";
        }
    }

5.2删除delete

根据主键删除

  @DeleteMapping("/{id}")
    public String delete(@PathVariable("id")long id){
        int count = userDao.deleteById(id);
        if(count!=0){
            return "删除成功";
        }else{
            return "删除失败";
        }
    }

5.3修改update

根据id进行修改

@PutMapping("/")
    public String update(User user){
        int count = userDao.updateById(user);
        if(count!=0){
            return "修改成功";
        }else{
            return "修改失败";
        }
    }

5.4简单查询

5.4.1selectList

在入门时,controller中设置的查询条件是null,实际上里面需要传递一个QueryWrapper<T>类型的对象,调用dao的selectList(),此对象中才有上面的那些方法。

1)查询年龄大于等于24的信息

    @GetMapping("/list")
    public List<User> userList(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        //设置查询条件
        queryWrapper.ge("age",24);//查询年龄大于等于24的信息
        List<User> users = userDao.selectList(queryWrapper);
        return  users;
    }

2)查询名字中含有‘o’的信息

queryWrapper.like("name","o");

5.4.2selectById

根据主键查询

 @GetMapping("/{id}")
    public User selectById(@PathVariable("id")long id){
        return userDao.selectById(id);
    }

5.4.3selectCount

查询符合条件的条数,一般和selectList结合使用。

 @GetMapping("/list")
    public Map<String,Object> userList(){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        //设置查询条件
        queryWrapper.like("name","o");
        List<User> users = userDao.selectList(queryWrapper);
        Integer integer = userDao.selectCount(queryWrapper);
        Map<String,Object> map=new HashMap<>();
        map.put("data",users);
        map.put("total",integer);
        return  map;
    }

5.5分页查询

目前分页插件仅支持单表查询。

1)分页插件配置

package com.zys.mybatisplusdemo.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @Aauthor yushizhong
 * @Date 2020/5/17 16:19
 * @Dec MybatisPlus分页配置
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.zys.mybatisplusdemo.dao")
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}

2)接口使用分页

@GetMapping("/list")
    public IPage<User> userList(Integer curr,Integer limit){
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        //设置分页,默认值是1,10
        IPage<User> page=new Page<>(curr,limit);
        IPage<User> user = userDao.selectPage(page, queryWrapper);
        return  user;
    }

6.代码生成器

代码生成器自动生成包及需要的类名,节省开发的时间。前提是数据库中表已经建好,原因是它根据数据库表进行创建的。

首先导入依赖

     <!--mybatis-plus代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>

然后执行main方法

package com.zys.mybatisplusdemo.config;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;

/**
 * @Aauthor yushizhong
 * @Date 2020/5/17 16:45
 * @Dec 代码生成器
 */
public class CodeGenerator {

    public static void main(String[] args) {

        // 代码生成器
        AutoGenerator map = new AutoGenerator();

        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        //配置生成文件的输出目录
        globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
        //设置开发人员名称
        globalConfig.setAuthor("yushizhong");
        //是否打开输出目录
        globalConfig.setOpen(false);
        //mapper 命名方式
        globalConfig.setMapperName("%sDao");
        //service 命名方式
        globalConfig.setServiceName("%sService");
        map.setGlobalConfig(globalConfig);

        //数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        //数据库的路径
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=CTT");
        //数据库驱动名称
        dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
        //数据库的登录用户名
        dataSourceConfig.setUsername("root");
        //数据库的登录密码
        dataSourceConfig.setPassword("123456");
        map.setDataSource(dataSourceConfig);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //设置父包名
        pc.setParent("com.zys.mybatisplusdemo");
        pc.setMapper("dao");
        map.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
            }
        };
        String templatePath = "/templates/mapper.xml.vm";
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                //设置xml的输出路径
                return System.getProperty("user.dir") + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        map.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        //在代码总不生成xml
        templateConfig.setXml(null);
        map.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //数据库表映射到实体的命名策略:把下划线变成大写
        strategy.setNaming(NamingStrategy.underline_to_camel);
        //数据库表字段映射到实体的命名策略:把下划线变成大写
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //是否使用lombok
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 写于父类中的公共字段
        strategy.setSuperEntityColumns("id");
        strategy.setControllerMappingHyphenStyle(true);
        //表前缀
        strategy.setTablePrefix(pc.getModuleName() + "_");
        map.setStrategy(strategy);

        //执行
        map.execute();
    }


}

 

Mybatis-plus

标签:prim   arraylist   spl   leo   prefix   代码生成器   rgs   start   父类   

原文地址:https://www.cnblogs.com/zys2019/p/12904848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!