记录ssm开发中遇到的简单易错问题

ssm项目开发中简单易踩坑问题(持续更新中)

      • 1. 通用mapper
      • 2. Interger()构造方法
      • 3. mysql模糊查询
      • 4. map接收前端数据
      • 5. produces="application/json"
      • 6. for循环中对象的创建
      • 7. 继承中的私有属性
      • 8.linux中tailf查看日志
      • 9.使用pageHelper时请求超过最大页数后还会返回数据
      • 10. Idea自带maven,为什么建议使用自己安装maven
      • 11.Jar包和war包的区别
      • 12. Idea创建Maven 项目后生成的几个目录:
      • 13. feign调用
      • 14.sql语句中join on 与where后跟条件的区别
      • 15. maven命令package install deploy的区别
      • 16. 数据库与缓存更新
      • 17. AOP中的ProceedingJoinPoint
      • 18. mybatis除了使用mapper.xml文件配置sql语句也可以使用注解(如@Update @Delete)来配置sql语句
      • 19.Bigdecimal类中的divide方法
      • 20. sql 语句的where条件的执行先后顺序
      • 21. 没有事务的方法中调用有事务的方法时失效
      • 22. mysql中DATE_FORMAT函数使索引失效

1. 通用mapper

表名默认使用类名,驼峰转下划线,如UserInfo默认对应的表名为user_info.
表名可以使用@Table(name = “tableName”)进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
可以使用@Column(name = “fieldName”)指定不符合第3条规则的字段名
使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用

2. Interger()构造方法

Interger()构造方法不能传入null,虽然编译不报错

3. mysql模糊查询

mysql语句中关于模糊查询:like后语句形如 “%”#{value}"%"

4. map接收前端数据

前端请求时发送json数据,还可以用map接收 前面加上@RequestBody

5. produces=“application/json”

@RequestMapping()中有属性produces=“application/json” 它的作用是指定返回值类型

6. for循环中对象的创建

下面的程序 Bom bom = new Bom()放在for循环外时,boms中add进去的会是同一个bom对象。下一次的for循环修改bom时会将之前boms中add进去的bom同时修改,应该将Bom bom = new Bom()放在for循环内

//将每一个配方物料实体封装成Bom
List boms = new ArrayList();
Bom bom = new Bom();
Material material=new Material();
  for (TempRecipeMaterial tempRecipeMaterial : tempRecipeMaterialList) {
        bom.setId(tempRecipeMaterial.getMaterialId());    //查询物料名字                  		     material=materialMapper.selectByPrimaryKey(tempRecipeMaterial.getMaterialId());
    bom.setUnit(material.getUnit());
    bom.setsName(material.getName());
    bom.setsNumber(tempRecipeMaterial.getMaterialNum());
    boms.add(bom);
}

7. 继承中的私有属性

如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
实例如下

public class Father {
    private String name;//私有属性
    private char sex;
    
    public void tell(){
        System.out.println(name+sex);
    }
    
    private void speak(){
        System.out.println(name+"is speaking!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

}

/**
 * 定义子类,子类中什么都不写。
 * @author CBS
 */
public class Child extends Father {

}


/**
 * 定义测试类
 * @author CBS
 */
public class Test {

    public static void main(String[] args) {
        
        Child c=new Child();
        c.tell();//tell方法是可以用的
        //c.speak();//报错,父类的私有方法不可见
    }

}

8.linux中tailf查看日志

tailf等同于tail -f -n 10(貌似tail -f或-F默认也是打印最后10行,然后追踪文件),与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件,所以tailf特别适合那些便携机上跟踪日志文件,因为它减少了磁盘访问,一般我使用ls * 关键词 * -lrt按时间倒叙列出文件名和详细信息,然后tailf 文件名 -n100查看

9.使用pageHelper时请求超过最大页数后还会返回数据

问题描述:在微服务里面做查询接口,用到pageHelper,数据库只有8行数据,pageNum=1&pageSize=10,pageNum=2&pageSize=10,pageNum=3&pageSize=10。。。返回的数据都是那8条。
原因:这是pageHelper里面自带的一个功能,叫做reasonable分页参数合理化,3.3.0以上版本可用,默认是false。 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页; 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据。
解决:一般项目里面加入,Spring Boot项目里面:pagehelper.reasonable=false

10. Idea自带maven,为什么建议使用自己安装maven

内嵌版本一般不是最新版本,最好是下载官方最新版本自行配置,这样既可以很方便地使用命令行进行打包编译等其他操作,对于以后的更新也是方便的
在命令行里打包, 直接运行项目都需要先安装好maven,
你也可以这样理解,先安装好maven才能执行mvn这个命令

11.Jar包和war包的区别

其实jar包和war包都可以看成压缩文件,用解压软件都可以打开,jar包和war包所存在的原因是,为了项目的部署和发布,通常把项目打包,通常在打包部署的时候,会在里面加上部署的相关信息。这个打包实际上就是把代码和依赖的东西压缩在一起,变成后缀名为.jar和.war的文件,就是我们说的jar包和war包。但是这个“压缩包”可以被编译器直接使用,把war包放在tomcat目录的webapp下,tomcat服务器在启动的时候可以直接使用这个war包。通常tomcat的做法是解压,编译里面的代码,所以当文件很多的时候,tomcat的启动会很慢。

说了这么多,还是没有讲jar包和war包的区别。jar包是java打的包,war包可以理解为javaweb打的包,这样会比较好记。jar包中只是用java来写的项目打包来的,里面只有编译后的class和一些部署文件。而war包里面的东西就全了,包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。

什么时候使用jar包或war包?当你的项目在没有完全完成的时候,不适合使用war文件,因为你的类会由于调试之类的经常改,这样来回删除、创建war文件很不方便,来回修改,来回打包,最好是你的项目已经完成了,不做修改的时候,那就打个war包吧,这个时候一个war文件就相当于一个web应用程序;而jar文件就是把类和一些相关的资源封装到一个包中,便于程序中引用。

12. Idea创建Maven 项目后生成的几个目录:

• .idea:是IDEA自动生成 ,.idea文件夹来存放项目的配置信息。其中包括版本控制信息、历史记录等等。如果你不小心删除它,下次它还会自动生成。
• External Libraries:外部的一些包。也就是通过Maven下载的包,JDK等等。可以通过pom.xml添加junit测试工具

13. feign调用

远程调用返回类型实际就是远程方法返回值转换成json,本地接收时使用的接受类保证能够将此json转成对象即可,也就是说保证接收类中存在相应属性名,跟后端接收前端json一样

14.sql语句中join on 与where后跟条件的区别

假设有两张表:

表1:tab2

id size
1 10
2 20
3 30

表2:tab2

size name
10 AAA
20 BBB
20 CCC

两条SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
第一条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size

tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)

2、再对中间表过滤
where 条件:
tab2.name=’AAA’

tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA

第二条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)

tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
on、where、having的区别

on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。根据上面的分析,可以知道where也应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。

但也不是说having没用,因为有时在步骤3还没出来都不知道那个记录才符合要求时,就要用having了。
在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢。
如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。
在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里

15. maven命令package install deploy的区别

package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

16. 数据库与缓存更新

更新数据库时的同时更新缓存,如果更新失败数据库回滚,但缓存不会回滚,会出现脏数据,建议更新数据库时直接删除缓存,查询时再添加缓存,或者先更新数据库确保成功后在更缓存

17. AOP中的ProceedingJoinPoint

AOP中的ProceedingJoinPoint是JoinPoint的子类,ProceedingJoinPoint新增了proceed方法,主要用在环绕通知中作为方法拦截后的执行.
ProceedingJoinPoint获取实参如下
Object[] args = point.getArgs();
获取形参如下
MethodSignature signature = (MethodSignature) point.getSignature();
Parameter[] parameters = signature.getMethod().getParameters();

18. mybatis除了使用mapper.xml文件配置sql语句也可以使用注解(如@Update @Delete)来配置sql语句

如下例
@Update(“update ${table} set version = version+1 where version = #{version} and id = #{id}”)
int update(@Param(“table”) String table, @Param(“id”) String id, @Param(“version”) int version);

19.Bigdecimal类中的divide方法

Bigdecimal类型的数据执行divide方法时必须在divide方法的第二个参数位加精度,否则如果出现10除以3除不尽的情况时会报错

20. sql 语句的where条件的执行先后顺序

sql 语句的where条件的执行先后顺序:mysql 从左到右 即过滤最多数据的条件放左边;Oracle 从右到左 即过滤最多数据的条件放右边

21. 没有事务的方法中调用有事务的方法时失效

JDK的动态代理。只有被动态代理直接调用时才会产生事务。在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象。而这里的this是EmployeeService真实对象而不是代理对象。

22. mysql中DATE_FORMAT函数使索引失效

mysql中使用在日期类字段上建立索引,如果对该字段使用DATE_FORMAT函数索引会失效,如下两条sql的birth_date索引会失效
select * from user where birth_date <= DATE_FORMAT(‘2009-10-10’,‘YYYY-mm-dd’);
select * from user where DATE_FORMAT(birth_date,‘YYYY-mm-dd’) <= ‘2019-10-10’;

你可能感兴趣的:(记录ssm开发中遇到的简单易错问题)