项目准备
数据库
MySql 5.7
新建数据库votedb
,新建两个测试表user、vote_theme
user表
vote_theme表
建表代码如下
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(25) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`phone` varchar(255) DEFAULT NULL COMMENT '手机',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`age` int(3) DEFAULT NULL COMMENT '年龄',
`role` varchar(2) DEFAULT NULL COMMENT '角色',
`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1380808280388952067 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for vote_theme
-- ----------------------------
DROP TABLE IF EXISTS `vote_theme`;
CREATE TABLE `vote_theme` (
`id` bigint(25) NOT NULL COMMENT '主题主键',
`theme_name` varchar(255) DEFAULT NULL COMMENT '主题名',
`theme_explain` text COMMENT '相关说明',
`expectation_sum` bigint(25) DEFAULT '0' COMMENT '总期望值',
`expectation_times` bigint(25) DEFAULT '0' COMMENT '期望人次',
`imgurl` varchar(2550) DEFAULT NULL COMMENT '主题图片',
`end_date` datetime DEFAULT NULL,
`start_date` datetime DEFAULT NULL,
`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `user` VALUES (1358687078200619010, 'wzp', '674f6e6d9b25a084110e992042ad0cdb', '17753657132', '1231@163.com', 22, 'a', '2021-02-08 16:00:17', '2021-07-14 22:43:41');
INSERT INTO `user` VALUES (1358687341250588673, 'admin', '674f6e6d9b25a084110e992042ad0cdb', '17753657132', '124@163.com', 28, 'a', '2021-02-08 16:01:20', '2021-03-11 16:37:55');
INSERT INTO `user` VALUES (1358687744079933441, 'wahahaa', '674f6e6d9b25a084110e992042ad0cdb', '18553777133', '123@126.com', 38, 'u', '2021-02-08 16:02:56', '2021-06-20 14:11:08');
INSERT INTO `user` VALUES (1358693663190769666, 'hanjia', '674f6e6d9b25a084110e992042ad0cdb', '18577657134', '129@163.com', 18, 'u', '2021-02-08 16:26:27', '2021-02-20 11:52:28');
INSERT INTO `user` VALUES (1362299967155175426, 'wanghia', '123', '123132', '2222', 18, 'u', '2021-02-18 15:16:37', '2021-02-18 15:16:37');
INSERT INTO `user` VALUES (1362959351606640641, 'zhangsan', '674f6e6d9b25a084110e992042ad0cdb', '18453657775', '2222@qq.com', 40, 'a', '2021-02-20 10:56:47', '2021-06-20 14:11:16');
INSERT INTO `user` VALUES (1380808280388952066, '123123123', '674f6e6d9b25a084110e992042ad0cdb', '18553657776', '24423@qq.com', 18, 'u', '2021-04-10 17:02:03', '2021-04-10 17:02:03');
COMMIT;
新建SpingBoot项目
新建空的SpringBoot项目(Model也行),版本2.3.3.RELEASE,Java1.8,pom.xml添加如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--MP插件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!--代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--阿里巴巴数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
application.properties信息如下:
# 端口号
server.port=8082
# 设置context-path
server.servlet.context-path=/studyboot2023
# 数据库连接
spring.datasource.url = jdbc:mysql://localhost:3306/votedb?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123123123注意修改此处
# 配置日志(默认日志)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 配置mapper xml文件所在的路径
mybatis-plus.mapper-locations=classpath:mapper/*.xml
# mybatis别名包扫描,映射类所在的包名,对应实体类的包名(注意此处)
mybatis-plus.type-aliases-package=com.example.study02.entity
项目结构
代码生成器GetCode类
与SpringBoot项目的启动类同级别位置,添加如下GetCode类。
注意修改代码中有关数据库连接的相关信息、生成代码所在位置完整包信息。其他的部分不用管。
package com.example.study02;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
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.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @Author wzp
* @Date 2021-02-05 5:11 下午
* @Description
*/
public class GetCode {
static Scanner scanner = new Scanner(System.in);
public static String scanner(String tip) {
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 需要构建一个代码自动生成器对象
AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1,全局配置
GlobalConfig gc = new GlobalConfig();
//String projectPath = System.getProperty("user.dir");
//String projectPath = "/Users/wangzp/IdeaProjects/SpringBootReview202305/study02";
System.out.println("请输入当前项目/模块的绝对路径:");
String projectPath = scanner.next();
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("wzp");
gc.setOpen(false);// 是否打开文件夹
gc.setFileOverride(true);//是否覆盖
gc.setServiceName("%sService");
gc.setIdType(IdType.ID_WORKER);
//gc.setDateType(DateType.ONLY_DATE);
// gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
//**************************修改如下位置****************************************
// 设置数据源,注意修改此处
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/votedb?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//包的配置
PackageConfig pc = new PackageConfig();
//pc.setModuleName("peng");// 会在那个包下生成,这个包自动创建
//**************************修改如下位置****************************************
pc.setParent("com.example.study02"); // 注意修改此行,即在哪个包下生成Controller、Service、entity等代码
// pc.setEntity("entity");
// pc.setMapper("mapper");
// pc.setService("service");
// pc.setController("controller");
mpg.setPackageInfo(pc);
/**
* 以下这部分目前的功能就是将mapper.xml创建到resources中,而不是java包下
*/
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/"
+ tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
/*
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建
checkDir("调用默认方法创建的目录,自定义目录用");
if (fileType == FileType.MAPPER) {
// 已经生成 mapper 文件判断存在,不想重新生成返回 false
return !new File(filePath).exists();
}
// 允许生成模板文件
return true;
}
});
*/
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
/**
* 上部分停止
*/
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setEntityLombokModel(true);
//strategy.setLogicDeleteFieldName("deleted");
//自动填充配置
TableFill gmt_create = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmt_modified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmt_modified);
tableFills.add(gmt_create);
strategy.setTableFillList(tableFills);
//乐观锁
//strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
运行GetCode,生成每个表的增删改查所有代码。
生成效果如下:
在启动类中添加@MapperScan
注解
@SpringBootApplication
@MapperScan("com.example.study02.mapper")
public class Study02Application {
public static void main(String[] args) {
SpringApplication.run(Study02Application.class, args);
}
}
此时,每个表的增删改查已全部写完(service、mapper中为空是正常的),此时仅需完善Controller处理增删改查请求即可。(多表查询不可自动生成,需要配合Mybatis-Plus语法在Service、Mapper中添加处理代码)
测试
在UserController中添加如下测试代码,访问User表中的所有数据。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/query")
public List<User> query(){
List<User> list = userService.list();
return list;
}
}
在浏览器中输入http://localhost:8082/studyboot2023/user/query
数据成功访问