携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
什么是MyBatis?
MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。
MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
Hibernate与MyBatis有什么区别?
- Hibernate是一个全表映射的框架。
- 通常开发者只需定义好持久化对象到数据库表的映射关系,就可以通过Hibernate提供的方法完成持久层操作。
- 开发者并不需要熟练的掌握SQL语句的编写,Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口来执行,所以其开发效率会高于MyBatis。
- Hibernate也存在一些缺点,例如它在多表关联时,对SQL查询的支持较差;更新数据时,需要发送所有字段;不支持存储过程;不能通过优化SQL来优化性能等。
-
MyBatis是一个半自动映射的框架。
-
“半自动”是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系,而Hibernate只需提供POJO和映射关系即可。
-
与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,它还支持存储过程等。对于一些复杂的和需要优化性能的项目(电商)来说,显然使用MyBatis更加合适。
-
由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大。
MyBatis的工作原理
MyBatis的操作步骤
1.读取配置文件 2.根据配置文件构建SqlSessionFactory 3.通过SqlSessionFactory创建SqlSession 4.使用SqlSession对象操作数据库 5.关闭SqlSession
注意
在使用"${}"进行 SQL 字符串拼接时,无法防止 SQL 注入问题 所以想要眈能实现棋糊查询,又要防止 SQL 注入,可以对上述映射文件 CustomerMapper.xml 中模糊查询的 select 语句进行修改,使用 MySQL 中的 concatO 函数进行字符串拼接
什么是SqlSessionFactory?
SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。
构建SqlSessionFactory
通过XML配置文件构建出的SqlSessionFactory实例现代码如下:
InputStream inputStream = Resources.getResourceAsStream("配置文件位置");
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次的创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为此,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。
什么是SqlSession?
SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。
使用完SqlSession对象后要及时关闭,通常可以将其放在finally块中关闭。
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 此处执行持久化操作
} finally {
sqlSession.close();
}
配置文件的主要元素
在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<configuration>元素内配置。
<properties>元素
<properties>是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换。
<settings>元素
<settings>元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。
<typeAliases>元素
<typeAliases>元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
- 使用元素配置别名的方法如下:
<typeAliases>
<typeAlias alias="user" type="com.itheima.po.User"/>
</typeAliases>
- 当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:
<typeAliases>
<package name="com.itheima.po"/>
</typeAliases>
<typeHandler>元素
<typeHandler>元素的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。
<objectFactory>元素
MyBatis中默认的ObjectFactory的作用是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。通常使用默认的ObjectFactory即可。大部分场景下都不用配置和修改默认的ObjectFactory.
<plugins>元素
MyBatis允许在已映射语句执行过程中的某一点进行拦截调用,这种拦截调用是通过插件来实现的。<plugins>元素的作用就是配置用户所开发的插件。
<environments>元素
<environments>元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过<environments>元素配置多种数据源,即配置多种数据库。
事务管理器的配置: 在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。 数据源的配置: 1.UNPOOLED 2.POOLED 3.JNDI
<mappers>元素
<mappers>元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下。
1.使用类路径引入
2.使用本地文件路径引入
3.使用接口类引入
4.使用包名引入
映射文件的主要元素
在映射文件中,<mapper>元素是映射文件的根元素,其他元素都是它的子元素。
<select>元素
<select>元素用来映射查询语句,它可以帮助我们从数据库中读取出数据,并组装数据给业务开发人员。
<select>元素的常用属性
<insert>元素
<insert>元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数。
<insert>元素的属性:<insert>元素的属性与<select>元素的属性大部分相同,但还包含了3个特有属性,这3个属性的描述如下所示。
<update>和<delete>元素
<update>和<delete>元素的使用比较简单,它们的属性配置也基本相同。
<sql>元素
<sql>元素的作用就是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段。
使用 <include> 元素的 refid 属性引用自定义的代码片段, refid 的属性值为自定义代码片段的 id。
<resultMap>元素
<resultMap>元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它的主要作用是定义映射规则、级联的更新以及定义类型转化器等。
当数据表中的列和需要返回的对象的属性不完全一致, MyBatis是不会自动赋值的。此时,就可以使用<resultMap>元素进行处理。