一、MyBatis框架简介
MyBatis框架是一个基于ORM (Object Relational Mapping,对象/关系映射)的优秀的持久化框架。
MyBatis框架不是一个完整的 ORM实现,而是一种半自动化的ORM实现。
MyBatis 框架的主要特点是SQL映射器机制。
二、持久化和orm
1.持久化∶从瞬时到持久又从持久到瞬时的一个过程称为持久化
2.orm :定义:对象关系映射Object relatation mapper
mapper.xml ---->实体类mybatis核心mybatis
三、mybatis运行流程
配置:首先需要进行 MyBatis 的配置。这包括创建一个配置文件(通常为 mybatis-config.xml
),指定数据库连接信息、映射器(Mapper)的位置等。配置文件一般会包含一些全局设置和类型处理器的配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<!--<plugin interceptor="com.github.pagehelper.PageInterceptor">
<ugin>-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<environments default="mybatis">
<environment id="mybatis">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="myschool">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
SessionFactory 的创建:在启动时,MyBatis 会根据配置文件来创建一个 SqlSessionFactory
对象,它是 MyBatis 的核心对象。SqlSessionFactory
使用建造者模式来构建,它的主要作用是创建 SqlSession
对象。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession 的获取:MyBatis 的应用程序通过 SqlSessionFactory
来获取 SqlSession
对象。SqlSession
提供了执行 SQL 语句的方法,开发者可以使用它来进行数据库操作。
SQL 映射文件的解析:当需要执行 SQL 语句时,MyBatis 会根据配置文件中的信息,找到对应的 SQL 映射文件(通常为 .xml
格式),并解析该文件。
SQL 的执行:SQL 映射文件被解析后,MyBatis 将根据解析结果来执行 SQL 语句。在执行之前,MyBatis 还会进行一些额外的处理,如参数的处理、动态 SQL 的拼装等。
结果集的映射:执行 SQL 语句后,MyBatis 将会把结果集映射到 Java 对象上。这个映射过程会根据配置文件和查询结果的列名来进行。
事务管理:MyBatis 支持事务管理,可以在配置文件中进行配置。开发者可以根据需要选择不同的事务管理方式,如 JDBC 的事务、Spring 的事务等。
四、mybatis运行流程
动态 SQL 是指在 SQL 语句中根据不同条件动态生成 SQL 片段的技术。在 MyBatis 中,动态 SQL 是通过使用 <if>、<choose>、<when>、<otherwise>、<foreach>
等标签来实现的。
动态 SQL 的主要作用是根据不同的情况拼接 SQL 语句,以满足灵活的查询需求。以下是一些常用的动态 SQL 标签:
1.<if>
标签:可以根据给定的条件来判断是否包含某一段 SQL 语句。例如:
<select id="getUserList" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">
AND name LIKE #{name}
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
</select>
2.<choose>
、<when>
、<otherwise>
标签:可以用于实现类似于 switch-case 的条件判断。<choose>
标签中包含多个 <when>
标签,每个 <when>
标签可以判断一个条件。当某个 <when>
条件为真时,执行对应的 SQL 语句块;如果所有 <when>
条件都为假,则执行 <otherwise>
语句块。例如:
<select id="getUserList" resultType="User">
SELECT * FROM user
<where>
<choose>
<when test="name != null">
AND name LIKE #{name}
</when>
<when test="status != null">
AND status = #{status}
</when>
<otherwise>
AND active = true
</otherwise>
</choose>
</where>
</select>
3.<foreach>
标签:可以用于循环遍历集合,并将集合中的元素拼接到 SQL 语句中。例如:
<update id="batchUpdateUsers">
UPDATE user SET
<foreach collection="users" item="user" separator=",">
name = #{user.name},
status = #{user.status}
</foreach>
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
通过动态 SQL,我们可以根据不同的条件生成不同的 SQL 语句,使得查询更加灵活和可变。MyBatis 中还有其他一些动态 SQL 标签和用法,可以根据具体的需求选择合适的方式来实现动态 SQL。
五、mapper.xml映射文件 XML映射器
MyBatis的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。MyBatis 致力于减少使用成本,让用户能更专注于SQL代码。SQL映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):
cache-该命名空间的缓存配置。
cache-ref-引用其它命名空间的缓存配置。
resultMap-描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterMap -老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。sq1-可被其它语句引用的可重用语句块。
insert-映射插入语句。
update-映射更新语句。
delete-映射删除语句。
. select`-映射查询语句。