重写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 是如何解决这些问题的?
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
- Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变视频网站java 代码。
解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离 - 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。解决: Mybatis 自动将 java 对象映射至 sql 语句。
- 对结果集解析麻烦,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在会话层协议,传输效率相对较高,但是不能保证数据传输的准确性