今天参加了广东工业大学的校招,面了好几家企业,大中小的都有。主要是Java开发方向,和一个Web前端方向的。回来就总结一下面试的问题和经验吧。
面的第一家是工厂,主要是软件开发和数据库开发。一开始只是跟HR聊,聊聊待遇和工作地点,学习过什么,实习做过什么。然后马上就把简历发给技术部的了。然后就给我来了场电话面试。问的主要都是数据库的问题。都用什么数据库开发啊,有过什么编程的经历啊,最主要感觉还是问一些关于数据库代码的问题。
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的一个实例,具体的增删查改有空再写
这个其实并不是很难,但用习惯了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)
)
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
这个问题虽然有所准备,但一紧张说起来就真的开始哑巴了。可能还是对SSM框架不够熟悉,用的不够多吧。
SSM(Spring,Spring MVC, MyBatis)是我Java Web经过初步学习之后的入门框架,但是我竟然对他们的优点如此不熟悉。。我愧对苍天愧对大地啊愧对父母的养育之恩。
所以我在这里总结一下,防止日后再忘。
以下摘自CSDN博主,JFBom
原文:https://blog.csdn.net/lsj741223/article/details/80805110
从三个方面分析:
Spring的优势
通过Spring的IOC特性,将对象之间的依赖关系交给了Spring控制,方便解耦,简化了开发
通过Spring的AOP特性,对重复模块进行集中,实现事务,日志,权限的控制提供了对其他优秀开源框架的集成支持
Spring MVC的优势:
SpringMVC是使用了MVC设计思想的轻量级web框架,对web层进行解耦,使我们开发更简洁
与Spring无缝衔接
灵活的数据验证,格式化,数据绑定机制
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));
}
}
线程可以分为4个状态:
New(新生),
Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running。
blocked(被阻塞),
Dead(死亡)。
// 开始线程
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;
有三种方法可以使终止线程。
使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
使用interrupt方法中断线程。
使用退出标志终止线程
当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){…}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。
记住几个特殊的吧:
十六进制 | 十进制 | 字符 |
---|---|---|
30 | 48 | 0 |
41 | 65 | A |
61 | 97 | a |
算法。。多刷LeetCode吧
待续。。。