Spring-boot-Mybatis-Plus
Mybatis-Plus-Generator
// 代碼生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/spring/springboot/spring-boot-mybatis-plus/src/main/java");
gc.setAuthor("shawn");
gc.setOpen(false);
gc.setServiceName("%sService");
gc.setFileOverride(true);
gc.setIdType(IdType.AUTO);
gc.setDateType(DateType.ONLY_DATE);
// gc.setSwagger2(true); 實體屬性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 數(shù)據(jù)源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(
"jdbc:mysql://localhost:3306/spring-boot-demo?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("Gepoint");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.shawn.spring.boot.mybatisplus");
pc.setController("controller");
pc.setService("service");
pc.setEntity("entity");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setControllerMappingHyphenStyle(true);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setTablePrefix("t_");
mpg.setStrategy(strategy);
mpg.execute();
spring-boot-mybatis-plus
-
pom.xml
<dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
-
application.yaml
spring.datasource.url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 spring.datasource.username: root spring.datasource.password: Gepoint spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver # mybatis-plus mybatis-plus.mapper-locations: classpath:mapper/**/*.xml mybatis-plus.type-aliases-package: com.shawn.spring.boot.mybatisplus.entity mybatis-plus.global-config.db-config.id-type: AUTO mybatis-plus.global-config.db-config.table-underline: true mybatis-plus.global-config.db-config.logic-delete-value: 1 mybatis-plus.global-config.db-config.logic-not-delete-value: 0 mybatis-plus.configuration.cache-enabled: true mybatis-plus.configuration.map-underscore-to-camel-case: true
-
entity
@Data @EqualsAndHashCode(callSuper = false) @TableName("t_menu") @Builder @NoArgsConstructor @AllArgsConstructor public class Menu implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "menu_id", type = IdType.AUTO) private Long menuId; /** 父菜單ID痊末,一級菜單為0 */ private Long parentId; /** 菜單名稱 */ private String name; /** 菜單URL */ private String url; /** 類型 0:目錄 1:菜單 2:按鈕 */ private Integer type; /** 排序 */ private Integer orderNum; /** 創(chuàng)建時間 */ @TableField(fill = FieldFill.INSERT) private Date createTime; /** 修改時間 */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; /** 狀態(tài) 0:禁用 1:正常 */ @TableLogic private Integer isDeleted; }
-
mapper
public interface RoleMapper extends BaseMapper<Role> { @Insert({ "insert into t_role (role_name, remark, ", "create_time, update_time, ", "is_deleted)", "values (#{roleName,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, ", "#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, ", "#{isDeleted,jdbcType=TINYINT})" }) @SelectKey( statement = "SELECT LAST_INSERT_ID()", keyProperty = "roleId", before = false, resultType = Long.class) int insertReturnKey(Role record); }
-
service
@Service public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService { @Override public int saveReturnKey(Role role) { return getBaseMapper().insertReturnKey(role); } }
-
config
@Component @Slf4j public class MybatisPlusCommonFieldHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); Date time = Calendar.getInstance().getTime(); this.setFieldValByName("createTime", time, metaObject); this.setFieldValByName("updateTime", time, metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.setFieldValByName("updateTime", Calendar.getInstance().getTime(), metaObject); } }
@Configuration @EnableTransactionManagement @MapperScan("com.shawn.spring.boot.mybatisplus.mapper") public class MybatisPlusConfig { // 分頁插件 @Bean public PaginationInnerInterceptor paginationInterceptor() { PaginationInnerInterceptor interceptor = new PaginationInnerInterceptor(); interceptor.setDbType(DbType.MYSQL); interceptor.setMaxLimit(500l); return interceptor; } @Bean public LogicDeleteByIdWithFill sqlInjector() { return new LogicDeleteByIdWithFill(); } }
-
runner
@Component @Slf4j public class MybatisPlusRunner implements ApplicationRunner { @Autowired private UserService userService; @Autowired private RoleService roleService; @Autowired private MenuService menuService; @Autowired private RoleMenuService roleMenuService; @Autowired private UserRoleService userRoleService; @Override public void run(ApplicationArguments args) throws Exception { newMenu(); queryMenuById(); newRole(); queryRoleById(); queryByLikeName(); queryMenuByRoleId(); newUser(); login(); queryRolesByUserId(); queryMenusByPid(); testPageQuery(); } public void newMenu() { Menu menu = Menu.builder() .name("系統(tǒng)管理") .orderNum(1) .parentId(Long.valueOf(0)) .url("/") .type(MenuTypeEnum.CATALOG_TYPE.getCode()) .isDeleted(0) .build(); menuService.save(menu); log.info("success create new menu"); } public void queryMenuById() { Menu menu = menuService.getById(1); log.info("queryMenuById: {}", menu.toString()); } public void newRole() { Role role = Role.builder().remark("系統(tǒng)管理員").roleName("系統(tǒng)管理員").isDeleted(0).build(); int key = roleService.saveReturnKey(role); roleMenuService.save(RoleMenu.builder().menuId(1l).roleId(Long.valueOf(key)).build()); log.info("success create new role"); } public void queryRoleById() { log.info("queryRoleById: {}", roleService.getById(2)); } public void queryByLikeName() { QueryWrapper<Role> queryWrapper = new QueryWrapper<>(); queryWrapper.like("role_name", "系統(tǒng)"); roleService.list(queryWrapper); List<Role> roleList = roleService.list(queryWrapper); if (!CollectionUtils.isEmpty(roleList)) { roleList.forEach(role -> log.info("queryByLikeName: {}", role.toString())); } } public void queryMenuByRoleId() { QueryWrapper<RoleMenu> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("role_id", 2); List<RoleMenu> menuList = roleMenuService.list(queryWrapper); if (!CollectionUtils.isEmpty(menuList)) { menuList.forEach(menu -> log.info("queryMenuByRoleId: {}", menu.toString())); } } public void newUser() { User shawn = User.builder() .email("1111@qq.com") .mobile("12345678901") .password("123456") .salt("12345") .username("shawn") .isDeleted(0) .build(); int i = userService.saveReturnKey(shawn); userRoleService.save(UserRole.builder().roleId(1l).userId(Long.valueOf(i)).build()); log.info("success create new user"); } public void login() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", "admin").and(wrapper -> wrapper.eq("password", "123456")); List<User> list = userService.list(queryWrapper); if (CollectionUtils.isEmpty(list) || list.size() > 1) { log.error("login failed! username: {}, password: {}", "shawn", "123456"); } else { User shawn = list.get(0); log.info("login success! {}", shawn.toString()); } } public void queryRolesByUserId() { QueryWrapper<UserRole> wrapper = new QueryWrapper<>(); wrapper.eq("user_id", 1l); List<UserRole> roleList = userRoleService.list(wrapper); if (!CollectionUtils.isEmpty(roleList)) { roleList.forEach(role -> log.info("queryRolesByUserId: {}", role.toString())); } } public void queryMenusByPid() { QueryWrapper<Menu> wrapper = new QueryWrapper<>(); wrapper.eq("parent_id", 0); List<Menu> menuList = menuService.list(wrapper); if (!CollectionUtils.isEmpty(menuList)) { menuList.forEach(menu -> log.info("queryMenusByPid: {}", menu.toString())); } } public void testPageQuery() { Page<User> page = new Page<>(1, 3); userService.selectByPage(page); log.info("data: {}", page.getRecords()); log.info("total: {}", page.getTotal()); } }
main class
@SpringBootApplication
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
上述代碼不全喉前,請參考源碼