1.介绍和基本配置

Smile_slime_47

Mybatis是什么


Mybatis是一个Java的持久层框架数据持久层(DAO层)是在程序中直接对数据库进行持久化操作的部分。JDK自身提供了访问数据库的接口API——JDBC,Mybatis本质上是对JDBC的封装。JDBC在开发过程中过于面向底层,直接使用JDBC对数据库进行访问会导致许多操作变得繁琐且缺少安全性,而Mybatis在JDBC的基础上扩展了功能,避免了JDBC原有的许多参数设置和获取结果集上的繁琐,简化了程序对数据库的操作。

关于Mybatis的文档可以在官网中获取:https://mybatis.org/mybatis-3/zh/index.html

在项目中加入Mybatis依赖


JAR包

直接将官网下载的JAR依赖包放在项目的CLASSPATH下即可

Maven

在Maven中加入如下依赖项

1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>

要注意的是,Mybatis是基于JDBC的框架,除了在项目中加载Mybatis的依赖以外,还要根据数据库加载对应的SQL驱动依赖

1
2
3
4
5
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.1.2</version>
</dependency>

这里根据自己使用的SQL数据源加载对应的驱动,然后在下面的XML配置好driver即可

核心类


SqlSessionFactory

Mybatis的SQL会话是通过工厂模式管理的,Mybatis提供了一个SqlSessionFactory的工厂类来获取SqlSession,且一个SqlSessionFactory往往对应一个SqlSession

1
2
3
4
5
public class SqlSessionFactory{
public SqlSession openSession();
public SqlSession openSession(boolean autoCommit);
//参数控制创建的SqlSession是否自动提交
}
1
2
3
4
5
//设置配置文件路径
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//传入配置文件,获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession

SqlSession是一个SQL会话,提供了Sql操作的相关方法,还有关于事务的相关操作

1
2
3
4
5
6
public class SqlSession{
T getMapper(Class<T> type); //获取mapper
void commit(); //提交事务
void rollback(); //回滚事务
void close(); //释放资源
}

XML构建


我们需要在CLASSPATH的Resource目录下如下创建mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--resources/mybatis-config.xml-->
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/> <!--SQL驱动类-->
<property name="url" value="${url}"/> <!--数据库url-->
<property name="username" value="${username}"/> <!--数据库username-->
<property name="password" value="${password}"/> <!--数据库password-->
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
...
</mappers>
</configuration>

Properties

Properties标签可以引入其他的properties配置文件,并通过${}引入其中的字段,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--resources/mybatis-config.xml-->
<?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>
<properties resource="jdbc.peroperties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/> <!--SQL驱动类-->
<property name="url" value="${url}"/> <!--数据库url-->
<property name="username" value="${username}"/> <!--数据库username-->
<property name="password" value="${password}"/> <!--数据库password-->
</dataSource>
</environment>
...
</configuration>

此外,也可以手动地在标签内替换掉文件中的某些字段的值:

1
2
3
<properties resource="jdbc.peroperties">
<property name="username" value="root">
</properties>

Settings

Settings可以配置Mybatis的许多配置选项,详见官方文档

1
2
3
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

typeAlias

对于mapper配置文档,返回类型设置为全限定名较为繁琐,这时可以通过设置typeAlias为其设置别名

1
2
3
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
</typeAliases>

此外,可以通过package子标签批量设置别名,规则默认设置为全限定名的最后一个类名

1
2
3
<typeAliases>
<package name="domain.blog"/>
</typeAliases>

environments

Mybatis支持同时配置多个数据库环境,但一个SqlSessionFactory仅能对应一个环境

对于SqlSessionFactory,可以选择传入配置中对应环境的环境ID

1
2
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

其中environment参数若忽略则默认使用默认环境ID:default=”XXX”

1
2
3
4
5
6
7
8
9
10
11
12
13
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>

mappers

mappers标签指示Mybatis去哪些路径搜索mapper配置文件,支持多种路径格式

1
2
3
4
5
6
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
1
2
3
4
5
6
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
1
2
3
4
5
6
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
1
2
3
4
<!-- 将包内的映射器接口全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>

当使用package子标签时,要求resource的路径结构和src的路径结构相同,这样才能将对应mapper配置文件和接口类放在同一路径下

代码模板

在IntelliJ IDEA中,我们可以在文件->设置->编辑器->文件和代码模板中创建一个配置文件的模板,这样就可以直接创建一个mybatis的配置文件预设

XML映射


1
2
3
4
5
/*实际上这里对应的是DAO层接口*/
/*.../org/mybatis/exmaple/BlogMapper*/
public interface BlogMapper{
List<Blog> selectBlog();
}
1
2
3
4
5
6
7
8
9
10
11
<!--resources/org/mybatis/exmaple/BlogMapper.xml-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"> <!--src下的Dao接口定义-->
<select id="selectBlog" resultType="Blog"> <!--Dao接口声明的操作方法和返回类-->
select * from Blog where id = #{id} <!--获取结果集的SQL语句-->
</select>
...
</mapper>

要注意的是,这里从获取到的Blog的SQL结果集会自动和resultType中导入的结果类的各同名字段匹配,也就是说,SQL里获取到的一个数据库的int类型的ID字段会自动对应到Blog类里的int类型的ID字段变量。

在建立完映射后,即可通过

1
2
3
4
5
6
//这里的SqlSession相对于一个数据库的连接(Connection),在try-resource-catch语句执行结束后被释放
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
...
Blog result=mapper.selectBlog(101);
}

来获取一个Dao层接口的实现类(这里底层是通过动态代理来实现的),此时即可直接调用相应方法来获取结果集

Mybatis插件

Free Mybatis Tool

提供了快速生成mapper映射文件和Mybatis语法补全的功能

在Dao接口上alt+enter即可调用mapper.xml生成器

Comments