一、添加依赖
在pom.xml中添加
<!-- jdbc驱动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!-- mybatis-plus生成代码 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!-- 默认模板velocity -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
二、建表
由于之后要用shiro进行权限控制,这里直接在网上找了个shiro表结构的sql(来源:https://www.jianshu.com/p/5c5af91cec9f)
-- create database shiro default character set utf8;
DROP TABLE IF EXISTS dm_users;
DROP TABLE IF EXISTS dm_roles;
DROP TABLE IF EXISTS dm_permissions;
DROP TABLE IF EXISTS dm_users_roles;
DROP TABLE IF EXISTS dm_roles_permissions;
CREATE TABLE dm_users (
id BIGINT AUTO_INCREMENT COMMENT '编号',
username VARCHAR(100) COMMENT '用户名',
PASSWORD VARCHAR(100) COMMENT '密码',
salt VARCHAR(100) COMMENT '盐值',
role_id VARCHAR(50) COMMENT '角色列表',
locked BOOL DEFAULT FALSE COMMENT '是否锁定',
CONSTRAINT pk_dm_users PRIMARY KEY(id)
) CHARSET=utf8 ENGINE=INNODB;
CREATE UNIQUE INDEX idx_dm_users_username ON dm_users(username);
CREATE TABLE dm_roles (
id BIGINT AUTO_INCREMENT COMMENT '角色编号',
role VARCHAR(100) COMMENT '角色名称',
description VARCHAR(100) COMMENT '角色描述',
pid BIGINT COMMENT '父节点',
available BOOL DEFAULT FALSE COMMENT '是否锁定',
CONSTRAINT pk_dm_roles PRIMARY KEY(id)
) CHARSET=utf8 ENGINE=INNODB;
CREATE UNIQUE INDEX idx_dm_roles_role ON dm_roles(role);
CREATE TABLE dm_permissions (
id BIGINT AUTO_INCREMENT COMMENT '编号',
permission VARCHAR(100) COMMENT '权限编号',
description VARCHAR(100) COMMENT '权限描述',
rid BIGINT COMMENT '此权限关联角色的id',
available BOOL DEFAULT FALSE COMMENT '是否锁定',
CONSTRAINT pk_dm_permissions PRIMARY KEY(id)
) CHARSET=utf8 ENGINE=INNODB;
CREATE UNIQUE INDEX idx_dm_permissions_permission ON dm_permissions(permission);
CREATE TABLE dm_users_roles (
id BIGINT AUTO_INCREMENT COMMENT '编号',
user_id BIGINT COMMENT '用户编号',
role_id BIGINT COMMENT '角色编号',
CONSTRAINT pk_dm_users_roles PRIMARY KEY(id)
) CHARSET=utf8 ENGINE=INNODB;
CREATE TABLE dm_roles_permissions (
id BIGINT AUTO_INCREMENT COMMENT '编号',
role_id BIGINT COMMENT '角色编号',
permission_id BIGINT COMMENT '权限编号',
CONSTRAINT pk_dm_roles_permissions PRIMARY KEY(id)
) CHARSET=utf8 ENGINE=INNODB;
三、配置文件application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
注意:在url中加入&serverTimezone=UTC,设置时区
四、代码生成的配置文件
package com.springboot.demo02020623;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.Scanner;
// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/test/java"); //将生成的代码放在test下,防止误将正式代码覆盖
gc.setAuthor("wxl");
gc.setOpen(false); //生成代码后不打开资源管理器
gc.setFileOverride(true);//第二次生成会把第一次生成的覆盖掉
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
//父包模块名
pc.setModuleName("demo02020623");
//父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
pc.setParent("com.springboot");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel); //数据库表映射到实体的命名策略
strategy.setRestControllerStyle(true); //生成 @RestController 控制器
strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); //需要包含的表名
strategy.setControllerMappingHyphenStyle(true); //驼峰转连字符
strategy.setTablePrefix(pc.getModuleName() + "_"); //表前缀
mpg.setStrategy(strategy);
mpg.execute();
}
}
mybatisplus官网有模板,再根据自己的需求进行更改。我更改过后:
- 使用默认模板velocity、默认包路径;
- 生成的controller、service、mapper均为空文件,但是继承了基础service、mapper,可以满足基本的增删查改功能;
- 第二次生成会把第一次生成的覆盖掉;
- 实体类不使用lombok模式(很多公司不让用lombok模式,这里不使用)。
配置项太多,根据实际需求到官网查询修改
运行main方法生成代码;
五、在controller中写个测试方法
要先给启动类加个注解,否则会报错
@MapperScan(basePackages = "com.springboot.demo02020623.mapper")
controller:
import com.springboot.demo02020623.service.IDmUsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author jobob
* @since 2020-06-23
*/
@RestController
@RequestMapping("/demo02020623/dm-users")
public class DmUsersController {
@Autowired
private IDmUsersService iDmUsersService;
@RequestMapping("/queryUsers")
public Object queryUsers(){
return iDmUsersService.list();
}
}
postman中测试,返回成功
六、自定义方法
mybatisplus中的增删改方法已经可以满足基本需求,这里只写自定义查询方法
- 在jar包中找到默认mapper.xml模板:
在resources文件夹下新建目录templates,将默认模板复制到该目录下,修改尾部部分为:
<sql id="Base_Column_List">
#foreach($field in ${table.fields})
a.${field.name} ${field.propertyName},
#end
</sql>
生成基础字段列表并将别名赋值为实体类字段名。
- 在代码生成器:
全局配置中添加
gc.setBaseColumnList(true); //xml中生成baseColumnList
配置模板中添加
templateConfig.setXml("templates/mapper.xml"); //设置xml文件模板(其他模板也一样)
- 生成代码后将需要的部分复制到正式代码中即可
- 在配置文件中添加
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/**.xml
mapper-locations: com/springboot/demo02020623/mapper/xml/*Mapper.xml
5.在controller、service、dao层定义方法,xml中写自定义查询sql
xml:
<select id="selectDemo" resultType="java.util.Map">
select
<include refid="Base_Column_List" />
c.id,c.role from
dm_users a
left join dm_users_roles b on a.id = b.user_id
left join dm_roles c on b.role_id = c.id
</select>
controller:
@RequestMapping("/queryUsers1")
public Object queryUsers1(){
return iDmUsersService.selectDemo(null);
}
发起请求:
报错了:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
在编译后的文件中找不到对应的xml文件
问题:
我们没有把xml文件放在resources文件夹下(我的猜测,有兴趣的可以试一试,放在resources下应该可以直接编译的),maven默认是不编译xml文件的的
解决办法:
在pom.xml中的里面,加这么一段:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
解决办法出处:https://blog.youkuaiyun.com/qq_18298439/article/details/80586789
运行:
成功: