MyBatis-plus官网
baomidou.com/
其他文章
使用自动生成器先引入依赖
使用自动生成器先引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
现在有好几个依赖是关于mybatis-plus的可以选择mybatisplus-boot-start这个依赖就可以很全 在建立好数据库后,我们可以使用Mybatis Plus提供的自动代码生成器,将其写成一个工具类,当有表新增时,可以及时调用该工具类生成
public class GenerateTableUtil {
public static void generate(String parent,String moduleName,String ...table){
AutoGenerator mpg = new AutoGenerator();
// 1.全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
System.out.println(projectPath);
// 输出目录
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("zhou");
gc.setServiceName("%sService");
gc.setFileOverride(true);
gc.setOpen(false);
// gc.setServiceName("%Service");
gc.setSwagger2(true); //实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 2.设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUsername("root");
dsc.setPassword("david1");
dsc.setUrl("jdbc:mysql://49.235.45.85:3306/db1?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 3. 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(moduleName);
pc.setParent(parent);
pc.setEntity("entiry");
pc.setController("controller");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 4.策略设置
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// 重点,设置映射的表名
strategy.setInclude(table);
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
// // 设置逻辑删除字段
// strategy.setLogicDeleteFieldName("deleted");
// // 自动填充字段
// TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
// TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
// strategy.setTableFillList(List.of(createTime,updateTime));
// // 乐观锁字段
// strategy.setVersionFieldName("version");
// strategy.setRestControllerStyle(true); // Controller用rest风格
// strategy.setControllerMappingHyphenStyle(true);
// strategy.setRestControllerStyle(true); // Controller用rest风格
// strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.execute();
}
}
工具类生成后,可以获得如下的目录,但是怎么编写Service类是一个问题,下面给出一个方案
在Service层的接口写出需要使用的方法 `public interface DepartmentService extends IService {
void addDepartment(Department department);
void deleteDepartmentById(int id);
void updateDepartmentById(Department department);
Department selectDepartmentById(int id);
}`
之后使用其应用Impl类重写这些方法,我们可以使用Mybatis Plus提供的baseMapper使用Mybatis Plus提供的方法 `@Service public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements DepartmentService {
@Override
public void addDepartment(Department department) {
baseMapper.insert(department);
}
@Override
public void deleteDepartmentById(int id) {
baseMapper.deleteById(id);
}
@Override
public void updateDepartmentById(Department department) {
baseMapper.updateById(department);
}
@Override
public Department selectDepartmentById(int id) {
return baseMapper.selectById(id);
}
}`
在需要的地方进行注入
class RedisDemoApplicationTests {
@Autowired
DepartmentServiceImpl departmentService;
@Test
void contextLoads() throws JsonProcessingException {
departmentService.addDepartment(new Department(4,"LOL游戏部"));
departmentService.deleteDepartmentById(4);
departmentService.updateDepartmentById(new Department(3,"产品部"));
}
}
持久层
@Mapper
public interface AdminMapper extends BaseMapper<Admins> {
}
- 使用MyBatis-plus 只需要继承BaseMapper
- T 泛型需要制定要操作的实体类
只需要继承了BaseMapper接口就可以使用它提供的方法
MyBatis-plus 的BaseMapper接口内声明的方法
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
- 使用MyBaits-plus时需要注意的点:
/**
* 默认使用实体类中的名字去数据库中找同名的表,如果没有,需要指定
*/
@TableName(value = "admins")
public class Admins {
/**
* 指定数据库中对应表的主键,如果数据库中的主键名称和实体类中的id不同,需要制定
*/
@TableId(value = "id", type = IdType.AUTO)
private int id;
private String username;
private String password;
/**
* 默认会将驼峰式命名转化为下划线
* 但有时候命名不同,可以使用该注解指定给字段对应的数据库中的字段
*/
@TableField(value = "head_photo")
private String headphoto;
private String isenable;
private String phone;
private String email;
private String address;
private String createTime;
private String position;
//省略get set 方法
...
}