SSM+springboot个人笔记(自用,持续更新)

重写tostring后不用加tostring方法。tostring是object下的方法。 如果没有重写tostring方法,会输出一个对象的地址值。

ORM映射(对象关系映射)

表名与类名不一定要相同
表中的字段要映射成类的属性

清空session绑定的数据 session.invalidate();

thymeleaf语法时间显示:${#dates.format(时间 , ‘yyyy-MM-dd HH:mm:ss’)}

@DateTimeFormat和@JsonFormat

@DateTimeFormat(pattern=“yyyy-MM-dd’T’HH:mm”)
DatetimeFormat是将String转换成Date,一般前台给后台传值时用
@JsonFormat(pattern = “YYYY-MM-dd HH:mm:ss”,timezone = “GMT+8”)
将时间作为json串从后端封装到前端时变成时间戳的时候 可以在pojo类时间对象上加上
@JsonFormat不仅可以完成后台到前台参数传递的类型转换,还可以实现前台到后台类型转换。
当content-type为application/json时,优先使用@JsonFormat的pattern进行类型转换。
而不会使用@DateTimeFormat进行类型转换。

加密算法

private String getMD5Pwd(String password,String salt){
String md5Pwd=password+salt;
//加密
for(int i=0;i<10;i++){
md5Pwd= DigestUtils.md5DigestAsHex(md5Pwd.getBytes());
}
return md5Pwd;

重定向怎么保存重定向之前传来的数据:

可以用RedirectAttributesModelMap model

JSP转译成一个Servlet文件,然后在编译成class文件

Mapper接口的方法不是随便定义的,与mapper.xml文件有映射关系

1.接口方法名与mapper.xml文件crud标签的id一致
2.接口方法需要传入的参数类型与mapper.xml的parameterType属性值是一致的
3.接口方法的返回值类型与mapper.xml的resultType的属性值是一致的
备注:假如在实现增删改操作的时候,那么resultType的返回值需不需要写(不需要写,默认int类型)
接口中select方法的返回值是list 不是实体类对象,映射文件的resultType是实体类对象

批量删除Maven本地仓库中未下载完成的jar包(不完整的jar包)

1、进入maven本地仓库地址:
CMD进入windows的路径(或在仓库目录的地址栏直接输入CMD,回车自动打开);
2、执行命令
for /r %i in (*.lastUpdated) do del %i

thymeleaf语法识别if或者&& ||等内容报错时,可以加上

/<![CDATA[*/ js代码块 /*]]>/

@TableName(“表名”)可以声明是哪张表。

想要不区分大小写 可以将字符串转成小写或大写比较 toLowerCase()

queryWrapper查的是数据库字段

list.size()可以判断集合是否为空

多个模糊查询

QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(“type”,“link”);
List list = linksMapper.selectList
(queryWrapper.like(“name”, context).or().like(“modify_time”, context));

页面不存在记得rebuild一下

页面名称和action形参名称不一致

你可以使用@RequestParam注解将请求参数绑定到你控制器的方法参数上

JDBC 编程有哪些不足之处,MyBatis 是如何解决这些问题的?

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
  2. Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变视频网站java 代码。
    解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离
  3. 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。解决: Mybatis 自动将 java 对象映射至 sql 语句。
  4. 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。解决:Mybatis 自动将 sql 执行结果映射至 java 对象。

Spring 事务隔离级别

Default:使用数据库本身的隔离级别 ORACLE(读已提交)Mysql(可重复读);
Read_Uncomited(脏读):读取过期的数据,就是一个事物读到另一个事务未提交的新数据,最低隔离级别,一切皆有可能;
Read_Commited(幻读):读取临时的数据,就是一个事物在进行修改全表的时候,另一个事务对数据进行了新增,从而第一个事务的执行完后发现还有没有修改的数据,就好像发生了幻觉一样;
RepeaTable_Read(不可重复读):就是在同一个事务中先后执行两条一样的 select 语句,之间没有执行过 Del 语句但先后结果不一样,这就是不可重复读;;
Serializable:串行化,最高隔离界别,杜绝一切隐患,但效率较低;

编程式事务管理

使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。
对于编程式事务管理,spring推荐使用TransactionTemplate。

<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

声明式事务管理

建立在AOP之上的。其本质是对方法前后进行拦截,
然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式事务最大的优点

就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,
只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。
和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。

如果客户端禁止 cookie 能实现 session 还能用吗?

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

IOC是什么?

IOC 控制反转 ,将创建对象和管理对象交给Spring 容器去实现

DI 依赖注入

DI的手段:set 注入 、构造器注入 、注解注入

区分构造函数注入和setter 注入。

构造函数注入没有部分注入,不会覆盖setter属性,任意修改都会创建一个新实例,适用于设置很多属性。
setter 注入有部分注入会覆盖setter 属性,任意修改不会创建一个新实例,适用于设置少量属性。

spring 框架的优势

IOC、 集成其他框架 、简化代码、解耦、AOP 切面编程

spring 框架底层涉及哪些设计模式?

单例模式、BeanFactory工厂模式(构建对象)、代理模式(AOP)、原型模式…

Spring框架底层实现核心技术是什么?

Java的反射机制

spring bean 容器的生命周期是什么样的?

spring bean 容器的生命周期流程如下:
Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean。
Spring 根据 bean 的定义填充所有的属性。
如果 bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到setBeanName 方法。
如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递
beanfactory 给 setBeanFactory 方法。
如果有任何与 bean 相关联的 BeanPostProcessors,Spring 会在
postProcesserBeforeInitialization()方法内调用它们。
如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调用此初始化方法。
如果有 BeanPostProcessors 和 bean 关联,这些 bean 的
postProcessAfterInitialization() 方法将被调用。
如果 bean 实现了 DisposableBean,它将调用 destroy()方法。

mybaits 的$ 和 #的区别?

#{}是预编译处理,${}是字符串替换。
#号 在取值的时候,如果传入的字符串类型,会自动给字符串添加引号 ,
而且# 在实际编译的过程中,会被转换成?,可以有效防止sql 的注入问题
$ 在取值的时候,如果传入的字符串类型,不会自动给字符串添加引号,而且有sql 注入的风险

mybatis 是如何实现数据持久化保存的?(依赖哪些对象完成)

Mybatis 依赖SqlSessionFactory 和 SqlSession

SqlSessionFactory 和 SqlSession 有什么区别?

SqlSessionFactory :实例唯一、线程安全、全局共享
SqlSession: 来用执行sql,线程是不安全的

mybatis 是否支持延迟加载?延迟加载的原理是什么?

Mybatis仅支持association(javaType)关联对象和collection(ofType)关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,
那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

MyBatis 实现一对一有几种方式?具体怎么操作的?

有联合查询和嵌套查询,
联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的 外键 id,再去另外一个表里面查询数据,也是通过 association 配置,
但另外一个表的查询通过 select 属性配置。

SpringMVC的五大组件或者SpringMVC的工作原理。

当客户端发起请求,首先经过DispatcherServlet(前端控制器)将请求分发给HandlerMapping(映射处理器)
,根据指定的controller,找到对应的Controller(控制器)组件处理请求,将得到的数据绑定在ModelAndView
组件中,最后通过ViewReslover(视图解析器) 解析数据与视图,渲染到页面上。

为什么要用 spring boot?

Spring Boot使编码变简单
Spring Boot使配置变简单
Spring Boot使部署变简单
Spring Boot使监控变简单
Spring的不足

Dashborad监控的时候 要在服务提供者控制器的请求上加@HystrixCommand

在springcloud中使用的是http协议,dubbo使用的是RPC协议

http和rpc协议的区别

1.HTTP协议会在表示层中进行加密,相对RPC协议安全。
2.HTTP协议在应用层经过三次握手,可用保证数据传输的准确性,但是效率较低。
3.RPC在会话层协议,传输效率相对较高,但是不能保证数据传输的准确性

properties 和 yml 中包含相同属性时,properties 文件优先级高于 yml 文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值