表名默认使用类名,驼峰转下划线,如UserInfo默认对应的表名为user_info.
表名可以使用@Table(name = “tableName”)进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
可以使用@Column(name = “fieldName”)指定不符合第3条规则的字段名
使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用
Interger()构造方法不能传入null,虽然编译不报错
mysql语句中关于模糊查询:like后语句形如 “%”#{value}"%"
前端请求时发送json数据,还可以用map接收 前面加上@RequestBody
@RequestMapping()中有属性produces=“application/json” 它的作用是指定返回值类型
下面的程序 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);
}
如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
实例如下
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();//报错,父类的私有方法不可见
}
}
tailf等同于tail -f -n 10(貌似tail -f或-F默认也是打印最后10行,然后追踪文件),与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件,所以tailf特别适合那些便携机上跟踪日志文件,因为它减少了磁盘访问,一般我使用ls * 关键词 * -lrt按时间倒叙列出文件名和详细信息,然后tailf 文件名 -n100查看
问题描述:在微服务里面做查询接口,用到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
内嵌版本一般不是最新版本,最好是下载官方最新版本自行配置,这样既可以很方便地使用命令行进行打包编译等其他操作,对于以后的更新也是方便的
在命令行里打包, 直接运行项目都需要先安装好maven,
你也可以这样理解,先安装好maven才能执行mvn这个命令
其实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文件就是把类和一些相关的资源封装到一个包中,便于程序中引用。
• .idea:是IDEA自动生成 ,.idea文件夹来存放项目的配置信息。其中包括版本控制信息、历史记录等等。如果你不小心删除它,下次它还会自动生成。
• External Libraries:外部的一些包。也就是通过Maven下载的包,JDK等等。可以通过pom.xml添加junit测试工具
远程调用返回类型实际就是远程方法返回值转换成json,本地接收时使用的接受类保证能够将此json转成对象即可,也就是说保证接收类中存在相应属性名,跟后端接收前端json一样
假设有两张表:
表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进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
更新数据库时的同时更新缓存,如果更新失败数据库回滚,但缓存不会回滚,会出现脏数据,建议更新数据库时直接删除缓存,查询时再添加缓存,或者先更新数据库确保成功后在更缓存
AOP中的ProceedingJoinPoint是JoinPoint的子类,ProceedingJoinPoint新增了proceed方法,主要用在环绕通知中作为方法拦截后的执行.
ProceedingJoinPoint获取实参如下
Object[] args = point.getArgs();
获取形参如下
MethodSignature signature = (MethodSignature) point.getSignature();
Parameter[] parameters = signature.getMethod().getParameters();
如下例
@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);
Bigdecimal类型的数据执行divide方法时必须在divide方法的第二个参数位加精度,否则如果出现10除以3除不尽的情况时会报错
sql 语句的where条件的执行先后顺序:mysql 从左到右 即过滤最多数据的条件放左边;Oracle 从右到左 即过滤最多数据的条件放右边
JDK的动态代理。只有被动态代理直接调用时才会产生事务。在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象。而这里的this是EmployeeService真实对象而不是代理对象。
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’;