在MyBatis官方文档上是这样说的:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
首先MyBatis是一个框架,那么什么是框架?通俗的说框架就是具有特定约束性的工具类.框架就是为解决问题制定的一套约束,在提供功能基础上进行扩充. 框架中一些不能被封装的代码(变量),需要使用框架者新建一个配置文件,在文件中添加变量内容. 配置文件需要建立在特定位置和特定名称 通过反射技术实例化配置文件中的类并获取到类属性的值。从而达到解决某类问题的目的,凡是框架都是为了简便开发而诞生的。
MyBatis是一个持久层框架。持久层框架解决的就是数据访问的问题,那么MyBatis的功能就是连接数据库进行CRUD操作,而为了优化CRUD操作还提供了数据库连接池、事务管理、数据表的映射等一系列功能。其实MyBatis的底层就是对JDBC进行了封装而已。
学习一个框架的第一步就是搭建所需要的环境,这个环境指的就是所需要的Jar包和依赖的配置文件。下面就是MyBatis所以依赖的包。
MyBatis对配置文件没有名称上的要求,路径一般全局配置文件放在classes根部录下也就是src或resources下。
我们看一下全局的MyBatis配置文件的格式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 配置根节点,后续文章会解释为什么叫configuration -->
<configuration>
<!-- default引用的是environment标签的id,意思是当前是用的环境 -->
<environments default="MySql">
<!-- 声明可以是用的环境,id环境唯一标识 -->
<environment id="MySql">
<!--
事务管理器 type=[JDBC|MANAGED] MyBatis 中有两种类型的事务管理器
JDBC – 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置就是让容器来管理事务的整个生命周期,或许框架整合时会说这个配置。
-->
<transactionManager type="JDBC"></transactionManager>
<!--
数据源配置 使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
有三种内建的数据源类型(也就是 type=[UNPOOLED|POOLED|JNDI])
UNPOOLED:不使用连接池每次请求都会创建新的数据连接对象
POOLED:使用连接池方式
JNDI:使用JNDI方式
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!--
映射器 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。
但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。
Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。
-->
<mappers>
<!-- 使用相对于类路径的资源引用 -->
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<!-- 使用完全限定资源定位符(URL)基本不会使用 -->
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mapper class="org.mybatis.builder.AuthorMapper"/>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<package name="org.mybatis.builder"/>
</mappers>
</configuration>
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
- cache – 给定命名空间的缓存配置。
- cache-ref – 其他命名空间缓存配置的引用。
- resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
- sql – 可被其他语句引用的可重用语句块。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
接下来我们看一下mapper映射器配置文件的格式:
<?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">
<!--
映射器 namespace命名空间 用于语句隔离
-->
<mapper namespace="org.mybatis.example.AuthorMapper">
<!--
select 查询
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 参数类型
resultType 返回值类型
-->
<select id="selectAuthor" parameterType="int" resultType="hashmap">
SELECT * FROM Author WHERE ID = #{id}
</select>
<!--
insert 插入
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 参数类型
-->
<insert id="insertAuthor" parameterType="org.mybatis.example.Author">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<!--
update 修改
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 参数类型
-->
<update id="updateAuthor" parameterType="org.mybatis.example.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
<!--
delete 删除
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 参数类型
-->
<delete id="deleteAuthor" parameterType="int">
delete from Author where id = #{id}
</delete>
</mapper>
环境搭建好后我们怎么使用呢?
public class TestMybatis {
public static void main(String[] args) throws IOException {
//加载全局配置文件
InputStream is = Resources.getResourceAsStream("Mybatis.xml");
//创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession
SqlSession sqlSession = factory.openSession();
Map<String,Integer> map = new HashMap<>();
map.put("id", 1);
//执行SQL获取结果
List<Author> list = sqlSession.selectList("org.mybatis.example.AuthorMapper.selectAuthor", map);
//关闭SqlSession
sqlSession.close();
}
}
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory是SqlSession的工厂,而SqlSession就相当于JDBC中的执行器一样,它可以执行SQL并返回结果。而 SqlSessionFactory 则是通过我们刚刚配置的全局配置文件MyBatis.xml创建的。