提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
创建springboot
导入mybaits-plus包
<!-- MP 核心库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--MP代码自动生成工具类-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 模板 velocity Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
yml配置文件
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/hello?
useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
代碼生成器
package com.example.hello05;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
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.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
public class CodeGenerator {
@Test
public void genCode() {
//数据库前缀
String prefix = "";
//业务模块名称
String moduleName = "hello05";//模块名
String sqlName = "hello";//数据库名称
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");//获取相对路径
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("fzy");//设置创始人
gc.setOpen(false); //生成后是否打开资源管理器
//重要
gc.setFileOverride(false); //重新生成时文件是否覆盖
gc.setServiceName("%sService"); //去掉Service接口的首字母I
gc.setIdType(IdType.AUTO); //主键策略
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(false);//开启Swagger2模式 開了 需要導入Swagger2 的兩個包
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/" + prefix + "" + sqlName + "?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(moduleName); //模块名
pc.setParent("com.example");
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(moduleName + "_");//设置表前缀不生成
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setLogicDeleteFieldName("deleted");//逻辑删除字段名
strategy.setEntityBooleanColumnRemoveIsPrefix(true);//去掉布尔值的is_前缀
//自动填充
TableFill gmtCreate = new TableFill("createtime", FieldFill.INSERT);
TableFill gmtModified = new TableFill("updatetime", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
//设置BaseEntity
// strategy.setSuperEntityClass("com.atguigu.guli.service.base.model.BaseEntity");
填写BaseEntity中的公共字段
// strategy.setSuperEntityColumns("id", "gmt_create", "gmt_modified");
// 6、执行
mpg.execute();
}
}
添加配置读取到非resources 文件(自动生成的xml在项目内)
<resources>
<resource>
<directory>${basedir}/src/main/webapp</directory>
<!-- 注意此次必须要放在此目录下才能被访问到 -->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.pem</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/**/*.xml</include>
</includes>
</resource>
</resources>
启动类添加扫描器
package com.example.hello05;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan({"com.example.hello05.mapper"})//包扫描器 去yml配置好像不管用,这和mybatis刚好相反
public class Hello05Application {
public static void main(String[] args) {
SpringApplication.run(Hello05Application.class, args);
}
}
设置了时间不为空的 需要配置下不然修改 添加会出问题但查询删除不会
在package com.example.hello05.confing;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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);
// 如果deleted在数据库中是tinyint型那么值要等true用 0 会报错 这
//this.setFieldValByName("deleted",0,metaObject);
this.setFieldValByName("deleted",true,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updatetime",new Date(),metaObject);
}
}
前端控制器 測試
package com.example.hello05.controller;
import com.example.hello05.entity.Test01;
import com.example.hello05.mapper.Test01Mapper;
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;
/**
* <p>
* 前端控制器
* </p>
*
* @author fzy
* @since 2022-03-30
*/
@RestController
@RequestMapping("/hello05/test01")
public class Test01Controller {
@Autowired
Test01Mapper test01Mapper;
@GetMapping("/ss")
public String ss (int id){
Test01 test01 = test01Mapper.selectById(id);
System.out.println( test01.toString());
return "查詢成功";
}
}
简单的crud
@RestController
@RequestMapping("/hello05/test01")
public class Test01Controller {
@Autowired
Test01Mapper test01Mapper;
//按id查
@GetMapping("/ss")
public String ss (int id){
Test01 test01 = test01Mapper.selectById(id);
System.out.println( test01.toString());
return "查詢成功";
}
//按id刪除
@GetMapping("/ss2")
public String ss2 (Long id){
int i = test01Mapper.deleteById(id);
System.out.println( i);
return "删除成功";
}
//按id修改
@GetMapping("/ss3")
public String ss3 (Long id){
Test01 user = new Test01();
user.setId(id);
user.setName("ppxx");
int i = test01Mapper.updateById(user);
System.out.println( user.toString());
return "修改成功";
}
//查出name=777的 所有数据
@GetMapping("/ss4")
public String ss4 (String name){
QueryWrapper<Test01> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", name);
List<Test01> users = test01Mapper.selectList(queryWrapper);
users.forEach(Test01 -> System.out.println(users));
System.out.println( users.toString());
return "成功查出name="+name+"数据";
}
/**
* 分页查询,selectPage 可以传入两个参数
* 参数 1:Page 对象,包含了分页信息,其构造方法参数
* 参数 1:当前页,从 1 开始
* 参数 2:页面容量
* 参数 2:QueryWrapper 对象,设置搜索的条件
* 结果:IPage 抽象类的子类对象,包含了一下信息:
* 1. 当前页
* 2. 总页数
* 3. 总记录数
* 4. 页面容量
* 5. 当前页的记录
*/
@GetMapping("/ss5")
public String ss5 (int a ,int b){
IPage iPage = test01Mapper.selectPage(new Page(a, b), null);
System.out.println("current page: " + iPage.getCurrent());
System.out.println("total pages: " + iPage.getPages());
System.out.println("total records: " + iPage.getTotal());
System.out.println("page size: " + iPage.getSize());
System.out.println("records: " + iPage.getRecords());
return "成功查出分页数据";
}
@GetMapping("/ss6")
public String ss6 (Test01 user){
test01Mapper.insert(user);
return "成功添加數據";
}
}
关于项目中创建web前端页面
其中static 里的index页面 可以直接通过http://localhost:8080/ 访问到
static 里的logo 控制器返回路径也访问不到
templates 如果项目导入模板引擎thymeleaf那么里面的页面可以通过控制器访问到
@Controller
public class controller {
@GetMapping("/index")
public String index() {
System.out.println("******客户连接数****");
return "index";
}
@GetMapping("/logo")
public String login() {
System.out.println("******客户连接数****");
return "logo";
}
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
如果页面需要使用thymeleaf 语法那么
html标签改为
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>first01</title>
</head>
<body>
<div>123tem</div>
</body>
</html>