校招面经

记一次校招

今天参加了广东工业大学的校招,面了好几家企业,大中小的都有。主要是Java开发方向,和一个Web前端方向的。回来就总结一下面试的问题和经验吧。

数据库

面的第一家是工厂,主要是软件开发和数据库开发。一开始只是跟HR聊,聊聊待遇和工作地点,学习过什么,实习做过什么。然后马上就把简历发给技术部的了。然后就给我来了场电话面试。问的主要都是数据库的问题。都用什么数据库开发啊,有过什么编程的经历啊,最主要感觉还是问一些关于数据库代码的问题。

  • 关于JDBC
    如果没有MyBatis,Hibernate这些框架,就要用到jdbc来连接数据库
    校招面经_第1张图片
    我自己之前就是用这种两层的,容易理解而且易入门。
    在这个架构中,JDBC来访问数据库,就要用到Driver来与数据库交互(这个面试的时候好像紧张忘说了。。)
import java.sql.DriverManager;

Class.forName("com.mysql.jdbc.Driver");

这样就是一个JDBC的驱动了。
然后用户命令传给数据库或者查询数据返回来,就通过JDBC来完成,整个流程都清清楚楚,但是每次用都要配置很多东西,还要在JDBC写SQL语句,虽然很好理解连接数据库的流程,但是代码量也挺大的,非常不方便。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DbUtil{
	public static final String URL = "jdbc:mysql//localhost:3306";
	public static final String User = "username";
	public static final String Password = "password";
	
	 public static void main(String[] args) throws Exception {
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
        Connection connection= DriverManager.getConnection(URL, User, Password);
        //3.操作数据库,实现增删改查
        Statement statement= connection.createStatement();
        ResultSet resultset = statement.executeQuery("SELECT user_name, age FROM table");
        //如果有数据,rs.next()返回true
        while(resultset .next()){
            System.out.println(resultset .getString("user_name")+" 年龄:"+resultset .getInt("age"));
        }
    }
}

这就是jdbc的一个实例,具体的增删查改有空再写

  • 数据库查询语句
  1. Foreign Key

这个其实并不是很难,但用习惯了Hibernate和Mybatis这些,确实查询语句很多都记不清了,确实要回顾一下。

比如问我:我需要一句话,查询一个表里所有的男生的成绩总和,女生的成绩总和,要怎么写

SELECT sexual, SUM(score_table.score) AS score_sum FROM score_table GROUP BY sexual

并且,还有关系数据库必须要会的Foreign Key约束
比如下面两个表
Peresons表:

P_Id FirstName LastName Address City
1 Kong York Road101 Hitnam
2 Lin Lilian Road201 NewYork
3 Yang Bruce Road301 SaltLake

Orders表:

O_Id OrderNo P_Id
1 1234234 3
2 51235 2
3 213123 2
4 1241231 1

~“Orders” 表中的 “P_Id” 列指向 “Persons” 表中的 “P_Id” 列。
“Persons” 表中的 “P_Id” 列是 “Persons” 表中的 PRIMARY KEY。

“Orders” 表中的 “P_Id” 列是 “Orders” 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的行为。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

CREATE TABLE Orders(
O_Id int NOT NULL AUTO_INCREMENT,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
  1. Left Join

校招面经_第2张图片

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

SSM的优点

这个问题虽然有所准备,但一紧张说起来就真的开始哑巴了。可能还是对SSM框架不够熟悉,用的不够多吧。
SSM(Spring,Spring MVC, MyBatis)是我Java Web经过初步学习之后的入门框架,但是我竟然对他们的优点如此不熟悉。。我愧对苍天愧对大地啊愧对父母的养育之恩。
所以我在这里总结一下,防止日后再忘。

以下摘自CSDN博主,JFBom
原文:https://blog.csdn.net/lsj741223/article/details/80805110

从三个方面分析:

  1. Spring的优势

    通过Spring的IOC特性,将对象之间的依赖关系交给了Spring控制,方便解耦,简化了开发
    通过Spring的AOP特性,对重复模块进行集中,实现事务,日志,权限的控制提供了对其他优秀开源框架的集成支持

  2. Spring MVC的优势:
    SpringMVC是使用了MVC设计思想的轻量级web框架,对web层进行解耦,使我们开发更简洁
    与Spring无缝衔接
    灵活的数据验证,格式化,数据绑定机制

  3. Mybatis的优势:
    数据库的操作(sql)采用xml文件配置,解除了sql和代码的耦合
    提供映射标签,支持对象和和数据库orm字段关系的映射,支持对象关系映射标签,支持对象关系的组建
    提供了xml标签,支持动态的sql

关于数据库的锁

数据库锁就是为了处理并发问题的,为了防止诸如“脏读”、“不可重复读”、“丢失修改”,就会有很多的锁,像共享锁、排它锁、互斥锁、写锁、读锁、悲观锁、乐观锁等等。
在说这些锁之前呢,要先了解事务的特性,事务必须满足ACID,就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

关于重载

一个类中如果存在同名的方法,但是参数类型和参数不能相同,这样体现了Java中的多态(重载)

public class Overload{
	public int load(){
		System.out.println("test1");
		return 1;
	}
	public void load(int a){
		System.out.println("test2");
	}
	//下面两个参数类型顺序不同
	public String load(int a, String s){
		System.out.println("test3");
		return "test3";
	}
	public String load(String s, int a){
		System.out.println("test4");
		return "test4";
	}
	public static void main(String[] args){
		Overloading overload = new Overloading();
		System.out.println(overload.load);
		overload.load(1);
		System.out.println(overload.load(1,"test3"));
		System.out.println(overload.load("test4",1));
	}
}

Java线程生命周期

线程可以分为4个状态:
New(新生),
Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running。
blocked(被阻塞),
Dead(死亡)。
校招面经_第3张图片

// 开始线程  
public void start( );  
public void run( );  
 
// 挂起和唤醒线程  
public void resume( );     // 不建议使用  
public void suspend( );    // 不建议使用  
public static void sleep(long millis);  
public static void sleep(long millis, int nanos);  
public final native void wait() throws InterruptedException;
public final native void notify();
public final native void notifyAll();
 
// 终止线程  
public void stop( );       // 不建议使用  
public void interrupt( );  
 
// 得到线程状态  
public boolean isAlive( );  
public boolean isInterrupted( );  
public static boolean interrupted( );  
 
// join方法  
public void join( ) throws InterruptedException;

有三种方法可以使终止线程。

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

  2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

  3. 使用interrupt方法中断线程。

  4. 使用退出标志终止线程
    当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){…}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。

ASCII码

记住几个特殊的吧:

十六进制 十进制 字符
30 48 0
41 65 A
61 97 a

算法。。多刷LeetCode吧

待续。。。

你可能感兴趣的:(校招面经)