一、基本概念
1、MyBatis定义
MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
2、ORM定义
ORM框架(对象映射框架):为了解决面向对象和关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(PO),而ORM框架会通过映射关系,将这些面向对象的操作转换成底层的SQL操作。
常见的ORM框架有Hibernate和MyBatis。
3、Hibernate和Mybatis的区别
Hibernate是一个全表映射的框架。通常开发者只需定义好持久化对象到数据库表的映射关机,就可以通过Hibernate提供的方法完成持久层操作。适用于场景不太复杂且对性能要求不高的项目中使用。
优点:
• 只需提供POJO和映射关系,工作量小
缺点:
• 多表关联时,对SQL查询的支持较差
• 更新数据时,需要发送所有字段
• 不支持存储过程 • 不能通过优化SQL来优化性能
MyBatis是一个半自动映射的框架。适用于复杂的和需要优化性能的项目
优点:
• 可以配置动态SQL并优化SQL
• 可以通过配置决定SQL的映射规则
• 支持存储过程
缺点:
• 需要手动匹配提供POJO、SQL和映射关系,工作量大
二、核心对象
1、SqlSessionFactory
SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession。
SqlSessionFactory对象的实例通过SqlSessionFactoryBuilder对象来构建,通过XML配置文件或一个预先定义好的Configuration实例进行构建。
SqlSessionFactory对象是线程安全的,一旦被创建,在整个应用执行期间都会存在。如果多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源很容易被耗尽,所以在构建SqlSessionFactory实例时建议使用单例模式。
2、SqlSession
SqlSession是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作。
SqlSession对象包含数据库中所有执行SQL操作的方法,底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。
SqlSession实例是不能被共享的,也是线程不安全的,因此其使用范围最好限定在一次请求或一个方法中,用完及时关闭。
三、配置文件
<configuration>
:配置文件的根元素,其他元素均在其中配置
<properties>
:配置属性的元素,通过外部配置来动态替换内部定义的属性
<settings>
:用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等
<typeAliases>
:为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置有关,其使用的意义在于减少全限定类名的冗余
<typeHandler>
:将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库中取出结果时将jdbcType转换为javaType
<objectFactory>
:实例化目标类
<plugins>
:配置用户所开发的插件
<environments>
:在配置文件中对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,可以通过<environments>
元素配置多种数据源,即配置多种数据库
<mappers>
:指定MyBatis映射文件的位置
四、映射文件
<mapper>
:映射文件的根元素,其他元素都是它的子元素
<select>
:用于映射查询语句,从数据库中读取数据,并组装数据给业务开发人员
<insert>
:用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数
<update>
:用于映射更新语句
<delete>
:用于映射删除语句
<sql>
:定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段
<resultMap>
:表示结果映射集,主要作用是定义映射规则、级联更新以及定义类型转化器等
五、MyBatis操作步骤
1、编写映射文件和配置文件
映射文件UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ssm.mapper.UserMapper">
<!-- 根据用户编号获取用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="com.ssm.po.User">
select * from t_user where id=#{id}
</select>
<!-- 根据用户名模糊查询用户信息 -->
<select id="findUserByName" parameterType="String" resultType="com.ssm.po.User">
select * from t_user where username like '%${value}%'
</select>
<!-- 添加用户 -->
<insert id="addUser" parameterType="com.ssm.po.User">
insert into t_user(username,jobs,phone)values(#{username},#{jobs},#{phone})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="com.ssm.po