本文将详细地介绍MyBatis框架,从其优缺点、适用场景到工作原理,全面解析MyBatis的懒加载、延迟加载机制,以及如何管理实体与数据库字段的映射差异。同时,探讨动态SQL、缓存策略、事务处理,并比较MyBatis与Hibernate的不同。以问答题的形式详细介绍各个知识点,为开发者提供一份简洁高效的MyBatis学习概览。
MyBatis-知识点详解
- MyBatis
- Mybaits 的优点:
- MyBatis 框架的缺点:
- MyBatis 框架适用场合:
- MyBatis 的工作原理是什么?
- MyBatis 如何处理懒加载?
- MyBatis 的延迟加载是什么?
- MyBatis 如何处理一对多关系?
- 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
- MyBatis 的动态 SQL 语句是什么?
- 模糊查询 like 语句该怎么写?
- MyBatis 的缓存机制是什么?
- MyBatis 如何处理事务?
- MyBatis 和 Hibernate 的区别是什么?
- MyBatis 的逆向工程是什么?
- MyBatis 的拦截器是什么?
- MyBatis 的 batch 操作是什么?
- #{}和${}的区别是什么?
- xml 映射文件中,常见的标签
- Dao 接口的工作原理是什么?
- MyBatis 是如何进行分页的?分页插件的原理是什么?
- Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
- MyBatis 实现一对一有几种方式?具体怎么操作的?
- MyBatis 实现一对多有几种方式,怎么操作的?
- 使用 MyBatis 的 mapper 接口调用时有哪些要求?
- JDBC 编程有哪些步骤?
MyBatis
MyBatis 是一个开源的基于 Java 的持久化框架,它可以将 SQL 语句映射到 Java 对象中,实现了对数据访问的封装。MyBatis 使用 XML 文件或注解来配置 SQL 语句和映射关系,提供了与数据库交互的简单 API。
Mybaits 的优点:
1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML标签,支持编写动态 SQL 语句,并可重用。
2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
3、很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)。
4、能够与 Spring 很好的集成;
5、提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
MyBatis 框架的缺点:
1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。
2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
MyBatis 框架适用场合:
1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。
2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是不错的选择.
MyBatis 的工作原理是什么?
MyBatis 的工作原理是:
首先通过配置文件或注解来配置 SQL 语句和映射关系,然后在程序中使用 SqlSession 对象来执行 SQL 语句,最终得到结果。在执行 SQL 语句时,MyBatis 会将 SQL 语句和参数信息转化为 JDBC 所需的格式,并通过 JDBC API 来执行 SQL 语句,并将结果转换为 Java 对象。
MyBatis 如何处理懒加载?
MyBatis 可以通过配置懒加载来提高性能。
懒加载是指在需要使用时才加载数据,而不是在查询时全部加载。
MyBatis 支持两种懒加载方式:基于延迟加载的懒加载和基于动态代理的懒加载。
基于延迟加载的懒加载是指在查询时只查询基本数据,当需要访问关联对象时,再执行另外一次查询。
基于动态代理的懒加载是指使用代理对象延迟加载关联对象。
MyBatis 的延迟加载是什么?
MyBatis 的延迟加载是指在需要使用某个关联对象时再去加载该对象的数据,而不是在查询时就加载所有的关联对象数据。延迟加载可以有效地减少查询的性能开销,并降低内存的使用量。MyBatis 支持两种延迟加载方式,一种是基于代理的延迟加载,另一种是基于 XML 配置的延迟加载。
MyBatis 如何处理一对多关系?
MyBatis 可以通过嵌套查询、嵌套结果和分步查询等方式来处理一对多关系。
嵌套查询是指使用 SQL 语句嵌套查询,将关联对象作为子查询,可以通过多条 SQL 语句来实现。
嵌套结果是指通过嵌套结果映射来将一对多关系映射到 Java 对象中。
分步查询是指先查询出主对象,再查询关联对象,最后将结果合并到 Java 对象中。
当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
第 1 种: 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
<select id=”selectorder” parametertype=”int” resultetype=”
me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select>
第 2 种: 通过来映射字段名和实体类属性名的一一对应的关系。
<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用 id 属性来映射主键字段–>
<id property=”id” column=”order_id”>
<!–用 result 属性来映射非主键字段,property 为实体类属性名,column
为数据表中的属性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>
MyBatis 的动态 SQL 语句是什么?
动态 SQL 语句是指根据不同条件生成不同 SQL 语句的技术。MyBatis 提供了一些动态 SQL 标签来实现动态 SQL 语句,包括 if、choose、when、otherwise、foreach 等标签。
if 标签可以根据条件来生成不同的 SQL 语句,choose、when、otherwise 标签可以根据不同条件来生成不同的 SQL 语句片段,foreach 标签可以用来循环生成 SQL 语句。
模糊查询 like 语句该怎么写?
第 1 种:在 Java 代码中添加 sql 通配符。
java">string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname)<select id=”selectlike”>
select * from foo where bar like #{value}
</select>
第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入
string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>
MyBatis 的缓存机制是什么?
MyBatis 提供了一级缓存和二级缓存来提高查询性能。
一级缓存是指在同一个 SqlSession 中,查询相同 SQL 语句得到的结果会被缓存,如果再次查询相同的 SQL 语句,则直接从缓存中获取数据。
二级缓存是指在多个 SqlSession 中,查询相同 SQL 语句得到的结果会被缓存,如果再次查询相同的 SQL 语句,则直接从缓存中获取数据。
MyBatis 还提供了基于命名空间的缓存,可以通过配置来启用或禁用缓存。
MyBatis 如何处理事务?
MyBatis 可以使用 JDBC 或 Spring 来处理事务。
如果使用 JDBC,可以通过 SqlSession 对象来控制事务。在事务处理中,如果执行的 SQL 语句中有一条语句执行失败,则整个事务会回滚。
如果使用 Spring,可以使用 Spring 的事务管理机制来管理事务。
MyBatis 和 Hibernate 的区别是什么?
MyBatis 和 Hibernate 都是 Java 中比较流行的 ORM 框架,它们的区别主要体现在以下几个方面:
1)MyBatis 更加灵活,可以使用 XML 或注解来配置 SQL 语句,而 Hibernate 更加智能,可以自动生成 SQL 语句。
2)MyBatis 更加轻量级,可以直接使用 JDBC API,而 Hibernate 需要使用庞大的 Hibernate API。
3)MyBatis 可以更加精细地控制 SQL 语句的执行,而 Hibernate 更加高级,可以处理更复杂的映射关系。
MyBatis 的逆向工程是什么?
MyBatis 的逆向工程是指根据数据库中的表自动生成 Java 代码和映射文件的工具。逆向工程可以根据数据库中的表自动生成 POJO、Mapper 接口、映射文件等文件,从而避免手动编写代码的繁琐过程。MyBatis 逆向工程可以通过 MyBatis Generator 插件来实现。
MyBatis 的拦截器是什么?
MyBatis 的拦截器是一种 AOP 技术,可以在 SQL 语句执行前、执行后或执行异常时进行拦截,并进行一些额外的处理,比如记录日志、缓存 SQL 语句等。MyBatis 的拦截器可以通过自定义拦截器实现,也可以使用 MyBatis 提供的一些拦截器,比如日志拦截器、缓存拦截器等。
MyBatis 的 batch 操作是什么?
MyBatis 的 batch 操作是指将多条 SQL 语句合并为一条 SQL 语句一次性执行,从而提高 SQL 执行效率。MyBatis 提供了批量插入、批量更新、批量删除等多种 batch 操作方式,可以通过 SqlSession 的 batch() 方法来执行批量操作。batch 操作可以有效地减少 SQL 语句的执行次数,从而提高查询性能。
#{}和${}的区别是什么?
#{}:sql 占位符号,好处防止sql注入
${}:sql拼接符号
能使用 #{ } 的地方就用 #{ }
表名作为变量时,必须使用 ${ }。因为,表名是字符串,使用 sql 占位符替换字符串时会带上单引号 ‘’,这会导致 sql 语法错误。
xml 映射文件中,常见的标签
在 XML 映射文件中,常见的标签包括:
<mapper>
:表示一个映射器,用于将 SQL 语句映射到 Java 对象中的方法。<select>
、<insert>
、<update>
、<delete>
:表示 SQL 语句的类型,用于定义具体的 SQL 语句和参数类型。<resultMap>
:表示结果映射,用于将数据库查询结果映射到 Java 对象中的属性。<id>
、<result>
:表示结果列的标识符,用于将查询结果中的列映射到 Java 对象中的属性。<if>
、<where>
、<foreach>
、<choose>
、<when>
、<otherwise>
:表示动态 SQL 语句的条件语句,用于动态拼接 SQL 语句,增加查询条件。<include>
:表示引入其他的 XML 文件,用于模块化 SQL 语句的编写,提高代码的复用性。<cache>
:表示映射器的缓存,用于提高 SQL 查询的性能。<parameterMap>
:表示参数映射,用于将 Java 对象中的属性映射到 SQL 语句中的参数。<sql>
:表示 SQL 片段,用于提取公共的 SQL 片段,增加 SQL 语句的复用性。
Dao 接口的工作原理是什么?
通常一个 xml 映射文件,都会写一个 Dao 接口与之对应。Dao 接口就是 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值。Mybatis 的 Dao 接口可以有多个重载方法,但是多个接口对应的映射必须只有一个。
Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行 MappedStatement 所代表的 sql,然后将 sql 执行结果返回。
MyBatis 是如何进行分页的?分页插件的原理是什么?
1、基于数据库的分页
MyBatis 支持使用 LIMIT 语句进行分页查询,只需要在 SQL 语句中使用 #{offset} 和 #{limit} 占位符即可:
2、基于插件的分页:PageHelper
可以通过配置该插件来实现分页查询。该插件会拦截需要分页的 SQL 语句,并根据分页参数动态生成分页 SQL 语句。分页插件还会在分页 SQL 语句之前执行一次查询,统计符合条件的总记录数,并将结果保存在分页对象中。
Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映
射关系。
第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
MyBatis 实现一对一有几种方式?具体怎么操作的?
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的 外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置。
MyBatis 实现一对多有几种方式,怎么操作的?
有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在
resultMap 里面的 collection 节点配置一对多的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的 结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的查询通过 select 节点配置。
使用 MyBatis 的 mapper 接口调用时有哪些要求?
1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同;
2、Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的
parameterType 的类型相同;
3、Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的
resultType 的类型相同;
4、Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。
JDBC 编程有哪些步骤?
1.装载相应的数据库的 JDBC 驱动并进行初始化:
Class.forName("com.mysql.jdbc.Driver");
2.建立 JDBC 和数据库之间的 Connection 连接:
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?
characterEncoding=UTF-8", "root", "123456")
3.创建 Statement 或者 PreparedStatement 接口,执行 SQL 语句。
4.处理和显示结果。
5.释放资源。