1. 通用mapper 与 springboot热部署冲突。

描述:出现xx类缺少xx方法
原因:类加载器不一样
解决方法:统一类加载器,或者换高版本的通用mapper

2. spring boot2 配置 FastJsonHttpMessageConverter 不起作用

描述:数据库数据为null时,前端显示也为null,不能显示空字符串
原因:SpringBoot 2.0.1版本中加载WebMvcConfigurer的顺序发生了变动,会优先执行MappingJackson2HttpMessageConverter,优先使用Jackson处理
解决方法: 指定FastJsonHttpMessageConverter在converters内的顺序converters.add(0,fastJsonHttpMessageConverter)

@Override
       public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
           //1.需要定义一个convert转换消息的对象;
           FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
           //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
           FastJsonConfig fastJsonConfig = new FastJsonConfig();
           fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
                   SerializerFeature.WriteMapNullValue,
                   SerializerFeature.WriteNullStringAsEmpty,
                   SerializerFeature.DisableCircularReferenceDetect,
                   SerializerFeature.WriteNullListAsEmpty,
                   SerializerFeature.WriteDateUseDateFormat);
   //        System.out.println("111111111111111111111111111111111111111111111111111111111");
           //3处理中文乱码问题
           List<MediaType> fastMediaTypes = new ArrayList<>();
           fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
           //4.在convert中添加配置信息.
           fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
           fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
           //5.将convert添加到converters当中.
           //指定 fastJson 执行顺序,不然可能会用 jsonfast SpringBoot 2.0.1版本中加载WebMvcConfigurer的顺序发生了变动
           // 故需使用converters.add(0, converter);指定FastJsonHttpMessageConverter在converters内的顺序,否则在SpringBoot 2.0.1及之后的版本中将优先使用Jackson处理
           converters.add(0,fastJsonHttpMessageConverter);
       }

3. 通用 mapper 逆向工程

  • 在mvn 下运行 mybatis-generator:generate -e
<!--逆向工程插件-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>src/main/resources/mybaits-generator/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                    <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-spring-boot-starter</artifactId>
                    <version>1.2.4</version>
                </dependency>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.47</version>
                        <!--<version>8.0.15</version>-->
                    </dependency>
                </dependencies>
            </plugin>
<?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>
    <context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!--分隔符 -->
        <!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <property name="autoDelimitKeywords" value="true"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 需要用到 myMapper 工具类 -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="cn.zxhysy.booksmall.util.mapper.MyMapper"/>
        </plugin>
        <!-- 高版本用:driverClass="com.mysql.cj.jdbc.Driver"-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/booksmall?serverTimezone=UTC"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!-- 对应生成的pojo所在包 -->
        <javaModelGenerator targetPackage="cn.zxhysy.booksmall.entity" targetProject="src/main/java"/>

        <!-- 对应生成的mapper所在目录 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>

        <!-- 配置mapper对应的java映射 -->
        <javaClientGenerator targetPackage="cn.zxhysy.booksmall.mapper" targetProject="src/main/java"
                             type="XMLMAPPER"/>

        <!-- 指定数据库表  多个表示,可用多个table标签-->
        <table  tableName="tb_admin" domainObjectName="Admin"></table>
        <table tableName="tb_user" domainObjectName="User"></table>
        <table tableName="tb_category" domainObjectName="BookCategory"></table>
        <table tableName="tb_book" domainObjectName="bookInfo"></table>
        <table tableName="tb_order_master" domainObjectName="OrderMaster"></table>
        <table tableName="tb_order_detail" domainObjectName="OrderDetail"></table>

    </context>
</generatorConfiguration>

4. 关于MGB逆向生成没有主键列的问题

  • mysql 驱动太高了, 换成 5.1.x版本
  • 添加属性,放首位<property name="javaFileEncoding" value="UTF-8"/>
  • 采用driverClass="com.mysql.jdbc.Driver"不要用 driverClass="com.mysql.cj.jdbc.Driver"

5. 有状态 session

5.1 Redis-session

  • 用户存储到 redis 缓存中,形成无状态回话
  • 便于扩展,当单体应用该扩展成集群会相对方便
  • 便于权限验证

6. 微信小程序 图片路劲拼接时 404

解决思路:

  • 可以在js时就需要手动拼接变量
  • 也可以在渲染层上加个 wx:if 判断是否存在该变量
<!-- 这里必须要判断下 book.icon 是否存在 因为再一开始渲染时,会先渲染 imgUrl(实际存在的data对象里面的属性) --> 
<block  wx:if="{{book.icon}}">
            <image src='{{imgUrl}}{{book.icon}}' class="goods-thumbnail" lazy-load="true"/>
          </block>

7. 跳转页面时,带上对象数据,对象数据中可能带有特殊字符,则会报错

解决思路:

  • 在传递前先用 JSON.stringify(item) 将对象序列化为字符串,再对字符串的特殊字符进行转义,用 encodeURIComponent(str)
let item2 = JSON.stringify(item)
    //这里需要将特殊符号进行转义,不然在转换 JSON格式的时候会报错
    // encodeURIComponent 转移字符串 主要是 书本描述
 item = encodeURIComponent(item2)
  • 在跳转的页面接收数据,先用 decodeURIComponent(str) 进行反转义,再用 JSON.parse(str) 转为对象
// 商品传递过来的数据
// 对对象的特殊数据进行反转义
let item = decodeURIComponent(options.item2)
const book = JSON.parse(item)
  • 最简单方式,重新请求一次

8. 通用mapper insertList 的巨坑

记录一个通用mapper的一个小坑,MySQLMapper的insertList方法中传入list时,这个Entity的主键必须为自增主键,否则他在执行sql是不会去插入主键,自然就会报一些奇怪的错误了,比如DB2的-407, 主键列没有默认值

9.浅谈微信小程序 this.setData

如果你学过 vue 那个你会知道,我们修改数组对象数据时,如果不用 vue 提供的操作数组的方法,在数组发生变化的时候,页面并没有重新渲染。同理 微信小程序也一样,当我们操作数组时,数组对象结构没法说改变的情况下,是不会重新渲染页面的,这是,我们就需要用 this.setData({OBJECT}) 告诉页面,我们这个OBJECT数据发生了变化,需要重新渲染

10.部署项目到服务器,在获取时间中有异常,数据库中存储的值没有错误,设置时也没错。获取时多了八个小时。

解决方法:在连接数据库的配置信息中,url 后面的 serverTimezone=UTC ——> 改为 serverTimezone=Asia/Shanghai 是由于时区问题。默认mysql是从时区0开始计算的