1.创建spring boot项目
com.southwind
2、pom.xml 引⼊ MyBatis Plus 的依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-
starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
3.配置数据源链接数据库(文件后缀.yml)
spring: datasource: url: jdbc:mysql://localhost:3306/mybaits?useUnicode=true&characterEncoding=UTF-8 username: fzp password: 123456
4.创建实体类,包entity,类名user
5.注解
@Data //类里的get和set方法不用写
@TableName //映射数据库的表名
当实体类与数据库表明不一致时,需要@TableName注解的value属性来映射
@TableId //主键使用
value属性
type属性 //设置主键类型,主键生成策略
@TableFieId //映射到字段,除了主键之外的其他字段
value属性: 变量跟表里的字段不一样时需要映射
exist表示是否为数据库字段,
如果实体类中的成员变量在数据库中没有对应的字段,则可以使用exist,
VO和DTO用的比较多,vo就是把多个实体类里面的变量取出来封装,根据需求传给 前端,
select表示是否查询该字段
fill创建时间修改时间自动填充,保存到数据库
@TableField(fill = FieldFill.INSERT) //创建时间
private Date createTime; //数据库不支持驼峰命名,但是会自动转为下划线格式
@TableField(fill = FieldFill.INSERT_UPDATE) //第一次创建的时间,后面跟新就会修改时间
private Date updateTime;
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);
}
}
@Version 乐观锁:处理高并发的一种解决方案
乐观锁:处理高并发的一种解决方案,防止数据被重复修改,通过version字段来保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候才会修改成功
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();
}
}
@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;
}
}
其中最关键的是
@EnumValue 注解,他是标注数据库里存的字段,这里数据库里存的是 key,@JsonValue 标注的是要展示的字段,这里我们想展示给前端的是 name 字段,同时要重写 toString 方法为我们想要的,因为系统会自动调用该方法作为前端的展示值,这里想要展示 name,所以直接返回它就行了。
关键点:
@EnumValue:标注哪一个字段是数据库里的字段;@JsonValue:标注要开启自定义序列化返回值;toString:具体的返回值;
同时我们需要在与数据库关联的实体类中修改类型,将性别字段改为枚举类型:
在配置文件yml中配置扫描注解类型:
EnumOrdinalTypeHandler:type-enums-package: com.southwind1.mybaitsplus1.enums
default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
@TableLogic逻辑删除
6.创建Mapper接口(对实体类进行操作,把实体类操作结果映射到数据库)
7.创建测试类
8出现bug的问题
9.插入数据主键id设置
使用@TableId(type = IdType.AUTO),数据库自增方式
使用默认的雪花算法方式
10增删改查
查询
selectList
不加条件全部查询
eq单条件查询
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("name","科比");
System.out.println(mapper.selectList(wrapper));
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));
gt大于
lt小于
ne不等于
ge大于等于
like模糊查询,可查询字段单个值
likeLeft和likeRight
inSql
升序或者降序
降序添加查询条件
单id或者多id查询
System.out.println(mapper.selectById(8));
mapper.selectBatchIds(Arrays.asList(8,7)).forEach(System.out::println);
selectCount返回总条数(符合该条件有多少条数据
QueryWrapper wrapper = new QueryWrapper();
wrapper.gt("id",1);
System.out.println(mapper.selectCount(wrapper));
分页
selectMapsPage (map集合分页)
自定义SQL,多表关联和VO实现多表关联查询
VO:在开发中只用到多表的个别字段,并不会用到表里的全部字段,可以使用VO,然后传给前端,这样不会造成资源浪费
DTO和VO的区别:DTO是把数据库映射成对象(业务层),VO是把对象传给前端用来展示的(视图层)
@Select("select p.*,u.name userName from product p,user u where p.user_id = u.id and u.id = #{id}")
添加
删除
单个id删除
多个id删除
多条件删除
使用map集合多条件删除
修改
通过id单条件修改
多条件修改
自动生成
<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>
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();
}
}
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
controller增删查改
配置注册mapper
查询
无条件表里全部输出
前端传入参数条件输出
增加
删除
修改
分页
传参
// 语法:@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是把对象传给前端用来展示的(视图层)
@Select("select p.*,u.name userName from product p,user u where p.user_id = u.id and u.id = #{id}")
//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;
}
获取返回数据的个别字段的值
List<Map<String, Object>> userList = mapper.selectMaps(wrapper);
System.out.println(userList.get(0).get("id"));
list的话就用下面这个
返回数据的封装类:状态码,数据,描述,分页等
1.在config里面创建个类AjaxJson
2.AjaxJson类里写
3.在控制类导入
4.使用
上传文件 删除、修改文件
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个文件夹删除
三:GenerateTest 文件夹重新生成以上4个文件夹
四:重点,用软件打开原来fruil文件夹,复制controller文件夹里面的UserController代码复制到新项目,不复制的话会报错,然后运行脚本
数据库
先在phpstudy_pro软件创建数据库,设置密码,然后再去设计数据库表
服务器部署
安装环境和数据库部署
1.在服务器上下载phpstudy,然后在phpstudy里面下载mysql,然后开启mysql服务器
2.开放数据库3306端口,和java项目8181端口
3.开启mysql远程连接服务
4.通过本地电脑连接腾讯云的数据库
5.把本地数据库导出桌面,然后用windows自带的远程连接腾讯云,把这个导出的数据库 直接用鼠标拉进远程的服务器
java项目导出部署云服务器
1.远程服务器要安装jdk,然后把生成的jar文件复制到远程的jdk安装目录的bin文件夹,
(jdk安装exe在本地上有,直接拉到远程服务器安装)
注意:如果要在其他文件夹用java,那可能要配java环境变量,可以先用
键盘快捷键调出终端,注意不能在文件夹上面调出,可能权限不一样用不了命令,输入
java看看有没有反应,没有的话就需要配置环境变量
2.在bin文件夹上面的路径,输入cmd调出cmd终端
3.在cmd终端上通过命令:java -jar 刚刚打包好的jar项目名 运行项目
前端多网站部署
windows安装宝塔,用自己服务器ip地址做域名,多个网站则通过不同端口访问,默认 80端口,用82端口则需要在宝塔——》安全,开放82端口,腾讯页面防火墙页面添加82端口放行
1.在宝塔添加多站点
2.这个域名随便填,不跟列表的站点域名重复就好
3.在设置里面,设置ip+端口,就可以通过外网访问该网站
宝塔开放端口
腾讯云开放端口
开始访问,用的是本机ip地址加84端口