石家庄东美春宁公司
1.Mybatis中$
和#
区别
自我理解:#{}出来的字段会加上双引号,而${}出来的字段不会加双引号;${}一般用来传输表名;能用#尽量用#,最好不要用$
核心回答:#防止sql注入,$防不住sql注入
2.程序中异常如何处理
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常;finally为确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。
3.程序日志收集
采用slf4j作为日志API,采用logback作为日志输出工具,用slf4j桥接方式替换掉log4j和commons-logging。
采用trace(追踪)、debug(调试)、info(信息)、warn(警告)、error(错误)、fatal(致命)共6种日志级别。
采用dev(开发环境)、test(测试环境)、production(生产环境)等不同的日志配置,根据环境变量自动识别。
特殊的记录,需要大批量写入日志文件,应该采用异步线程写文件。
4.如何通过数据库进行数据恢复
mysql可以通过备份恢复文件 也可以用日志恢复数据
日志恢复教程:1.找到my.ini文件(在此文档里找到[mysqld]标签,并且在下面加上log-bin=binary-log这句话 log-bin操作符命令为开启日志文件
2.在mysql安装目录打开命令提示符,输入mysqlbinlog “C:\ProgramData\MySQL\MySQL Server 5.7\Data\binary-log.000001” --start-datetime=“2018-11-05 18:00:04.531” --stop-datetime=“2018-11-05 18:01:10.125” |mysql -u root -p
就可以恢复删除的数据了!
注意:当你误删一条数据,利用二进制日志恢复的时候你需要寻找的是 创建数据的那个节点(时间),而并非你删除数据的那个节点(时间)
当你回滚数据,回滚到删数据之前的数据库状态(只执行了stop-position 或者stop-datetime),那么在stop-position之后所有的数据库操作都将丢失所以你需要 start-position stop-position 回滚单条被删数据 (start-datetime为开始恢复的时间,stop-datetime为结束恢复的时间)
1、首先导入全备数据
mysql -h10.6.208.183 -utest2 -p123 -P3310 < test.sql,也可以直接在mysql命令行下面用source导入
2、恢复bin-log.000002
mysqlbinlog bin-log.000002 |mysql -h10.6.208.183 -utest2 -p123 -P3310
3、恢复部分 bin-log.000003
在general_log中找到误删除的时间点,然后更加对应的时间点到bin-log.000003中找到相应的position点,需要恢复到误删除的前面一个position点。
可以用如下参数来控制binlog的区间
--start-position 开始点 --stop-position 结束点
--start-date 开始时间 --stop-date 结束时间
找到恢复点后,既可以开始恢复。
mysqlbinlog mysql-bin.000003 --stop-position=208 |mysql -h10.6.208.183 -utest2 -p123 -P3310
5.数据库事务的特性
原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:如果事务执行之前数据库是一个完整的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整的状态。
数据库的完整状态:当一个数据库中的所有的数据都符合数据库中所定义的所有约束,此时可以称数据库是一个完整的状态。
隔离型:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
持久性:指一个事务一旦被提交,他对数据库的影响是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
补充:数据库三大范式
1、第一范式*(确保每列保持原子性)
2、第二范式(确保表中的每列都和主键相关)
3、第三范式(确保每列都和主键列直接相关,而不是间接相关)
6.springmvc的执行原理
根据request请求URL,循环遍历HandlerMapping列表获取包含Handler和HandlerInterceptor的HandlerExecutionChain对象;
然后通过HandlerExecutionChain对象内部Handler实例循环遍历HandlerAdapter列表获取适配器对象;
执行HandlerExecutionChain内部的所有拦截器HandlerInterceptor的preHandle方法,成功返回true,返回false直接return;
如果拦截器preHandle执行成功,再使用HandlerAdapter适配器去执行Handler的业务逻辑并返回一个ModelAndView对象;
执行所有拦截器postHandle方法;
通过ModelAndView对象的view属性的值(实际上就是viewName)从ViewResolver集合中获取View对象;
将ModelAndView中model数据渲染到View返回HTML基于response输出到终端;
执行所有拦截器的afterCompletion方法;
上述执行过程中如果出现未主动try catch的异常,都将被HandlerExceptionResolver捕获处理
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
7.什么是跨域 如何解决跨域
跨域:浏览器对于javascript的同源策略的限制,
同域:简单的解释就是相同域名,端口相同,协议相同
jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案,是一种依靠开发人员创造出的一种非官方跨域数据交互协议。
一个是描述信息的格式,一个是信息传递双方约定的方法。
8.springboot怎么简化了开发
(1)遵循“习惯优于配置”的原则,使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;
(2)项目快速搭建,可以无需配置的自动整合第三方的框架;
(3)可以完全不使用XML配置文件,只需要自动配置和Java Config;
(4)内嵌Servlet容器,降低了对环境的要求,可以使用命令直接执行项目,应用可用jar包执行:java -jar;
(5)提供了starter POM, 能够非常方便的进行包管理, 很大程度上减少了jar hell或者dependency hell;
(6)运行中应用状态的监控;
(7)对主流开发框架的无配置集成;
(8)与云计算的天然继承;
9.说几个springboot常用注解
使用@GetMapping注解描述参数获取方法
使用@Validated注解对参数进行校验
@RestController和@RequestMapping注解
10.spring的依赖注入控制反转
Spring的核心内容在于控制反转(IOC)和依赖注入(DI),所谓控制反转并非是一种技术,而是一种思想,在操作方面是指在spring配置文件中创建<bean>,依赖注入即为由spring容器为应用程序的某个对象提供资源,比如 引用对象、常量数据等。