| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring、MyBatis 面试题,阿里高级java工程师面试题 -> 正文阅读 |
|
[Java知识库]Spring、MyBatis 面试题,阿里高级java工程师面试题 |
我们?般使? @Autowired 注解?动装配 bean,要想把类标识成可?于 @Autowired 注解?动装配的 bean 的类,采?以下注解可实现:
参考文献:传送门
//将User类中的set方法去掉,使用@Autowired注解 // 这样 Spring 便会自动装配了 public class User { @Autowired private Cat cat; @Autowired private Dog dog; private String str; public Cat getCat() { return cat; } public Dog getDog() { return dog; } public String getStr() { return str; } } context:annotation-config/
其中有颜色的部分是重要的,口语化的表达,其生命周期为:
详细来说就是:
大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。 常见的有两种解决办法:
声明式事务又分为两种:
Spring 事务的底层实现主要使用的技术:AOP(动态代理) + ThreadLocal + try/catch。
Spring 事务的核心逻辑伪代码如下: public void invokeWithinTransaction() { // 1.事务资源准备 try { // 2.业务逻辑处理,也就是调用被代理的方法 } catch (Exception e) { // 3.出现异常,进行回滚并将异常抛出 } finally { // 现场还原:还原旧的事务信息 } // 4.正常执行,进行事务的提交 // 返回业务逻辑处理结果 } 详细流程如下图所示:
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
一共是七种,按照是否支持当前事务,可以分为以下情况: 支持当前事务的情况:
不支持当前事务的情况:
其他情况:
比如数据库是可重复读,Spring 是读已提交,这是怎么实现的? **Spring 的事务隔离级别本质上还是通过数据库来控制的,具体是在执行事务前先执行命令修改数据库隔离级别,**命令格式如下:
===============================================================================
还记得之前的 JavaWeb 的项目中,里面的 Web 层、Service 层以及 Dao 层是否还有印象。 在 Spring MVC 下,我们?般把后端项?分为 Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台??)。 接下来,我们就开始学习 SSM 框架,即 Spring + Spring MVC + MyBatis。它们与模型层次分别一一对应。 拓展:过去的 MVC 模型就是 jsp + servlet + javabean 模式,其中:
DispatchServlet。
是单例模式,所以在多线程访问的时候有线程安全问题,不过不能使用同步,因为会影响性能的,解决方案是在控制器里面不能写字段。
一般用 @Conntroller 注解,不能用别的注解代替。
其用于类上,表示类中的所有请求与响应的方法都是以该地址作为父路径。
直接在方法上面加上注解 @RequestMapping,并且在这个注解里面写上要拦截的路径。
可以在 @RequestMapping 注解里面加上 params=”type=test”
直接在方法中声明这个对象,SpringMVC 就自动会把属性赋值到这个对象里面。 ============================================================================
Mybatis 是一个半 ORM(对象关系映射)的持久层框架,它内部封装了JDBC、加载驱动、创建连接、创建 statement 等繁杂的过程,开发者开发时只需要关注如何编写 SQL 语句,可以严格控制 SQL 执行性能,灵活度高。 它可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类(POJO) 【Plain Old Java Objects】映射成数据库中的记录,几乎避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。
持久化是将程序数据在持久状态和瞬时状态间转换的机制,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)的机制。 之所以需要持久化,是因为内存本生是不可靠的,可能会导致某些数据丢失。同时,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。 参考文献:传送门
Hibernate 属于全?动 ORM 映射?具,使? Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全?动的。而 Mybatis 在查询关联对象或关联集合对象时,需要?动编写 sql 来完成,所以,称之为半?动 ORM 映射?具。
#{} 是预编译处理,${} 是字符串替换。MyBatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 ? 号,使用 PreparedStatement 的 setter 方法来赋值,MyBatis在处理 ${ } 时,就是把 ${ } 替换成变量的值。 同时,使用 #{} 可以有效的防止 SQL 注入,提高系统安全性。
MyBatis 的配置就相当于配置其的配置文件。 MyBatis 具有如下的配置信息:
详细内容可以参考博客:传送门
/**
*/ public class MyBatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { // 1 从 XML 中构建 SqlSessionFactory String resource = “mybatis-config.xml”; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //获取SqlSession连接 public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } } package sharm.dao; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import sharm.pojo.User; import sharm.utils.MyBatisUtils; import java.util.List; public class UserTest { @Test public void testSelectUser(){ //2 从 SqlSessionFactory 中获取 SqlSession SqlSession session = MyBatisUtils.getSession(); //3 探究已映射的 SQL 语句 UserMapper mapper = session.getMapper(UserMapper.class); List users = mapper.selectUser();
for (User user: users){ System.out.println(user); } session.close(); } }
一个 SqlSessionFactory 会有很多 SqlSession,同理 SqlSession 也会有很多 Mapper。
| 类名 | 作用域 | | :-: | :-: | | SqlSessionFactoryBuilder | 方法作用域 | | SqlSessionFactory | 全局作用域 | | SqlSession | 方法作用域 | | Mapper | 方法作用域 |
三种分页方式: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:08:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |