# MyBatisGeneratorCustom **Repository Path**: hexp97/MyBatisGeneratorCustom ## Basic Information - **Project Name**: MyBatisGeneratorCustom - **Description**: mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-11-13 - **Last Updated**: 2025-06-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Mybatis逆向工程 0 课程目标 - 使用Mybatis插件生成持久层代码 - Idea集成插件逆向生成代码 - 代码使用入门(CRUD) - SSM 的题目 1 MyBatis Generator 插件生成代码 参考 http://mybatis.org/generator/running/running.html 可以生成 POJO实体类、Mapper的接口、Mapper映射文件 1.1 逆向工程生成代码 1) 编写 Java代码 public class GeneratorSqlmap { public void generator() throws Exception{ List warnings = new ArrayList(); boolean overwrite = true; //指定 逆向工程配置文件 File configFile = new File("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } public static void main(String[] args) throws Exception { try { GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } } } 2)修改配置文件generatorConfig.xml 配置信息: http://mybatis.org/generator/running/runningWithMaven.html - 数据库连接的信息(IP、数据库名称、用户名、密码) - 生成PO类的位置和包名 - mapper映射文件生成的位置和包名 - mapper接口文件生成的位置和包名 - 指定数据库表 生成代码
3)运行代码即可生成 - Mapper接口中包含: // 根据条件查询总记录数 int countByExample(BrandExample example); // 根据条件删除 int deleteByExample(BrandExample example); // 根据主键删除 int deleteByPrimaryKey(Integer id); // 新增 int insert(Brand record); // 选择性新增 int insertSelective(Brand record); // 根据条件查询列表 List selectByExample(BrandExample example); // 根据主键查询当前对象 Brand selectByPrimaryKey(Integer id); // 根据条件 选择性修改 int updateByExampleSelective(@Param("record") Brand record, @Param("example") BrandExample example); // 根据条件修改 int updateByExample(@Param("record") Brand record, @Param("example") BrandExample example); // 根据主键 选择性修改 int updateByPrimaryKeySelective(Brand record); // 根据主键修改 int updateByPrimaryKey(Brand record); - Mapper接口对应的映射文件中已经帮我们写好 SQL语句 - POJO生成代码示例 public class Brand { private Integer id; private String name; private String image; private String letter; private Integer seq; // set/get 省略 } - XXXExample 条件的构建对象,目的是动态的构建查询条件的 public class BrandExample { // 排序字段 protected String orderByClause; // 去重 默认 false 不去重 protected boolean distinct; // 条件集合 protected List oredCriteria; } 1.2 逆向工程代码使用 1.2.1 完成条件查询 1)后端代码 service实现类 /** * 根据条件查询品牌列表带分页 * @param page 当前页 * @param size 一页显示记录数 * @param searchMap 条件 * @return 分页列表数据 */ @Override public Result findPage(Integer page, Integer size, Map searchMap) { // 1 参数校验 if (page == null) { page = 1; } if (size == null) { size = 5; } if (searchMap == null) { searchMap = new HashMap<>(); } // 2 处理业务逻辑 BrandExample example = new BrandExample(); BrandExample.Criteria criteria = example.createCriteria(); String name = searchMap.get("name"); if (!StringUtils.isEmpty(name)) { criteria.andNameLike("%"+name+"%"); } // ID 倒序 example.setOrderByClause("id DESC"); // 去重 example.setDistinct(true); // 分页设置只对 下面一条查询有效 PageHelper.startPage(page, size); List brands = brandMapper.selectByExample(example); PageInfo pageInfo = new PageInfo<>(brands); // 3 封装查询结果(人家要啥就给啥) PageResult pageResult = new PageResult<>(pageInfo.getTotal(), pageInfo.getList()); Result result = new Result(pageResult); return result; } controller @RestController @RequestMapping("brand") public class BrandController { @Autowired BrandService brandService; @PostMapping("findPage") public Result findPage(Integer page, Integer size, @RequestBody Map searchMap) { return brandService.findPage(page, size, searchMap); } } 2)前端代码 fetchData (){ axios.post(`/brand/findPage.do?page=${this.currentPage}&size=${this.size}`,this.searchMap).then(response => { if (response && response.data.success) { this.tableData = response.data.data.rows; this.total = response.data.data.total; } else { } }); } 1.2.2 新增 1)后端代码 service实现 /** * 新增 * * @param brand 品牌对象 * @return */ @Override public Result add(Brand brand) { // 1 参数校验 if (StringUtils.isEmpty(brand.getName())) { throw new RuntimeException("参数非法"); } // 将小写 转成 大写 if (!StringUtils.isEmpty(brand.getLetter())) { brand.setLetter( brand.getLetter().toUpperCase() ); } // .... // 2 业务 int i = brandMapper.insertSelective(brand); System.out.println(" 所影响行数: "+i); System.out.println(brand); // 3 封装结果 Result result = new Result(); return result; } controller实现 @PostMapping("add") public Result add( @RequestBody Brand brand) { return brandService.add(brand); } 2)前端代码 save (){ this.pojo.image= this.imageUrl; //如页面有图片上传功能放开注释 axios.post(`/brand/${this.pojo.id==null?'add':'update'}.do`,this.pojo).then(response => { this.fetchData (); //刷新列表 this.formVisible = false ;//关闭窗口 }); }, 1.2.3 修改 1)后端代码 service实现 /** * 根据ID查询品牌对象 * * @param id * @return */ @Override public Result findById(Integer id) { // 参数校验 // 业务逻辑 Brand brand = brandMapper.selectByPrimaryKey(id); if (brand == null) { return new Result(false, "无品牌数据", 11111); } // 封装返回结果 return new Result(brand); } /** * 根据ID更新 品牌对象 * * @param id * @param brand * @return */ @Override public Result edit(Integer id, Brand brand) { Result result = this.findById(id); if (result.isSuccess()) { brandMapper.updateByPrimaryKeySelective(brand); return new Result(); } return result; } controller /** * 根据ID查询品牌对象 * @param id * @return */ @GetMapping("findById") public Result findById(Integer id) { return brandService.findById(id); } /** * 根据ID更新 品牌对象 * @param id * @param brand * @return */ @PutMapping("edit") public Result edit(Integer id, @RequestBody Brand brand) { return brandService.edit(id, brand); } 2)前端代码 edit (id){ this.formVisible = true // 打开窗口 // 调用查询 axios.get(`/brand/findById.do?id=${id}`).then(response => { this.pojo = response.data; this.imageUrl=this.pojo.image //显示图片 如页面有图片上传功能放开注释 }) }, 1.2.1 删除 1)后端代码 service实现 /** * 根据ID 删除 * * @param id * @return */ @Override public Result delete(Integer id) { brandMapper.deleteByPrimaryKey(id); return new Result(); } controller实现 /** * 根据ID 删除 * @param id * @return */ @DeleteMapping("delete") public Result delete(Integer id) { return brandService.delete(id); } 2)前端代码 dele (id){ this.$confirm('确定要删除此记录吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then( () => { axios.get(`/brand/delete.do?id=${id}`).then(response => { this.fetchData (); //刷新列表 }) }) }, 1.3 Mybatis Maven插件 1) 添加 pom依赖 org.mybatis mybatis-spring 1.2.2 org.mybatis mybatis 3.2.8 mysql mysql-connector-java 5.1.6 fw org.mybatis.generator mybatis-generator-maven-plugin 1.3.2 src/main/resources/generatorConfig.xml true true org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 1.8 2)XML配置文件
3)点击插件运行生成代码