spring-boot版本:2.1.5.RELEASE
mybatis-plus版本:2.1.9
自己搭建项目基础部分时对比了mybatis和mybatis-plus的代码生成器,发现后者生成的类更加全面,简单记录下使用过程。
生成项目
可以使用idea创建一个springboot的maven项目
File=>New=>Project=>Spring Initializr
,或者直接在官网上生成。
简单填下项目名、包名之类就行
引入依赖
<dependencies>
<!-- springboot基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok省略get/set方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--MyBatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.1.9</version>
</dependency>
</dependencies>
配置文件(application.yml)
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/dbgirl?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/com/atmoon/*/mapper/xml/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.atmoon.demo.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新mapper 调试神器
refresh-mapper: true
configuration:
#配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull, oracle数据库必须配置
jdbc-type-for-null: 'null'
引入代码生成器
放到test包下,直接运行就行。属性根据自己需要可以做些调整。
package com.atmoon.demo;
import com.baomidou.mybatisplus.enums.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.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class GeneratorServiceEntity {
@Autowired
private Environment environment;
@Value("${spring.datasource.url}")
private String dbUrl;
@Test
public void generateCode() {
String packageName = "com.atmoon.demo";
String[] s = new String[]{"department", "girl"};
generateByTables(packageName, s);
}
private void generateByTables(boolean serviceNameStartWithI, String packageName, String... tableNames) {
GlobalConfig config = new GlobalConfig();
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)
.setUrl(environment.getProperty("spring.datasource.url"))
.setUsername(environment.getProperty("spring.datasource.username"))
.setPassword(environment.getProperty("spring.datasource.password"))
.setDriverName("com.mysql.cj.jdbc.Driver");
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig
.setCapitalMode(true)
// 生成实体类使用lombok模式
.setEntityLombokModel(true)
.setDbColumnUnderline(true)
// 表名下划线转驼峰
.setNaming(NamingStrategy.underline_to_camel)
// 需要生成全部表时去掉这一行
.setInclude(tableNames);//修改替换成你需要的表名,多个表名传数组
config.setActiveRecord(false)
.setAuthor("at-moon")
// 直接设置你代码保存的位置就不用复制了
.setOutputDir("D:\\IdeaProjects\\demo\\src\\main\\java")
.setFileOverride(true)
// 设置主键类型
.setIdType(IdType.AUTO)
// 是否开启二级缓存
.setEnableCache(false);
if (!serviceNameStartWithI) {
config.setServiceName("%sService");
}
new AutoGenerator().setGlobalConfig(config)
.setDataSource(dataSourceConfig)
.setStrategy(strategyConfig)
.setPackageInfo(
new PackageConfig()
.setParent(packageName)
.setController("controller")
.setEntity("entity")
).execute();
}
private void generateByTables(String packageName, String... tableNames) {
generateByTables(true, packageName, tableNames);
}
}
生成后的代码包含以下部分(这里生成了两个表对应的类,参考生成器中注释)
直接启动报错(注入mapper)
Unsatisfied dependency expressed through field ‘baseMapper’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type ‘com.atmoon.demo.mapper.GirlMapper’ available: expected at least 1 bean which qualifies as autowire candidate.
原因是没有扫描mapper对应的xml
需要在启动类中加入注解MapperScan
@SpringBootApplication
@MapperScan("com.atmoon.*.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
分页查询示例
controller
@Controller
@RequestMapping("/girl")
public class GirlController {
@Autowired
private IGirlService girlService;
@GetMapping("/list")
@ResponseBody
public List<Girl> queryStaffByAge(Page<Girl> page) {
page = girlService.queryGirl(page,null);
// 总行数
int total = page.getTotal();
return page.getRecords();
}
}
service
@Service
public class GirlServiceImpl extends ServiceImpl<GirlMapper, Girl> implements IGirlService {
@Autowired
GirlMapper girlMapper;
@Override
public Page<Girl> queryGirl(Page<Girl> page, String city) {
return page.setRecords(girlMapper.queryGirl(page,city));
}
}
mapper
public interface GirlMapper extends BaseMapper<Girl> {
/**
* @param page
* @param city
* @return
*/
List<Girl> queryGirl(Page<Girl> page,@Param("city")String city);
}
xml
<select id="queryGirl" resultType="com.atmoon.demo.entity.Girl">
SELECT * FROM girl WHERE 1 = 1
<if test=" city != null and city != ''">
city=#{city}
</if>
</select>
启动后访问接口报错
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.atmoon.demo.mapper.GirlMapper.queryGirl
首先检查yml配置中mybatis-plus:mapper-locations是否正确
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/com/atmoon/*/mapper/xml/*Mapper.xml
如果用的idea,默认不会扫描src目录下的资源文件
在pom文件中需要加入(build下)
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
重启后访问成功但数据未分页
需要引入分页插件
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
小结
mybatis-plus的引入基本就结束了,引入过程中有遇到问题可以留言。