今天看到一份互联网公司工作时长排行,有人一周肝工作超过 60h,每天在工位十多个小时兢兢业业;有人享受工作和生活的平衡,每周完美卡点 8 小时工作。
即便都在互联网公司,生活也是截然不同的。
工作时长前 25 的公司,平均每周工作时长都超过了50小时(全文数据均源于duibiao.info):
在 pk 工时上,拼多多没有输过。不过拼多多的时薪,给得也非常大方。同样的统计口径下,拼多多初级工程师时薪中位数达到 258 元,中级工程师的时薪中位数,更是达到了 459 元。
不久前拼多多部分团队刚刚调整了考勤时间,将打卡时间从11-11-6 改成 10-9-6,午餐和晚餐的休息时间调整为 1 小时。看来卷中更有强者。不过拼多多一周工作 6 天,所以理论上说,排名在拼多多后面的几家公司,未必就比在拼多多上班轻松。
当然,有加班的朋友,也有不加班的。
位于排行榜末尾的 13 家互联网公司,平均每周工作时长,最短的还不到 40 小时。
互联网公司的卷王很多,但身体和健康同样重要。作为打工人,大家更喜欢哪一种生活呢?
这份工作时长排行仅供大家做一个参考。毕竟就算是同一家公司,不同部门或是项目组的工作时间也是不一样的。
想要拥有更多的选择权,那就需要自己多多投递,多多面试,手握更多的 offer。
今天也为大家准备了面试题~
MyBatis 写个 Xml 映射文件,再写个 DAO 接口就能执行,这个原理是什么?
回答重点
核心原理是 JDBC 的能力 和 动态代理,通过解析 XML 映射文件和动态生成 DAO 接口实现类来完成 SQL 的执行。
以下是详细的执行原理:
1)加载配置和 Mapper 映射文件:
-
MyBatis 启动时,通过配置文件(
mybatis-config.xml
)加载数据库连接信息和 Mapper 映射文件(Mapper.xml
)。 -
XML 文件中的 SQL 被解析为内部的
MappedStatement
对象,包含 SQL 语句、参数映射规则和返回结果映射规则。
2)动态代理实现 DAO 接口:
-
MyBatis 为每个 DAO 接口生成一个动态代理类(
MapperProxy
),拦截接口方法调用。 -
动态代理的核心是根据方法名和参数匹配到对应的
MappedStatement
,然后调用 JDBC 来执行 SQL。
3)通过 JDBC 执行 SQL:
-
MyBatis 的
SqlSession
是对 JDBC 的封装,它的核心是使用PreparedStatement
来完成 SQL 的执行。 -
根据 XML 中定义的 SQL 和 DAO 接口方法传入的参数,生成完整的 SQL 查询,并将参数通过占位符(
?
)绑定到PreparedStatement
。 -
最终通过 JDBC 执行 SQL,并获取
ResultSet
。
4)结果映射:
-
JDBC 的查询结果(
ResultSet
)会被 MyBatis 的ResultMap
或resultType
映射为 DAO 接口方法的返回值类型(如 POJO、Map 或 List)。
扩展知识
MyBatis 与 JDBC 的关系
MyBatis 本质上是对 JDBC 的封装和增强,它的核心执行流程依赖于 JDBC 的 API。
JDBC 原生写法:
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "password");
String sql = "SELECT * FROM users WHERE id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1);
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} finally {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}
MyBatis 写法:
SqlSession session = sqlSessionFactory.openSession();
try {
User user = session.selectOne("findUserById", 1);
System.out.println(user.getUsername());
} finally {
session.close();
}
对比:
-
JDBC 手写代码复杂,需要手动管理连接、SQL 拼接和结果映射。
-
MyBatis 自动管理这些步骤,开发者只需编写 SQL 和映射规则,剩下的交给框架完成。