MyBatis 面试复习整理

MyBatis

MyBatis 是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它内部封装了 JDBC ,使开发者只需要关注 SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。通过 XML 和注解的方式将要执行的各种 Statement 配置起来,并通过 Java 对象和 Statement 中的动态参数进行映射生成最终执行的 Sql 语句,最后要 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。

MyBatis提供了普通 SQL 查询、事物、存储过程等功能。

优点

  • 相比于 JDBC 需要编写的代码更少
  • 使用灵活,支持动态 SQL
  • 提供映射标签,支持对象与数据库的字段关系映射

缺点

  • SQL 语句依赖数据库,移植性较差
  • SQL 语句编写工作量大

MyBatis 工作流程

工作流程旨在要完成MyBatis的初始化工作,具体的做法是

第一步要创建一个mybatis-config.xml文件,这个文件中包含了环境配置,全局设置项以及mapper声明这样的核心配置信息,这个mybatis-config.xml文件起到了一个全局配置作用;

SqlSessionFactoryBuilder --构建–》 SqlSessionFactory --构建–》SqlSession(保证全局唯一)

第二步是在我们程序运行的过程中,通过SqlSessionFactoryBuilder这个构建器对象来构建SqlSessionFactory,用于创建SqlSession对象,SqlSession必须保证全局唯一。通过这个SqlSessionFactory对象创建了对应的SqlSession,是我们对数据表进行增删改查的核心。

第三部对应的mapper.xml文件包含了大量的SQL语句,我们通过session来访问mapper.xml,进而来执行与之对应的增删查改SQL语句,那么对于写操作来说,执行完以后,千万不要忘记我们对事务及时进行commit的提交或者是rollback回滚,只有这样才能保证我们的数据被成功写入到数据库中。

最后通过session.close来关闭会话任务。

MyBatis执行流程

MyBatis数据查询步骤

创建实体类

创建Mapper XML

编写 SQL 标签

开启驼峰命名映射

新增

SQLSession执行select语句

resultType 指的是某个具体的对象

resultType=“com.*.students”:返回的是单表查询的对象或结果集

resultType=“java.util.Map”:返回的是多表查询的Map结果集

resultMap可以将查询结果映射为复杂类型的Java对象,适合于Java对象保存多表关联结果,支持对象关联查询

parameterType: 外侧要传入的参数的类型

1.MyBatis 和 Hibernate 有哪些不同?

  • 灵活性:MyBatis 更加灵活,自己手写 SQL语句
  • 可移植性:每个数据库的 SQL 不同,移植性差
  • 开发效率:Hibernate 对 SQL 语句做了封装,可直接使用,效率高
  • 门槛:MyBatis 入门比较简单

2.“#” 和 “$” 有什么区别?

"#" 是预编译处理,通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换
#{}可以接受简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中可以是value或其他名称
使用 "#" 时,MyBatis 会将SQL 中的参数替换成 "?"配合 PreparedStatement set 方法赋值,有效的防止 SQL 注入。

"$" 是字符串替换。通过${} 可以将 parameterType 传入的内容拼接在 SQL 中且不进行 jdbc 类型转换
${} 可以接受简单数据类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中只能是 value

3.MyBatis 有几种分页方式?

逻辑分页:使用 MyBatis 自带的RowBounds 进行分页,一次性查询很多数据,并非全部。
物理分页:手写 SQL 分页或分页插件。

4.RowBounds 是 一次性查询全部结果吗?

不是,因为 MyBatis 是对 JDBC 的封装
在 JDBC 驱动中有一个 FetchSize 的配置,它规定了每次最多能查询多少数据倘若要查询更多数据,会在执行 next() 的时候,去查询更多的数据。

5.什么是动态 SQL?

可以根据不同的参数信息来动态拼接不确定的SQL叫做动态SQL(if、choose、when、otherwise、where、set、foreach)

6.如何设置延迟加载?

延迟加载:在 MyBatis-config.xml 设置 <setting name="lazyLoadingEnabled" value="true"/>

7.JDBC和 MyBatis编程的比较

JDBCMyBatis
系统性能数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能可在配置文件中数据连接池,使用连接池管理数据库连接
Sql 语句Sql 语句写在代码中造成代码不易维护,实际应用 Sql 变化的可能较大,Sql 变动需要改变 Java 代码将 Sql 语句配置在映射文件中与 Java 代码相分离
传参数向 Sql语句传参数麻烦,因为 Sql 语句的 where 条件不一定,可能多也可能少,占位数需要和参数对应MyBatis 自动将 Java 对象映射至 Sql 语句,通过 Statement 中的 parameterType 定义输入参数的类型
结果解析对结果集解析麻烦,Sql 变化导致解析代码变化,且解析前需要遍历MyBatis自动将 Sql 执行结果映射至 Java 对象,通过 Statement 中的 resultType 定义输出结果的类型

8.MyBatis 配置文件详解

配置环境以及数据池的配置

配置文件

映射文件中的参数涵义

namespace 属性:取值必须是持久层(Dao)接口的全限定类名
resultType 属性:用于指定结果集的类型
parameterType 属性:用于指定传入参数的类型

映射文件中的参数涵义
mappers 映射器

<mapper resource=""/>: 使用相对于类路径的资源		<mapper resource="com/hyx/dao/IUserDao.xml"/>
<mapper class=""/>: 使用 mapper 接口类路径	<mapper resource="com.hyx.dao.UserDao"/>
<package name=""/>: 注册指定包下的所有 mapper 接口	<package name="com.hyx.mapper"/>

谢谢观看,待更新…

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值