导语
在之前的分享中没有做过关于Mybatis内容相关的分享,这段时间深入的学习了关于Mybatis的相关知识,这里首先来对Mybatis的相关基础知识做一个介绍,这个系列的分享博主会做到有始有终的去完成,也是对博主对Mybatis使用的更加的一种深入了解,更新博客的时间是不固定的,但是博主一定会坚持的分享下去,如果涉及到有代码编写的分享,博主也会第一时间将GitHub相关的内容进行分享,让跟多的人来分享学习。
Mybatis简单介绍
首先来说Mybatis的前身是iBatis,是Clinton Begin在2001年左右的时候发布的一个开源的项目,最初的目的不是用来做Java持久化框架的,但是随着时间的推移,不断的发展成为了现在的每个开发者都或多或少了解到的Java持久层框架。在2010年左右的时候IBatis从Apache分离成为了现在我们了解到的Mybatis。
Mybatis是Java持久层框架,支持我们称为是自定义的SQL查询,无论是通过注解的方式还是通过XML配置文件的方式都支持自定义查询,Mybatis还支持存储过程和高级映射,消除了JDBC代码中通过手动设置参数和映射结果集等操作。
与其他的ORM框架不同的是,Mybatis并没有将Java对象和数据库表对象进行关联。而是将Java中的某个方法与使用的SQL进行了关联。这样就可以在Service层通过方法直接调用。另外也可以对数据库的各种功能进行扩展充分的利用数据库的各种功能。例如存储过程、视图、各种复杂SQL等等。
与JDBC相比较,Mybatis简化了相关的代码。是因为Mybatis提供了一个映射引擎,声明式的将SQL语句与执行结果进行了树形映射,通过XML或者是注解,可以将SQL语句进行动态的生成等等
Mybatis 还支持声明式的缓存操作,当一条SQL语句被标记为可以进行缓存之后,在第一次执行的时候回将从数据库中获取到的数据存储在高速缓存中,后面在进行同样的操作的时候就可以直接从高速缓存中进行获取,而不需要再次进行数据库的查询。在Mybatis中默认使用的Java的HashMap进行缓存实现,还有用于OSCache、Ehcache、Hazelcast和Memcached连接的默认连接器,同时Mybatis还提供了有关的API实现通过其他方式进行缓存等擦操作。
Mybatis的官方地址如下
https://github.com/mybatis
- Mybatis 3 地址 https://github.com/mybatis/mybatis-3
- generator 生成器地址 https://github.com/mybatis/generator
- ehcache-cache 默认Ehcache地址https://github.com/mybatis/ehcache-cache
- redis-cache 实现地址 https://github.com/mybatis/redis-cache
- spring 工具包地址 https://github.com/mybatis/spring
- Spring Boot工具包地址 https://github.com/mybatis/spring-boot-starter
当然除了这些地址外,还有很多的开发者在基于Mybatis基础上开发了很多的内容,笔者也有自己的代码生成工具配置,在之前的博客中也有过分享。代码生成器
如何使用Mybatis
创建一个Maven项目
配置项目的Pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mybatis</groupId>
<artifactId>support-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
首先要配置的就是源代码的编码方式为UTF-8编码配置如下
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
第二步配置的就是JDK的版本,这里使用的是JDK1.8 版本配置如下
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
进行到这一步基本的Maven配置就算是完成了,但是如果要使用Mybatis的话就需要进一步的引入到Mybatis的相关依赖才能进行操作,接下来就在Maven的Pom文件中引入相关Mybatis的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
当然以上的配置并不是完全所有的配置文件,整个的Pom配置如下,不但要加入Mybatis的依赖还要加入JDBC依赖以及日志相关的依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mybatis</groupId>
<artifactId>support-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.28</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
到这里整个的MyBatis Maven项目算是配置完成了,那么怎么样让这个项目运行起来。
简单配置将Maven项目运行起来
数据库中数据表的准备
在本地数据库中运行如下的脚本建立一个User的数据表。然后简单的加入几个用户信息
CREATE TABLE `user` (
`id` int(45) NOT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
配置MyBatis相关连接内容
配置MyBatis的方式有很多中,这里介绍的是最常见的一种配置方式就是通过XML方式进行配置
这个配置我们在MyBatis的官方文档中也可以找到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>
<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>
首先需要做的事情就是,在src/main/resources文件夹下创建一个mybatis-config.xml的配置文件,将上面的内容复制粘贴进去,进行如下的一些修改
<?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>
// 设置logImpl属性并且指定配置通过LOG4J进行日志输出操作
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
// 配置包名,通常在配置的时候要配置它的全路径名称,也就是为这个包起一个别名,在使用的时候可以直接使用它的别名
<typeAliases>
<package name="com.nh.mybatis.model"/>
</typeAliases>
// 配置数据库连接相关的信息,
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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="root"/>
</dataSource>
</environment>
</environments>
// 配置一个映射文件的路径。
<mappers>
<mapper resource="com/nh/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
配置Model对象和Mapper映射
在指定的Model路径下面编写对应的User实体类
public class User {
private Long id;
private String username;
private String password;
public User() {
}
public User(Long id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在指定的XML路径下创建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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</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">
// XML的根元素,指定了当前的名称空间,以及映射了一个名称空间
<mapper namespace="com.nh.mybatis.mapper.UserMapper">
// 表示定义了一个查询语句,用于绑定的ID是selectAll,查询结果为 User
<select id="selectAll" resultType="User">
select id,username,password from user
</select>
</mapper>
配置日志文件
在src/main/resources路径下添加log4j.properties文件输入如下的内容,当然这段文字在官网的logging目录中也可以找到。
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
编写测试类
在编写测试类之前首先在Maven依赖中加入单元测试相关的依赖如下
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
在test模块中创建如下的测试类,运行并测试
public class UserMapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init(){
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testSelectAll(){
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> selectAll = sqlSession.selectList("selectAll");
System.out.println(selectAll.toString());
sqlSession.close();
}
}
运行之后会发现有如下的异常抛出,没有找到对应的UserMapper.xml的配置文件,也就是说我们的Mapper映射文件没有被找到在配置中做如下的修改。
为什么会出现这种情况,因为在我们的IDEA项目中resources目录下的内容就可以看做是根目录,我们在上面的配置中采用的那种方式并不适用于这里,所以将UserMapper.xml 文件移动到resources的mapper文件夹下进行如下的配置调整。
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
目录结构如下
启动过程分析
- 首先通过Resource 工具将配置文件读取到Reader中
- 通过SessionFactoryBuilder构建一个SessionFactory工厂对象,在这个过程中通过解析配置文件中的内容创建一个指定的SessionFactory对象,这个对象就是为我们提供SQLSession对象的,而这个SQLSession对象就是我们在操作数据库的时候需要的一个SQLSession会话。
- 通过编写好的XML配置文件中的SQL语句将内容通过SQLSession会话与数据库进行交互。完成之后将对象封装成一个List进行返回。
- 最后记得要关闭Session,不然就会导致整个的MySQL连接资源耗尽。
测试成功
输出结果如下
总结
上面内容参考了MyBatis官网相关内容,创建了一个Maven项目了解了简单的MyBatis相关的基础知识,通过最简单的方式将一个MyBatis的项目运行起来。主要这里要强调的就是整个的MyBatis的启动过程,也就是在测试文件中编写的内容。整个就是整个的MyBatis的运行过程。当然MyBatis还有很多的复杂用法在后续的分享中都会涉及到。