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); }
|
1 2 3 4 5
| String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
|
SqlSession
SqlSession是一个SQL会话,提供了Sql操作的相关方法,还有关于事务的相关操作
1 2 3 4 5 6
| public class SqlSession{ T getMapper(Class<T> type); 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
| <?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}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${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
| <?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}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${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
| <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
|
public interface BlogMapper{ List<Blog> selectBlog(); }
|
1 2 3 4 5 6 7 8 9 10 11
| <?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"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> ... </mapper>
|
要注意的是,这里从获取到的Blog的SQL结果集会自动和resultType中导入的结果类的各同名字段匹配,也就是说,SQL里获取到的一个数据库的int类型的ID字段会自动对应到Blog类里的int类型的ID字段变量。
在建立完映射后,即可通过
1 2 3 4 5 6
| try (SqlSession session = sqlSessionFactory.openSession()) { BlogMapper mapper = session.getMapper(BlogMapper.class); ... Blog result=mapper.selectBlog(101); }
|
来获取一个Dao层接口的实现类(这里底层是通过动态代理来实现的),此时即可直接调用相应方法来获取结果集
Mybatis插件
提供了快速生成mapper映射文件和Mybatis语法补全的功能
在Dao接口上alt+enter即可调用mapper.xml生成器