現今的框架真的是越來越簡潔了,項目搭建起來之後只用寫個後臺https://start.spring.io/,甚至連SQL都用不到了,這次的springboot+mybits-plus+mysql框架是項目開發是剛剛用到的,搬磚賊好用,推薦給各位碼員。
#代碼生成器
https://mp.baomidou.com/guide/generator.html
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發效率。
// 演示例子,執行 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/main/java");
gc.setAuthor("jobob");
gc.setOpen(false);
mpg.setGlobalConfig(gc);
// 數據源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/ant?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("密碼");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模塊名"));
pc.setParent("com.baomidou.ant");
mpg.setPackageInfo(pc);
// 自定義配置
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/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定義輸出模板
//指定自定義模板路徑,注意不要帶上.ftl/.vm, 會根據使用的模板引擎自動識別
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
strategy.setInclude(scanner("表名"));
strategy.setSuperEntityColumns("id");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
1,查看實體類,設置主鍵自動生成
@Data
@TableName("user")
public class User(){
/**
* ID主鍵
*/
@TableId(value = "id", type = IdType.UUID)
private String id;
/**
* 名稱
*/
private String name;
public static final String USER_ID = "user_id";
public static final String USER_NAME = "user_name";
}
2,Controller層註解
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController(){
@Autowired
private UserService userService;
/**
* 保存
* @param User user;
* /
@PostMapping("/save")
public Boolean save(@RequestBody User user){
userService.save();
return true;
}
/**
* 分頁查詢
* /
@PostMapping("/list")
public Ipage<User> list(@RequestBody UserVo userVo){
IPage<User> userList = userService.list(userVo);
return userList;
}
@PostMapping("/info")
public Ipage<User> save( @RequestBody Map<String,String> map){
User user = userService.getinfo(map.get("id"));
return user;
}
@PostMapping("/update")
public Boolean update( @RequestBody User user){
return userService.update(user);
}
@PostMapping("/delete")
public Boolean delete( @RequestBody Map<String,String> map){
return userService.delete(map.get("id"));
}
@PostMapping("/exist")
public Boolean exist( @RequestBody Map<String,String> map){
return userService.exist(map.get("name"));
}
}
3,serivce層
public interface userService extends IService<User> {
/**
* 新增/編輯
* @param User
* @return
*/
Boolean save(User user);
}
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements userService {
@Autowired
private UserMapper userMapper;
/**
* 新增/編輯
*/
@Override
Boolean save(User user){
return true;
}
}
4,Dao/Mapper層
@Repository
public interface UserMapper extends BaseMapper<User> {
/**
* 搜索信息列表
*/
List<User> all(@Param("id") List<String> id);
}
5,重點講解QueryWrapper
@Autowired
private UserService userService;
@Autowired
private UserMapper userMapper;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(User.ID, Id);
List<User> List = userService.list(queryWrapper);
List<User> List = userMapper.list(queryWrapper);
service/mapper CRUD接口以及wapper條件構造器方法
使用 Wrapper 自定義SQL
方案一 註解方式 Mapper.java
@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
方案二 XML形式 Mapper.xml
<select id="getAll" resultType="MysqlData">
SELECT * FROM mysql_data ${ew.customSqlSegment}
</select>
6.分頁的利用
@Data
public class UserVo extends BasePageRequest{
@ApiModelProperty(name = "user", value = "成員",dataType = "User",notes = "成員")
private User user;
}
//組裝分頁查詢對象queryWrapper
public class UserserviceImpl extends ServiceImpl<UserMapper, User>
implements userService {
@Autowired
private UserMapper userMapper;
public IPage<User> getUserPage(UserVo userVo){
Page<User> page = new Page<User>(userVo.getPageNo(),userVo.getLimit());
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(User.IS_DELETED, Constant.IS_DELETE_FALSE);
IPage<User> userList = userMapper.selectPage(page, queryWrapper);
return userList;
}