SpringBoot e-commerce project mall (20k+star) address: https://github.com/macrozheng/mall
abstract
This paper mainly explains how mall integrates SpringBoot+MyBatis to build the basic skeleton, and takes commodity brand as an example to realize the basic CRUD operation and paging query through PageHelper.
mysql database environment construction
- Download and install version 5.7 of mysql, download address: https://dev.mysql.com/downloa...
- Setting database account password: root root
- Download and install the client connection tool Navicat, download address: http://www.formysql.com/xiaza...
- Create database mall
- Import mall database script, script address: https://github.com/macrozheng...
Introduction to Project Usage Framework
SpringBoot
SpringBoot allows you to quickly build Spring-based Web applications with built-in Web containers (such as Tomcat) that run by starting the main function of the entry program.
PagerHelper
MyBatis Paging Plug-in, a few lines of code to achieve paging, with SpringBook integration, as long as the integration of Pager Helper automatically integrated MyBatis.
PageHelper.startPage(pageNum, pageSize); //After that, the query will be paginated automatically. List<PmsBrand> brandList = brandMapper.selectByExample(new PmsBrandExample()); //Get paging information by constructing PageInfo objects, such as current page number, total page number, total bar number PageInfo<PmsBrand> pageInfo = new PageInfo<PmsBrand>(list);
Druid
alibaba open source database connection pool, known as the best database connection pool in Java language.
Mybatis generator
MyBatis's code generator can generate model, mapper.xml, mapper interface and Example based on the database. Normally, a single form query does not need to write mapper.
Project Construction
Initialize a SpringBook project using IDEA
Adding project dependencies
Add dependencies to pom.xml.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--SpringBoot Universal Dependency Module--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--MyBatis jPaginate--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency> <!--Integrate druid Connection pool--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- MyBatis generator --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.3</version> </dependency> <!--Mysql Database Driver--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> </dependencies>
Modify SpringBoot configuration file
Add the data source configuration and the mapper.xml path configuration of MyBatis in application.yml.
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root mybatis: mapper-locations: - classpath:mapper/*.xml - classpath*:com/**/mapper/*.xml
Project structure description
Mybatis generator configuration file
Configure database connection, Mybatis generator generates model, mapper interface and mapper.xml path.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <properties resource="generator.properties"/> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> <!-- Generating serialization methods for models--> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/> <!-- For generative Java Create a model toString Method --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!--You can customize the generation model Code comments--> <commentGenerator type="com.macro.mall.tiny.mbg.CommentGenerator"> <!-- Whether to remove automatically generated comments true: Yes: false:no --> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator> <!--Configure database connection--> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.connectionURL}" userId="${jdbc.userId}" password="${jdbc.password}"> <!--Solve mysql Driver upgrade to 8.0 The problem of not generating the specified database code later--> <property name="nullCatalogMeansCurrent" value="true" /> </jdbcConnection> <!--Specified Generation model Path--> <javaModelGenerator targetPackage="com.macro.mall.tiny.mbg.model" targetProject="mall-tiny-01\src\main\java"/> <!--Specified Generation mapper.xml Path--> <sqlMapGenerator targetPackage="com.macro.mall.tiny.mbg.mapper" targetProject="mall-tiny-01\src\main\resources"/> <!--Specified Generation mapper Path of interface--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.macro.mall.tiny.mbg.mapper" targetProject="mall-tiny-01\src\main\java"/> <!--Generate all tables tableName Set as%--> <table tableName="pms_brand"> <generatedKey column="id" sqlStatement="MySql" identity="true"/> </table> </context> </generatorConfiguration>
Running Generator's main function to generate code
package com.macro.mall.tiny.mbg; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * Code for MBG production * Created by macro on 2018/4/26. */ public class Generator { public static void main(String[] args) throws Exception { //Warning information during MBG execution List<String> warnings = new ArrayList<String>(); //When the generated code is duplicated, the original code is overwritten boolean overwrite = true; //Read our MBG configuration file InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); is.close(); DefaultShellCallback callback = new DefaultShellCallback(overwrite); //Create MBG MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); //Execute generated code myBatisGenerator.generate(null); //Output warning information for (String warning : warnings) { System.out.println(warning); } } }
Adding Java configuration for MyBatis
Paths for configuring mapper interfaces that need to be dynamically generated
package com.macro.mall.tiny.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; /** * MyBatis Configuration class * Created by macro on 2019/4/8. */ @Configuration @MapperScan("com.macro.mall.tiny.mbg.mapper") public class MyBatisConfig { }
Implementing the Interface in Controller
Implement the interface of adding, modifying, deleting and paging query in PmsBrand table.
package com.macro.mall.tiny.controller; import com.macro.mall.tiny.common.api.CommonPage; import com.macro.mall.tiny.common.api.CommonResult; import com.macro.mall.tiny.mbg.model.PmsBrand; import com.macro.mall.tiny.service.PmsBrandService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.List; /** * Brand Management Controller * Created by macro on 2019/4/19. */ @Controller @RequestMapping("/brand") public class PmsBrandController { @Autowired private PmsBrandService demoService; private static final Logger LOGGER = LoggerFactory.getLogger(PmsBrandController.class); @RequestMapping(value = "listAll", method = RequestMethod.GET) @ResponseBody public CommonResult<List<PmsBrand>> getBrandList() { return CommonResult.success(demoService.listAllBrand()); } @RequestMapping(value = "/create", method = RequestMethod.POST) @ResponseBody public CommonResult createBrand(@RequestBody PmsBrand pmsBrand) { CommonResult commonResult; int count = demoService.createBrand(pmsBrand); if (count == 1) { commonResult = CommonResult.success(pmsBrand); LOGGER.debug("createBrand success:{}", pmsBrand); } else { commonResult = CommonResult.failed("operation failed"); LOGGER.debug("createBrand failed:{}", pmsBrand); } return commonResult; } @RequestMapping(value = "/update/{id}", method = RequestMethod.POST) @ResponseBody public CommonResult updateBrand(@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrandDto, BindingResult result) { CommonResult commonResult; int count = demoService.updateBrand(id, pmsBrandDto); if (count == 1) { commonResult = CommonResult.success(pmsBrandDto); LOGGER.debug("updateBrand success:{}", pmsBrandDto); } else { commonResult = CommonResult.failed("operation failed"); LOGGER.debug("updateBrand failed:{}", pmsBrandDto); } return commonResult; } @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) @ResponseBody public CommonResult deleteBrand(@PathVariable("id") Long id) { int count = demoService.deleteBrand(id); if (count == 1) { LOGGER.debug("deleteBrand success :id={}", id); return CommonResult.success(null); } else { LOGGER.debug("deleteBrand failed :id={}", id); return CommonResult.failed("operation failed"); } } @RequestMapping(value = "/list", method = RequestMethod.GET) @ResponseBody public CommonResult<CommonPage<PmsBrand>> listBrand(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize) { List<PmsBrand> brandList = demoService.listBrand(pageNum, pageSize); return CommonResult.success(CommonPage.restPage(brandList)); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) @ResponseBody public CommonResult<PmsBrand> brand(@PathVariable("id") Long id) { return CommonResult.success(demoService.getBrand(id)); } }
Adding Service Interface
package com.macro.mall.tiny.service; import com.macro.mall.tiny.mbg.model.PmsBrand; import java.util.List; /** * PmsBrandService * Created by macro on 2019/4/19. */ public interface PmsBrandService { List<PmsBrand> listAllBrand(); int createBrand(PmsBrand brand); int updateBrand(Long id, PmsBrand brand); int deleteBrand(Long id); List<PmsBrand> listBrand(int pageNum, int pageSize); PmsBrand getBrand(Long id); }
Implementing Service Interface
package com.macro.mall.tiny.service.impl; import com.github.pagehelper.PageHelper; import com.macro.mall.tiny.mbg.mapper.PmsBrandMapper; import com.macro.mall.tiny.mbg.model.PmsBrand; import com.macro.mall.tiny.mbg.model.PmsBrandExample; import com.macro.mall.tiny.service.PmsBrandService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * PmsBrandService Implementation class * Created by macro on 2019/4/19. */ @Service public class PmsBrandServiceImpl implements PmsBrandService { @Autowired private PmsBrandMapper brandMapper; @Override public List<PmsBrand> listAllBrand() { return brandMapper.selectByExample(new PmsBrandExample()); } @Override public int createBrand(PmsBrand brand) { return brandMapper.insertSelective(brand); } @Override public int updateBrand(Long id, PmsBrand brand) { brand.setId(id); return brandMapper.updateByPrimaryKeySelective(brand); } @Override public int deleteBrand(Long id) { return brandMapper.deleteByPrimaryKey(id); } @Override public List<PmsBrand> listBrand(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); return brandMapper.selectByExample(new PmsBrandExample()); } @Override public PmsBrand getBrand(Long id) { return brandMapper.selectByPrimaryKey(id); } }
Project source address
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-01
Public Number
mall project In the whole series of learning courses, we pay attention to the first time acquisition of the public number.