Java小公司面试
1 跨域问题的解决
jsonp cors ningx反向代理(配置即可)
SpringBoot跨域问题如何解决?五种方法,趣味教学!_哔哩哔哩_bilibili
2Mysql增删改查语句
一.增Insert
(特殊的如果id自动递增的话,就不需要插入id)
基本语法 insert into 表名(列1,列2,列3,列4,...) values(值,值,值)
例子 insert into student(name,sex,age) values('张三',18,'男')
插入的另外一种形式:
insert into 表名 set 列=值,列=值,列=值,....
例子 insert into Set name = '张三',age=18
二.删delete
基本语法 delete from 表名 where 列=值
例子 delete from student where id=1
#DELETE from 表名 一行行删除整张表
# TRUNCATE table 表名 就是清空表
三.改update
基本语法 update 表名 set 列=值,列=值,.... where...
列子 update student set name = '张三' where id=1
四.查select
1.基本的select查询语句
select * from student(查询student表中所有列)
*代表代表所有列,要查询哪一列就把*改成哪一列,可以查询一列,也可以查询多列,多列用逗号隔开
from后面跟的是表名
查询的结果包含列名和每一列的数据
2.条件查询where
基本条件查询语句 select * from student where id =1(表示查询student表中id=1的学生的所有列)
where后跟查询条件,查询的如果是字符串,要带引号
多条件查询 如果是并且条件用and 或者用or
多条件查询例子:
查询出班级号为20201001班的学生并且要求是男生,年龄大于20
SELECT * from student where class_num = '20201001' and sex = '男' and age > 20
查询出班级号为20201001班的学生或者性别为女的学生
SELECT * from student WHERE class_num = '20201001' or sex = '女'
3.#去重查询 DISTINCT
例子:查询出表当中有哪些性别 SELECT DISTINCT sex FROM student
4.模糊查询重点 模糊查询可以实现搜索功能
基本语法 like 通配符
例子 select * from student where name like '%王' 表示模糊查询name以王结束的
select * from student where name like '王%' 表示模糊查询name以王开头的
select * from student where name like '%王%' 表示模糊查询name中包含王字的
5.排序查询 ORDER BY 倒序关键字DESC
默认排序规则是根据id进行排序,并且是id从小到大 SELECT * FROM student
例子 按照年龄从低到高进行排序
SELECT * FROM student ORDER BY age
按照年龄从高到低进行排序
SELECT * FROM student ORDER BY age DESC
6.分页查询
limit关键字 限定查询多少条数据
OFFSET关键字 从第几条数据开始查询 默认第一条数据是0
查询出第二页的数据,这一页有3条数据
SELECT * FROM student LIMIT 3 OFFSET 3
知道页数和每页查询的数据(固定)
SELECT * FROM student LIMIT 数据量 OFFSET 数据量 * (页数-1)
SELECT * from student LIMIT 0,3
LIMIT 0,3 limit后一个数据表示从第几条数据查起,后面数据是查询的条数
3Linux命令:在普通用户下把一个文件解压复制到根目录下的bin目录Linux命令:在普通用户下把一个文件解压复制到根目录下的bin目录
假设你有一个压缩文件 file.tar.gz
,并且你想将其内容解压并复制到 /bin
目录:
sudo tar -xzvf file.tar.gz -C / --strip-components=1 bin/ |
4面向对象的特性
一、封装性
封装性是面向对象的基础特性。它指的是将描述一个对象的属性和行为的代码封装在一个类中,使得这些属性和行为只能通过类提供的特定方法(如get、set方法)来访问和修改。封装性的好处在于可以隐藏类的内部实现细节,防止外部直接访问和修改类的内部数据,从而保护数据的完整性和安全性。同时,封装性也使得代码更加模块化,提高了代码的可维护性和重用性。
二、继承性
继承性是面向对象的关键特性。它指的是子类可以继承父类的属性和方法,从而可以重用父类中的代码。通过继承,子类可以扩展父类的功能,添加新的属性和方法,或者重写父类中的方法以适应特殊需求。继承性提高了软件的可重用性和可扩展性,使得开发者可以更加高效地构建复杂的应用程序。
三、多态性
多态性是面向对象的补充特性。它指的是允许将父类对象设置成为和一个或更多的它的子类对象相等的技术,赋值之后,父类对象就可以根据当前赋值给它的子类对象的特性以不同的方式运作。多态性增强了软件的灵活性和扩展性,使得开发者可以在不修改现有代码的情况下,通过添加新的子类来实现新的功能。多态性通常通过父类的引用指向子类的对象来实现,这种机制被称为向上转型。
四、抽象性
抽象性也是面向对象的一个重要特性。它指的是在定义类时,只关注对象的共性和本质特征,而忽略与当前主题和目标无关的那些方面。通过抽象,可以将现实世界中的复杂事物简化为更易于理解和处理的模型。抽象性使得开发者可以更加专注于问题的本质,而不是被具体的实现细节所困扰。
5springboot注解
一、核心注解
1. @SpringBootApplication
标注在主程序类上,表示这是一个Spring Boot应用的入口。它是一个复合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan。(我们一般不会主动去使用它)
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. @EnableAutoConfiguration
启用Spring Boot的自动配置机制,根据添加的依赖和配置文件自动配置Spring应用。
@EnableAutoConfiguration
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
3. @Configuration
标识一个类作为配置类,相当于传统的Spring XML配置文件。可以包含一个或多个@Bean方法。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
二、组件扫描和注入注解
4. @ComponentScan
指定要扫描的包,以便发现和注册Spring组件。默认情况下,扫描主应用类所在的包及其子包。
@ComponentScan(basePackages = "com.example")
public class MyApplication {
}
5. @Component
将一个类标识为Spring组件(Bean),可以被Spring容器自动检测和注册。通用注解,适用于任何层次的组件。
@Component
public class MyComponent {
}
6. @Service
标识服务层组件,实际上是@Component的一个特化,用于表示业务逻辑服务
@Service
public class MyService {
}
7. @Repository
标识持久层组件(dao层),实际上是@Component的一个特化,用于表示数据访问组件。常用于与数据库交互。
@Repository
public class MyRepository {
}
8. @Controller
标识控制层组件,实际上是@Component的一个特化,用于表示Web控制器。处理HTTP请求并返回视图或响应数据。
@Controller
public class MyController {
}
9. @RestController
标识RESTful Web服务的控制器,实际上是@Controller和@ResponseBody的结合。返回的对象会自动序列化为JSON或XML,并写入HTTP响应体中。
@RestController
public class MyRestController {
}
三、数据绑定和验证注解
10. @RequestMapping
映射HTTP请求到处理方法上(支持GET、POST、PUT、DELETE等)
@Controller
public class MyController {
@RequestMapping("/hello")
public String sayHello() {
return "hello";
}
}
11. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
映射HTTP 请求到处理方法上。
@RestController
public class MyRestController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
}
@GetMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.GET)
@PostMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.POST)
@PutMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
@DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
12. @ResponseBody
将方法的返回值转换为指定格式(如JSON、XML)作为HTTP响应的内容返回给客户端。常用于RESTful服务中。
@RestController
public class MyRestController {
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello, World!";
}
}
13. @RequestBody
将HTTP请求体的内容(如JSON、XML)转换为Java对象。常用于接收前端传递的数据。
@RestController
public class MyRestController {
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
四、其他常用注解
14. @Autowired
@Autowired用于自动注入依赖对象;@Qualifier用于指定注入特定名称的bean。
@Autowired
@Qualifier("baseDao")
private BaseDao baseDao;
15. @Resource
按名称装配bean,如果找不到则按类型装配。属于J2EE的注解。
@Resource(name = "baseDao")
private BaseDao baseDao;
16. @Scope
指定bean的作用域,如singleton、prototype等。
@Bean
@Scope("prototype")
public Person personPrototype() {
return new Person();
}
常见的 Spring Bean 的作用域:
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每一个 HTTP Session 会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
五、组合与扩展注解
除了上述常用的单一注解外,Spring还提供了一些组合注解和扩展注解,用于更细粒度地控制应用行为。以下是几个常见的组合与扩展注解:
1. @Transactional
用于声明事务性操作,确保方法在一个事务上下文中运行。如果方法执行失败,事务将被回滚。这对于需要保证数据一致性的操作非常有用。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void registerUser(String username, String password) {
User user = new User(username, password);
userRepository.save(user); // 如果这行代码出错,事务将回滚
}
}
2. @Scheduled
用于声明定时任务,可以让方法按照指定的时间规则运行。常用于需要定期执行某些操作的场景,如数据备份、定时清理等。
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000) //每5秒执行一次该方法
public void scheduleTask() {
System.out.println("Scheduled task executed");
}
}
3. @Async
用于声明异步方法,使得该方法在一个单独的线程中执行,不会阻塞调用者。这对于耗时操作非常有用,可以提高应用的响应速度。
@Service
public class AsyncService {
@Async
public CompletableFuture<Void> doAsyncTask() {
// 模拟长时间任务,如IO操作或复杂计算
try {
Thread.sleep(5000); // 模拟耗时任务
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture(null);
}
}
@Builder @Data @AllArgsConstructor
@Override @DataPermission({ @DataColumn(key = "deptName", value = "create_dept"), @DataColumn(key = "userName", value = "create_by") })
6mvc三层架构
dao即mapper
7BOVODTO
[quote]PO:
persistant object持久对象
最形象的理解就是一个PO就是数据库中的一条记录。
好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。[/quote]
[quote]BO:
business object业务对象
主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。[/quote]
[quote]VO :
value object值对象
ViewObject表现层对象
主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。[/quote]
[quote]DTO :
Data Transfer Object数据传输对象
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO
8Bean的作用域
作用域的种类
Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。Spring3 为 Bean 定义了五种作用域,具体如下。
1)singleton
单例模式,使用 singleton 定义的 Bean 在 Spring 容器中只有一个实例,这也是 Bean 默认的作用域。
2)prototype
原型模式,每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例。
3)request
在一次 HTTP 请求中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Request 内有效。
4)session
在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Session 内有效。
5)global Session
在一个全局的 HTTP Session 中,容器会返回该 Bean 的同一个实例。该作用域仅在使用 portlet context 时有效。
在上述五种作用域中,singleton 和 prototype 是最常用的两种,接下来将对这两种作用域进行详细讲解。
9Spring框架中广泛运用了多种设计模式
Spring框架中的设计模式
-
工厂模式(Factory Pattern)
- 用途:Spring通过BeanFactory和ApplicationContext等接口创建并管理对象实例。
- 实现:BeanFactory是一个工厂接口,提供了获取Bean对象的方法(如getBean(String name))。ApplicationContext是BeanFactory的子接口,提供了更多高级功能,如国际化、事件传播和自动Bean注入等。
-
单例模式(Singleton Pattern)
- 用途:Spring框架中的Bean默认是单例的,即在容器中只有一个实例。这种单例模式的设计有助于节省资源并提高性能。
- 实现:当Spring容器启动时,会为每个作用域为singleton的Bean创建并维护一个单实例对象,这些对象会被存储在一个缓存中,从而确保每次注入时都是同一个实例。
-
代理模式(Proxy Pattern)
- 用途:Spring的AOP(面向切面编程)功能大量使用了代理模式。AOP通过在目标方法执行前后添加额外的行为(如日志、事务管理等),而这些额外的行为是通过代理对象来实现的。
- 实现:Spring提供了两种代理方式:JDK动态代理和CGLIB代理。如果目标类实现了一个接口,Spring默认使用JDK动态代理;如果没有实现接口,则使用CGLIB来生成子类代理。
-
模板方法模式(Template Method Pattern)
- 用途:用于定义一个操作的算法骨架,将一些步骤推迟到子类中去实现。Spring框架在JDBC、Hibernate、JPA、事务管理等模块中都使用了模板方法模式。
- 实现:例如,JdbcTemplate类使用模板方法模式来封装与数据库交互的步骤。开发者只需提供SQL语句和参数,而不必关心资源获取、异常处理和资源释放等细节。
-
观察者模式(Observer Pattern)
- 用途:Spring框架中的事件驱动机制使用了观察者模式。通过观察者模式,Spring框架实现了事件的发布和订阅机制,使得组件之间可以更加灵活地进行通信和协作。
- 实现:ApplicationEventPublisher是一个事件发布者,ApplicationListener是一个事件监听器。Spring容器允许多个监听器订阅和监听特定类型的事件,当事件发生时,所有订阅的监听器都会收到通知。
-
策略模式(Strategy Pattern)
- 用途:用于定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,提高了代码的可拓展性,降低了耦合度。
- 实现:Spring框架在很多地方使用策略模式,例如在事务管理中使用不同的事务管理策略(如JDBC、JTA),在视图解析器(ViewResolver)中使用不同的视图解析策略(如JSP、Thymeleaf)。
-
适配器模式(Adapter Pattern)
- 用途:用于将一个接口转换为客户希望的另一个接口。
- 实现:在Spring MVC中,HandlerAdapter用于将不同的处理器(Handler)适配为统一的接口。例如,HttpRequestHandlerAdapter和SimpleControllerHandlerAdapter分别适配HttpRequestHandler和Controller,使得Spring MVC可以支持多种不同类型的控制器。
-
装饰器模式(Decorator Pattern)
- 用途:用于动态地为对象添加行为而不改变其结构。Spring使用装饰器模式来增强Bean的功能。
- 实现:在Spring AOP中,代理对象(代理类)就是对目标对象的增强(装饰),可以动态地为目标对象添加新的行为(如方法拦截、日志记录、事务管理等)。
-
依赖注入和控制反转(Dependency Injection and Inversion of Control)
- 用途:依赖注入(DI)模式用于将对象的依赖关系从内部转移到外部,使得对象更加解耦并且易于测试。控制反转(IoC)则是指将对象的创建和依赖关系的管理交给Spring容器,从而实现了对象的解耦。
- 实现:Spring通过XML配置、注解或Java配置类等方式,自动为Bean提供它们所需的依赖项。依赖注入主要有两种方式:构造函数注入和setter方法注入。
单例模式的使用场景
在Spring框架中,单例模式的应用场景非常广泛,主要包括以下几个方面:
- 节省资源:单例模式确保一个类只有一个实例,减少了内存开销和对象创建的开销。这对于那些需要频繁创建和销毁的对象来说,可以显著提高性能。
- 全局访问:单例实例可以在整个应用程序中全局访问,方便共享数据和状态。例如,数据库连接池、配置信息等,通常只需要一个全局的实例来管理。
- 无状态服务:适用于无状态的服务类,例如业务逻辑处理类、数据访问对象(DAO)等。这些类通常不需要维护任何状态信息,因此可以安全地共享一个实例。
- 共享资源:适用于需要在整个应用程序中共享的资源,例如配置类、缓存类等。通过单例模式,可以确保这些资源在应用程序中的唯一性和一致性。
总之,在Spring框架中,单例模式是一种非常重要的设计模式,它有助于节省资源、提高性能、实现全局访问和共享资源等功能。
10nacos
Nacos的默认端口和数据库信息如下:
默认端口
Nacos的默认端口是8848。在启动Nacos服务时,通常会使用这个端口进行通信。如果计算机上的其他进程已经占用了8848端口,可以尝试关闭该进程,或者修改Nacos的配置文件,将端口改为其他未被占用的端口。
数据库
Nacos默认使用的是Derby数据库。Derby是一种嵌入式数据库,无需单独部署,当Nacos启动时会自动加载并使用它。然而,需要注意的是,Derby数据库主要用于单机测试环境,因为它不支持高并发和大数据量的场景。
在生产环境中,为了确保性能和稳定性,Nacos推荐使用外置的数据库,如MySQL。如果需要将Nacos配置为使用MySQL数据库,可以按照以下步骤进行操作:
- 准备MySQL数据库:确保有一个可用的MySQL服务器,并创建好用于Nacos的数据库实例。
- 修改Nacos配置文件:打开Nacos配置文件(通常位于conf目录下,如application.properties),根据实际情况修改数据库连接信息。例如,需要设置数据库类型为mysql,并提供数据库的URL、用户名和密码等信息。
- 重启Nacos服务器:保存配置更改后,重新启动Nacos服务器,以便它能够连接到新的MySQL数据库。
通过以上步骤,可以将Nacos从使用内置的Derby数据库切换到更适用于生产环境的MySQL数据库。
11子父组件传值
子组件操作
子组件中的代码与 Vue2 类似,使用watch监听数据变化并通过emit提交自定义事件。
父组件操作
在 Vue3 中,可以使用setup函数来接收子组件传递过来的数据。在setup函数中,使用on方法来监听自定义事件,并将接收到的数据赋值给一个响应式变量。