Mybaits Plus

283 阅读8分钟

1.创建spring boot项目

image.png

image.png

image.png

com.southwind image.png

image.png

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

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-

starter</artifactId>

<version>3.3.1.tmp</version>

</dependency>

image.png

image.png

3.配置数据源链接数据库(文件后缀.yml)

spring: datasource: url: jdbc:mysql://localhost:3306/mybaits?useUnicode=true&characterEncoding=UTF-8 username: fzp password: 123456

image.png

4.创建实体类,包entity,类名user

image.png

image.png

image.png

5.注解

@Data //类里的get和set方法不用写

image.png

image.png

@TableName //映射数据库的表名

   当实体类与数据库表明不一致时,需要@TableName注解的value属性来映射
   

image.png

@TableId //主键使用

value属性

image.png

type属性 //设置主键类型,主键生成策略

image.png image.png

@TableFieId //映射到字段,除了主键之外的其他字段

value属性: 变量跟表里的字段不一样时需要映射

image.png

exist表示是否为数据库字段,
   如果实体类中的成员变量在数据库中没有对应的字段,则可以使用exist,
   VO和DTO用的比较多,vo就是把多个实体类里面的变量取出来封装,根据需求传给 前端,

image.png

select表示是否查询该字段
fill创建时间修改时间自动填充,保存到数据库

image.png

@TableField(fill = FieldFill.INSERT) //创建时间
private Date createTime;  //数据库不支持驼峰命名,但是会自动转为下划线格式
@TableField(fill = FieldFill.INSERT_UPDATE) //第一次创建的时间,后面跟新就会修改时间
private  Date updateTime;

image.png

package com.southwind1.mybaitsplus1.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

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

image.png

image.png

@Version 乐观锁:处理高并发的一种解决方案

乐观锁:处理高并发的一种解决方案,防止数据被重复修改,通过version字段来保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候才会修改成功

image.png

image.png

package com.southwind1.mybaitsplus1.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    @Bean
   public OptimisticLockerInterceptor optimisticLockerInterceptor(){
       return  new OptimisticLockerInterceptor();
   }
}

image.png

@EnumValue 通用枚举类注解

** 有些字段,例如性别、婚姻状况、等标志性字段,在数据库中存放的形式往往是数字,0 或者 1,这样做的好处是存取的效率高节省空间,但是前端的在展示的时候不能直接展示,需要进行一个判断,但是判断逻辑放在前端不妥,所以后端应该提前将值转换好返回该前端。** 在 Mybatis-Plus 中我们可以使用枚举类型来完成这一操作,他能自动将数据库里的字段映射成我们需要的字段,例如性别,新建枚举类如下:

package com.southwind1.mybaitsplus1.enums;


import com.baomidou.mybatisplus.annotation.EnumValue;

import com.fasterxml.jackson.annotation.JsonValue;



public enum StatusEnum {
    WOMEN(0, "女"),
    MAN(1, "男");

    @EnumValue
    private Integer key;

    @JsonValue
    private String name;

    StatusEnum(Integer key, String name) {
        this.key = key;
        this.name = name;
    }

    @Override
    public String toString() {
        return this.name;
    }

}

image.png

image.png 其中最关键的是 @EnumValue 注解,他是标注数据库里存的字段,这里数据库里存的是 key@JsonValue 标注的是要展示的字段,这里我们想展示给前端的是 name 字段,同时要重写 toString 方法为我们想要的,因为系统会自动调用该方法作为前端的展示值,这里想要展示 name,所以直接返回它就行了。

关键点:

  • @EnumValue:标注哪一个字段是数据库里的字段;
  • @JsonValue:标注要开启自定义序列化返回值;
  • toString:具体的返回值;

同时我们需要在与数据库关联的实体类中修改类型,将性别字段改为枚举类型:

image.png 在配置文件yml中配置扫描注解类型:

EnumOrdinalTypeHandler:type-enums-package: com.southwind1.mybaitsplus1.enums
default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler

image.png

image.png

@TableLogic逻辑删除

image.png

image.png

image.png

6.创建Mapper接口(对实体类进行操作,把实体类操作结果映射到数据库)

image.png

image.png

7.创建测试类

image.png

image.png

image.png

image.png

8出现bug的问题

image.png

9.插入数据主键id设置

使用@TableId(type = IdType.AUTO),数据库自增方式

image.png

image.png

使用默认的雪花算法方式

image.png

image.png

10增删改查

查询

selectList

不加条件全部查询 image.png

eq单条件查询
QueryWrapper wrapper =  new QueryWrapper();
wrapper.eq("name","科比");
System.out.println(mapper.selectList(wrapper));

image.png

allEq 多条件查询
QueryWrapper wrapper =  new QueryWrapper();
Map<String,Object> map = new HashMap<>();
map.put("name","科比");
map.put("age","3");
wrapper.allEq(map);
System.out.println(mapper.selectList(wrapper));

image.png

gt大于

image.png

lt小于

image.png

ne不等于

image.png

ge大于等于

image.png

like模糊查询,可查询字段单个值

image.png

likeLeft和likeRight

image.png

inSql

image.png

升序或者降序

image.png

降序添加查询条件

image.png

单id或者多id查询
System.out.println(mapper.selectById(8));
mapper.selectBatchIds(Arrays.asList(8,7)).forEach(System.out::println);

image.png

selectCount返回总条数(符合该条件有多少条数据
QueryWrapper wrapper =  new QueryWrapper();
wrapper.gt("id",1);
System.out.println(mapper.selectCount(wrapper));

image.png

image.png

分页

image.png

image.png

selectMapsPage (map集合分页)

image.png

自定义SQL,多表关联和VO实现多表关联查询

VO:在开发中只用到多表的个别字段,并不会用到表里的全部字段,可以使用VO,然后传给前端,这样不会造成资源浪费

DTO和VO的区别:DTO是把数据库映射成对象(业务层),VO是把对象传给前端用来展示的(视图层) image.png

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

image.png

image.png

image.png

image.png

添加

image.png

删除

单个id删除

image.png

多个id删除

image.png

多条件删除

image.png

使用map集合多条件删除

image.png

修改

通过id单条件修改

image.png

多条件修改

image.png

自动生成

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.2</version>
</dependency>

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>

image.png

package com.southwind;

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 GenerateTest {
    public static void main(String[] args) {
        //创建generator对象
        AutoGenerator autoGenerator = new AutoGenerator();
        //数据源
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL);
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername("fzp1");   //数据库表名
        dataSourceConfig.setPassword("123456"); //表代码
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybaits");  //数据库名称
        autoGenerator.setDataSource(dataSourceConfig);
        //全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
        globalConfig.setAuthor("admin");  //作者名
        globalConfig.setOpen(false);
        globalConfig.setServiceName("%sService");
        autoGenerator.setGlobalConfig(globalConfig);
        //包信息
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.southwind");
        packageConfig.setEntity("entity");
        packageConfig.setMapper("mapper");
        packageConfig.setService("service");
        packageConfig.setServiceImpl("service.impl");
        packageConfig.setController("controller");
        autoGenerator.setPackageInfo(packageConfig);
        //策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("user","product");  //批量导入数据库表,不写这条代码,则导入数据库里面全部的表
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        strategyConfig.setEntityLombokModel(true);
        autoGenerator.setStrategy(strategyConfig);
        //运行
        autoGenerator.execute();
    }
}

image.png


spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybaits
    username: fzp1
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:com/southwind/mapper/xml/*.xml
server:
  port: 8181

image.png

image.png

controller增删查改

配置注册mapper

image.png

查询

无条件表里全部输出

image.png

前端传入参数条件输出

image.png

image.png

增加

image.png

删除

image.png

修改

image.png

分页

image.png image.png

image.png

传参

//    语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
//    value:参数名
//    required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,
如果不包含就报错。
//    defaultValue:默认参数值,如果设置了该值,required=true将失效,
自动为false,如果没有传该参数,就使用默认值
@RequestParam(value="id", required=false, defaultValue="1")String id,
@RequestParam("name")String name

VO多表联查自定义sql语句

VO:在开发中只用到多表的个别字段,并不会用到表里的全部字段,可以使用VO,然后传给前端,这样不会造成资源浪费

DTO和VO的区别:DTO是把数据库映射成对象(业务层),VO是把对象传给前端用来展示的(视图层) image.png

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

image.png

//VO多表查询
@GetMapping("/VO")
public Map<String, Object> page() {
    Map<String,Object> map = new HashMap<>();
    map.put("message","成功");
    map.put("code",200);
    map.put("data",mapper.productList(7));
    return  map;
}

image.png

获取返回数据的个别字段的值

List<Map<String, Object>> userList = mapper.selectMaps(wrapper);
System.out.println(userList.get(0).get("id"));

image.png list的话就用下面这个

image.png

返回数据的封装类:状态码,数据,描述,分页等

1.在config里面创建个类AjaxJson

image.png

2.AjaxJson类里写

image.png

3.在控制类导入

image.png

4.使用

image.png

image.png

上传文件 删除、修改文件

1.上传文件(传参)

@PostMapping("/upload")
public AjaxJson upload(@RequestParam MultipartFile file, HttpServletRequest request, @RequestParam("id")String id){
    if(!file.isEmpty()){
        String uploadPath = "D:\tmp";
        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
        String OriginalFilename = file.getOriginalFilename();//获取原文件名
        String suffixName = OriginalFilename.substring(OriginalFilename.lastIndexOf("."));//获取文件后缀名
        //重新随机生成名字
        String filename = UUID.randomUUID().toString() +suffixName;
        File localFile = new File(uploadPath+"\"+filename);
        try {
            file.transferTo(localFile); //把上传的文件保存至本地
            /**
             * 这里应该把filename保存到数据库,供前端访问时使用
             */
            User user = new User();
            user.setImage(filename);
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.eq("id",id);
            mapper.update(user,wrapper);
            return AjaxJson.getSuccess();//上传成功,返回保存的文件地址
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("上传失败");
            return AjaxJson.getError();
        }
    }else{
        System.out.println("文件为空");
        return AjaxJson.getError();
    }
}

快速创建实战项目

一:创建一个文件夹,然后把G盘java文件夹fruil文件夹复制一份进去

二:用软件打开此项目,然后把下面4个文件夹删除

image.png

三:GenerateTest 文件夹重新生成以上4个文件夹

四:重点,用软件打开原来fruil文件夹,复制controller文件夹里面的UserController代码复制到新项目,不复制的话会报错,然后运行脚本

数据库

先在phpstudy_pro软件创建数据库,设置密码,然后再去设计数据库表

image.png

服务器部署

安装环境和数据库部署

1.在服务器上下载phpstudy,然后在phpstudy里面下载mysql,然后开启mysql服务器

2.开放数据库3306端口,和java项目8181端口

image.png

image.png

image.png 3.开启mysql远程连接服务

image.png 4.通过本地电脑连接腾讯云的数据库

image.png

5.把本地数据库导出桌面,然后用windows自带的远程连接腾讯云,把这个导出的数据库 直接用鼠标拉进远程的服务器

java项目导出部署云服务器

image.png

image.png

image.png 1.远程服务器要安装jdk,然后把生成的jar文件复制到远程的jdk安装目录的bin文件夹, (jdk安装exe在本地上有,直接拉到远程服务器安装) 注意:如果要在其他文件夹用java,那可能要配java环境变量,可以先用 键盘快捷键调出终端,注意不能在文件夹上面调出,可能权限不一样用不了命令,输入 java看看有没有反应,没有的话就需要配置环境变量

2.在bin文件夹上面的路径,输入cmd调出cmd终端

image.png

3.在cmd终端上通过命令:java -jar 刚刚打包好的jar项目名 运行项目

image.png

前端多网站部署

windows安装宝塔,用自己服务器ip地址做域名,多个网站则通过不同端口访问,默认 80端口,用82端口则需要在宝塔——》安全,开放82端口,腾讯页面防火墙页面添加82端口放行

1.在宝塔添加多站点 image.png 2.这个域名随便填,不跟列表的站点域名重复就好 image.png 3.在设置里面,设置ip+端口,就可以通过外网访问该网站

image.png

image.png 宝塔开放端口

image.png 腾讯云开放端口

image.png

开始访问,用的是本机ip地址加84端口

image.png