主要记录下项目过程中遇到的问题即解决方法

前置准备

通过Idea自带的创建springboot功能创建springboot工程,在pom.xml中导入mybatis-plus相关组件

创建Main作为代码生成器类,编写相关配置

  public class Main {
    public static void main(String[] args) {
        AutoGenerator autoGenerator = new AutoGenerator();
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL);
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("root");
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mmall?useUnicode=true&characterEncoding=UTF-8&useSSL=false");
        autoGenerator.setDataSource(dataSourceConfig);

        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOpen(true);
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
        globalConfig.setAuthor("wjh");
        globalConfig.setServiceName("%sService");
        autoGenerator.setGlobalConfig(globalConfig);

        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.wjh.mmall");
        packageConfig.setEntity("entity");
        packageConfig.setMapper("mapper");
        packageConfig.setController("controller");
        packageConfig.setService("service");
        packageConfig.setServiceImpl("service.impl");
        autoGenerator.setPackageInfo(packageConfig);

        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setEntityLombokModel(true);
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);

        List<TableFill> list = new ArrayList<>();
        TableFill tableFill1 = new TableFill("create_time", FieldFill.INSERT);
        TableFill tableFill2 = new TableFill("update_time",FieldFill.INSERT_UPDATE);
        list.add(tableFill1);
        list.add(tableFill2);
        strategyConfig.setTableFillList(list);
        autoGenerator.setStrategy(strategyConfig);

        autoGenerator.execute();

    }
}

生成如下图所示结构
image.png

连接MySQL是报错如图

image.png
解决方法修改mysql时区
image.png

启动类要加@MapperScan("com.wjh.mmall")注解否则报错

创建测试类进行第一次测试

MyBatis-Plus的mapper继承BaseMapper,他没有实现类,是通过cgLib运行时动态代理生成

@SpringBootTest
class ProductCategoryMapperTest {
    @Autowired
    private ProductCategoryMapper productCategoryMapper;
    @Test
  void test(){
      productCategoryMapper.selectList(null).forEach(System.out::println);
  }
}

查询成功:
image.png

商品动态多级关联展示

VO包

为避免一直对实体类修改,创建VO,是ViewObject的缩写
生成的VO不用创建mapper层接口(即DAO层),直接在Service层里进行封装处理

为什么控制层中传的是接口不是实现类?

我的理解是:①由于在Service层使用了@Service注解,致使Spring在启动时会自动扫描并把PCIImpt实现类添加到Bean容器中(在容器中该Bean的实例名称为pCIImpt,第一个字母小写);
②在Controller层里使用@Autowired注解,默认是使用byType在Bean容器瓶中查找出最适合的类的实例名赋值给pci(注意是按类来查找最适合的),在Bean容器瓶中最适合pci的Bean实例名称自然就是pCIImpt(因为它是PCI的接口实现类)
开发过程中遵循一个要遵循Controller–Service接口–ServiceImpt实现类–Mapper接口模式

@Autowire注解

image.png
这里由于实现类是自动装配的,会报错是正常的不影响,配置把对应的勾去掉即可不报错

ThymeLeaf的动态遍历语法

前端页面的ThymeLeaf语法熟悉下,根据后台返回数据动态显示

 <ul>
                        <li th:each="Lv1:${list}">
                            <div class="fj">
                                <span class="n_img"></span> <span class="fl" th:text="${Lv1.name}"></span>
                            </div>
                            <div class="zj">
                                <div class="zj_l">
                                    <div class="zj_l_c" th:each="Lv2:${Lv1.child}">
                                        <h2>
                                            <a href="/productList.html" th:text="${Lv2.name}"></a>
                                        </h2>
                                        <a href="/productList.html" th:each="Lv3:${Lv2.child}" th:text="${Lv3.name}"></a>

                                    </div>
                                   
                                </div>
                            </div>
                        </li>

                    </ul>

最终功能实现效果截图:

image.png

登陆功能

表单验证可以使用HTML5提供的required属性

image.png

使用原生jsp与使用th语法对比

原生jsp:

<%String u=(String)session.getAttribute("username"); 
			if(u==null){%>
			<div id="button-container">
				<button id="login" onClick="window.location.href='login.jsp'">登录</button>
				<button id="register" onClick="window.location.href='sign.jsp'">快速注册</button>
				<button id="guanli" onClick="window.location.href='Alogin.jsp'" style="margin-left: 10px;padding: 2px">网站管理</button>
			</div>
			<%}else{ %>
				<img alt="1" src="img/touxiang1.jpg" style="margin-left: -70px; width: 40px;height: 40px;border-radius:20px;">&nbsp;&nbsp;&nbsp;<%=session.getAttribute("username") %>&nbsp;<a href="login.jsp" id="zhuxiao" style="color: #000000;text-decoration: none;">【注销】</a>
			<%} %>

th语法:通过th:if属性操作

Q.E.D.