java面试代码题,卧薪尝胆70天内推入职阿里

开篇闲扯

打工人,打工魂,我们生而人上人。当“资本主义”逐渐禁锢我们人(大)上(韭)人(菜)肉体的时候,那一刻我才明白那个日不落帝国·资本主义收割机·瑞民族之光幸·瑞幸咖啡是多么的了不起,尽管我不懂咖啡,但还是要说一声谢谢!说到咖啡,喝完就想上厕所,对写bug的我来说太不友好了,毕竟我不(很)喜欢带薪上厕所。

点击领取2024完整开源项目《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

回归本次的不正经Java文章。上篇文章末尾处已经提到了,主要会把我对Synchronized的理解进行一次全方位的梳理,如果能帮助到大家吊打面试官,万分荣幸。

在这里分享一份 [mybatis从入门到精通] 的强力教程,定能够助你一臂之力。

Mybatis基本介绍

  1. ORM和MyBatis
  2. 对象/关系数据库映射(ORM)
  3. 基本映射方式
  4. 流行的ORM框架简介

目前流行的编程语言,例如Java、 C#等,都是面向对象的编程语言;而目前主流的数据库产品,例如Oracle、DB2等,依然是关系数据库。编程语言和底层数据库的发展不协调,催生出了ORM框架,ORM框架可作为面向对象编程语言和数据库之间的桥梁。

确切地说,MyBatis 并不完全是一种ORM框架,它的设计思想和ORM相似,只是它允许开发,人员直接编写SQL语句,使得访问数据库更加灵活,更准确地说,它应该是一种“SQL Mapping”框架。

Mybatis的体系结构

  1. SqlSessionFactory
  2. SqlSession
  3. MyBatis的配置文件结构
  4. settings设置
  5. typeAliases类型命名
  6. typeHandlers类型处理器
  7. objectFactory对象工厂
  8. environments配置环境
  9. mapper映射器

通过前面的介绍可以知道,MyBatis 的持久化解决方案将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以面向对象的方式进行持久层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心,从而将应用层从底层的JDBC/JTAAPI抽取出来。通过配置文件管理JDBC连接,让MyBatis解决持久化访问的实现。

MyBatis中的常用对象有SqSessionFactory和SlSession。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mybatis的关联映射和动态SQL

  1. 一对一
  2. 一对多
  3. 多对多
  4. 动态SQL

关联关系是面向对象分析、面向对象设计最重要的知识,MyBatis完全可以理解这种关联关系,如果映射得当,MyBatis的关联映射将可以大大简化持久层数据的访问。关联关系大致有如下分类。

Mybatis的事务管理以及缓存机制

  1. 事务的概念
  2. Transaction接口
  3. 事务的配置创建和使用
  4. 一级缓存( SqlSession级别)
  5. 二级缓存(mapper级别)

每个业务逻辑都是由一系列数据库 访问完成的,这-系列数据库访间可能会修改多条数据记录,这一系列修改应该是一个整体,绝不能仅修改其中的几条数据记录。也就是说,多个数据库原子访问应该被绑定成一个整体,这就是事务。事务是一个最小的逻辑执行单元,整个事务不能分开执行,要么同时执行,要么同时放弃执行。

Mybatis注解配置

  1. MyBatis常用注解
  2. MyBatis注解的插入、修改、删除和查询操作
  3. MyBatis注解的一对一、一对多和多对多操作
  4. MyBatis注解的动态SQL

前面介绍了MyBatis的基本用法、关联映射、动态SQL和缓存机制等知识,其所有的配置都是使用XML完成,但是大量的XML配置文件的编写是非常繁琐的,因此MyBatis也提供了更加简便的基于注解(annotation) 的配置方式。

Spring4整合Mybatis3

  1. 开发环境搭建
  2. 准备所需的jar包
  3. 准备数据库资源
  4. 完成配置文件
  5. 持久层功能实现
  6. 服务层功能实现
  7. 控制层功能实现
  8. jsp页面
  9. 测试Spring4整合MyBatis3

在实际的项目开发中,我们需要将Spring和MyBatis进行整合,从而使用Spring 依赖注入以减少代码的耦合,使用Spring MVC处理请求并作出响应,使用MyBatis更加简捷地完成数据库操作。这里将重点介绍Spring和MyBatis的整合过程。

文档的最后一部分是项目实战

  1. 人事管理系统功能模块设计
  2. 人事管理系统持久化组件设计
  3. 人事管理系统业务逻辑组件设计
  4. Spring MVC整合MyBastis优势

最后将会综合运用前面所介绍的知识来开发一个简单的人事管理 (HRM)系统。该系统包括用户管理、部门管理、职位管理、员工管理、公告管理、下载中心等常用的人事管理系统功能。

本系统采用前面介绍的Java EE架构: Spring MVC + MyBatis3.4,该系统架构成熟,性能良好,运行稳定。Spring的IOC容器负责管理业务逻辑组件、持久层组件及控制层组件,这样可以充分利用Spring的依赖注入的优势,进一步增强系统的解耦性,从而提高应用的可扩展性,降低系统重构的成本。

这里详细介绍了一个完整的JavaEE项目:人事管理系统,在此基础上可以扩展出企业的HRM系统、OA系统等。因为企业平台本身的复杂性,所以本项目涉及的表达到6个,而且各个模块的业务逻辑也比较复杂,这些对初学者可能有一定难度, 但只要读者先认真阅读本书前面所介绍的知识,并结合上述的讲解,再配合资源文件中的案例代码,则一定可以掌握这里所介绍的内容,也是将理论知识应用到实际开发的典范

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

a面试手册,还有一些面试题pdf

不要停下自己学习的脚步

[外链图片转存中…(img-1oiL1PgF-1709747254164)]

[外链图片转存中…(img-xOOXdWIZ-1709747254164)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的成语消消乐Java代码,仅供参考: ```java import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class ChengYuXiaoXiaoLe { // 成语库 private static final String[] CHENGYUS = {"卧薪尝胆", "金蝉脱壳", "百里挑一", "金玉满堂", "背水一战", "霸王别姬", "上人间", "不吐不快", "海阔空", "情非得已"}; // 游戏面板大小 private static final int ROWS = 10; private static final int COLS = 10; // 游戏面板数据 private static final char[][] BOARD = new char[ROWS][COLS]; // 记录已选择的成语 private static final List<String> SELECTED = new ArrayList<>(); // 记录当前选中的成语的起点和终点位置 private static int startX = -1; private static int startY = -1; private static int endX = -1; private static int endY = -1; // 初始化游戏面板 private static void initBoard() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { BOARD[i][j] = (char) ('a' + (int) (Math.random() * 26)); } } // 将成语插入游戏面板中 for (String chengyu : CHENGYUS) { int len = chengyu.length(); int startX, startY, endX, endY; // 随机选择成语的起点和终点位置 do { startX = (int) (Math.random() * ROWS); startY = (int) (Math.random() * COLS); endX = (int) (Math.random() * ROWS); endY = (int) (Math.random() * COLS); } while (len != Math.abs(startX - endX) + Math.abs(startY - endY)); // 将成语插入游戏面板中 int index = 0; if (startX == endX) { for (int j = Math.min(startY, endY); j <= Math.max(startY, endY); j++) { BOARD[startX][j] = chengyu.charAt(index++); } } else { for (int i = Math.min(startX, endX); i <= Math.max(startX, endX); i++) { BOARD[i][startY] = chengyu.charAt(index++); } } } } // 打印游戏面板 private static void printBoard() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { System.out.print(BOARD[i][j] + " "); } System.out.println(); } } // 判断两个位置是否相邻 private static boolean isAdjacent(int x1, int y1, int x2, int y2) { return Math.abs(x1 - x2) <= 1 && Math.abs(y1 - y2) <= 1; } // 判断当前选中的成语是否合法 private static boolean isValidSelection() { if (startX == -1 || endX == -1) { return false; } StringBuilder sb = new StringBuilder(); if (startX == endX) { for (int j = Math.min(startY, endY); j <= Math.max(startY, endY); j++) { sb.append(BOARD[startX][j]); } } else { for (int i = Math.min(startX, endX); i <= Math.max(startX, endX); i++) { sb.append(BOARD[i][startY]); } } String chengyu = sb.toString(); return chengyu.length() >= 4 && !SELECTED.contains(chengyu) && contains(chengyu); } // 判断指定的成语是否在成语库中 private static boolean contains(String chengyu) { for (String cy : CHENGYUS) { if (cy.equals(chengyu)) { return true; } } return false; } // 处理玩家的点击事件 private static void handleClick(int x, int y) { if (startX == -1) { // 如果当前没有选中成语,将当前位置作为成语的起点 startX = x; startY = y; endX = x; endY = y; } else if (isAdjacent(x, y, endX, endY)) { // 如果当前位置与上一个位置相邻,将当前位置作为成语的终点 endX = x; endY = y; } else { // 如果当前位置与上一个位置不相邻,取消选中成语 startX = -1; startY = -1; endX = -1; endY = -1; } // 判断当前选中的成语是否合法 if (isValidSelection()) { // 如果合法,将成语加入已选择列表中,并将成语从游戏面板中删除 StringBuilder sb = new StringBuilder(); if (startX == endX) { for (int j = Math.min(startY, endY); j <= Math.max(startY, endY); j++) { sb.append(BOARD[startX][j]); BOARD[startX][j] = ' '; } } else { for (int i = Math.min(startX, endX); i <= Math.max(startX, endX); i++) { sb.append(BOARD[i][startY]); BOARD[i][startY] = ' '; } } SELECTED.add(sb.toString()); startX = -1; startY = -1; endX = -1; endY = -1; // 打印当前已选择的成语列表 System.out.println("已选择的成语:"); for (String cy : SELECTED) { System.out.print(cy + " "); } System.out.println(); } } public static void main(String[] args) { initBoard(); printBoard(); Scanner scanner = new Scanner(System.in); while (true) { System.out.print("请输入要选择的位置(x,y): "); String input = scanner.nextLine(); if (input.equals("exit")) { break; } String[] arr = input.split(","); if (arr.length != 2) { System.out.println("输入格式错误,请重新输入!"); continue; } try { int x = Integer.parseInt(arr[0]); int y = Integer.parseInt(arr[1]); if (x < 0 || x >= ROWS || y < 0 || y >= COLS) { System.out.println("输入位置不合法,请重新输入!"); continue; } handleClick(x, y); printBoard(); } catch (NumberFormatException e) { System.out.println("输入格式错误,请重新输入!"); } } } } ``` 该代码实现了一个简单的成语消消乐游戏,其中包含了成语库的定义、游戏面板的初始化、游戏面板的打印、玩家点击事件的处理等功能。玩家通过输入坐标来选择游戏面板上的位置,然后根据相邻位置的关系判断是否可以选中一个成语,选中的成语将从游戏面板中删除,并将其加入已选列表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值