- 1.java之mybatis之占位符
- 2.MyBatis中井号与美元符号的区别
- {变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为jdbc的类型。select from tablename where id = #{id}
假设id的值为12,其中如果数据库字段id为字符型,那么#{id}表示的就是’12’,如果id为整型,那么id就是12,并且MyBatis会将上面SQL语句转化为jdbc的select from tablename where id=?,把?参数设置为id的值。 - 方式能够很大程度防止sql注入。
1.java之mybatis之占位符
1.mybatis中有两种占位符 #{}和 ${}.
2. #{} 占位符是为了获取值,获取的值用在 where 语句后,insert 语句后,update 语句。
#{} 获取值,是根据值的名称取值。#{} 可以使用3中类型的值填充。
a) 参数是基本数据类型。那么在映射的语句中可以不写 parameterType, #{} 中的参数名也可以随意些。
b) 参数是自定义类型。必须填写 parameterType , #{} 中名称是自定义类型的属性名,该属性有对应的 get 方法。如果没有get方法,那么会根据反射去获取该类型的值,如果找不到,那么报 ReflectionException 异常。
c) 参数可以是 map 类型。#{} 中的名称 map 中的 key 值即可。
#{} 也有不能处理的问题
不能作为表名
Select from #{tablename}
也不能作为列名
Select from t_user order by #{as}
3. ${} 占位符是字符串连接符,可以动态获取相关值。
能从 properties 文件中获取值,也可以作为表名,列名等值。
${} 占位符参数只能使用自定义类型和 map 类型。
1、#{变量名}可以进行预编译、类型匹配等操作,
2、#{变量名}会转化为jdbc的类型。
3、${变量名}不进行数据类型匹配,直接替换。
4、#方式能够很大程度防止sql注入。
5、$方式无法方式sql注入。
6、$方式一般用于传入数据库对象,例如传入表名。
7、尽量多用#方式,少用$方式。
8、#会自动加双引号,$不会加双引号
2.MyBatis中井号与美元符号的区别
{变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为jdbc的类型。select from tablename where id = #{id}
假设id的值为12,其中如果数据库字段id为字符型,那么#{id}表示的就是’12’,如果id为整型,那么id就是12,并且MyBatis会将上面SQL语句转化为jdbc的select from tablename where id=?,把?参数设置为id的值。- ${变量名}不进行数据类型匹配,直接替换。select from tablename where id = ${id}
如果字段id为整型,sql语句就不会出错,但是如果字段id为字符型, 那么sql语句应该写成select from table where id = ‘${id}’。 方式能够很大程度防止sql注入。
- $方式无法方式sql注入。
- $方式一般用于传入数据库对象,例如传入表名。
- 尽量多用#方式,少用$方式。
3.spring注入实例bean的几种方式
spring要从容器中取出bean来,然后注入到另一个bean中去。这里有哪几种方式。
1.autowire 注解
即标识符就是bean的名字。这个需要autowire的后置处理器。
2.set方法注入
即添加属性后,只需要给该属性添加一个set方法即可。然后在xml文件中注入的时候,配置property属性进行注入,即property name=”beanname” value=””或者ref=“”某个bean。
3.构造器注入
即通过构造函数传入,这样就不需要set方法。传入的时候就是在xml文件中配置
其实也是类似set方式注入的。4.Spring中 @Autowired注解与@Resource注解的区别
相同点:
@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
不同点:
(1)提供方:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
(2)注入方式:@Autowired只按照byType 注入;@Resource默认按byName自动注入,也提供按照byType 注入;
(3)属性:@Autowired按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
推荐使用@Resource注解在字段上,这样就不用写setter方法了.并且这个注解是属于J2EE的,减少了与Spring的耦合,这样代码看起就比较优雅 。
5.@RequestBody与@RequestParam
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、
数组、集合、对象等等(即:当,@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收
参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value
里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。
即:如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到;
如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或
则形参前 什么也不写也能接收。
注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通
过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400。
注:如果参数前不写@RequestParam(xxx)的话,那么就前端可以有可以没有对应的xxx名字才行,如果有xxx名
的话,那么就会自动匹配;没有的话,请求也能正确发送。
追注:这里与feign消费服务时不同;feign消费服务时,如果参数前什么也不写,那么会被默认是
@RequestBody的。
参数相关注解
@PathVariable:
@PathVariable 映射 URL 绑定的占位符
用于获取URL中的参数:一般{ }中的变量名与方法中的形参名一致(可以不加@PathVariable注解)
如果名称不一致则写成:否则不单单是获取不到参数,连方法都不执行!
6.spring-boot @Component和@Bean的区别详解
1、@Component 是用在类上的
@Component
public class Student {
private String name = "lkm";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、@Bean 需要在配置类中使用,即类上需要加上@Configuration注解
@Configuration
public class WebSocketConfig {
@Bean
public Student student(){
return new Student();
}
}
如果你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加
@Component注解的,因此就不能使用自动化装配的方案了,但是我们可以使用@Bean。
@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
@Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
@Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
@Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
7.MyBatis 插件之拦截器(Interceptor)
MyBatis的拦截器顾名思义,就是对某些操作进行拦截。通过拦截器可以对某些方法执行前后进行拦截,添加一些处理逻辑。
MyBatis的拦截器可以对Executor、StatementHandler、PameterHandler和ResultSetHandler 接口进行拦截,也就是说会对这4种对象进行代理。
拦截器设计的初衷就是为了让用户在MyBatis的处理流程中不必去修改MyBatis的源码,能够以插件的方式集成到整个执行流程中。
比如MyBatis中的Executor有BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor,如果这几种实现的query方法都不能满足你的 需求,我们可以不用去直接修改MyBatis的源码,而通过建立拦截器的方式,拦截Executor接口的query方法,在拦截之后,实现自己的query方法逻辑。
8.dubbo的调用流程
https://zhuanlan.zhihu.com/p/264935586(dubbo面试题网址)
首先服务提供者 Provider 启动然后向注册中心注册自己所能提供的服务。
服务消费者 Consumer 启动向注册中心订阅自己所需的服务。然后注册中心将提供者元信息通知给 Consumer, 之后 Consumer 因为已经从注册中心获取提供者的地址,因此可以通过负载均衡选择一个 Provider 直接调用 。
之后服务提供方元数据变更的话注册中心会把变更推送给服务消费者。
服务提供者和消费者都会在内存中记录着调用的次数和时间,然后定时的发送统计数据到监控中心。
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
9.SpringBoot中Starter的作用是什么
1、springboot项目中pom.xml文件中首先引入web的Starter。
2、引入完毕之后,我们发现,陆陆续续的下载了很多jar包。通过查看maven依赖,来看看项目现在有哪些jar包被引入了进来。
通过上面的依赖图发现,web的Starter给我们提供了webmvc、web、tomcat和json的能力,那么,也就能够解释为什么我们自己没有去配置tomcat,项目却可以自己跑起来的原因了。10.依赖注入(Dependency Injection) DI
组件之间的依赖关系由容器在运行期间决定,即由容器动态的将某个依赖关系注入到组件中;
依赖注入的目的不在于为软件系统提供更多的功能,它的主要目的在于提升组件重用的频度,并为软件搭建一个灵活,可扩展的平台,通过依赖注入,我们只需要简单的配置,不需要任何代码就可以指定目标的资源,完成自身的业务逻辑,不需要关心具体的资源来自何处有谁实现;
谁依赖谁:当然是应用程序依赖于IoC容器;
为什么需要依赖:因为应用程序需要IOC容器提供对象需要的外部资源
谁注入了谁:很明显是IOC容器注入了应用程序的某个对象,它所依赖的对象
注入了什么:注入了需要的外部资源(包括对象,常量数据,资源)
11.springcloud alibaba组件
https://www.yuque.com/feri/fwibdh/dny0co(老邢微服务)
服务限流降级(Sentinel):把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
服务注册与发现(Nacos):更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
分布式配置管理(Nacos):支持分布式系统中的外部化配置,配置更改时自动刷新
消息驱动能力(RocketMQ):一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务,RabbitMQ
分布式事务(Seata):使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储(OSS):阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度(SchedulerX):提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。Spring Task
阿里云短信服务(SMS):覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
声明式服务调用(Openfeign):一种声明式、模板化的HTTP客户端,不是阿里的组件
网关中心(Gateway):是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问,不是阿里的组件
Sleuth+Zipkin服务链路跟踪:Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案.其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。
12.
[
](https://blog.csdn.net/weixin_39976748/article/details/111392611)