第一个 MyBatis 程序
在初步对 MyBatis 有一个认识之后,我们来写 MyBatis 的第一个程序。
我们学习一个知识,肯定经历 宏观 —> 微观 这样一个过程,学习 MyBatis 也不例外。我们要先了解并熟悉 MyBatis 执行的具体流程,再根据每个流程进行详细的分析。这是我推荐的一种学习方式。
那么就开始我们今天的学习吧!
新建一个数据库
Mybatis 作为一个持久层框架,学习第一步就要建立一个测试数据库,这个数据库不需要特别复杂。下面的数据库是一个书籍的数据库,内含字段:书籍id、书籍名称、书籍作者
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(8) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`author` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
数据库表如下图所示:
建立 MyBatis 架构
这里采用 Maven 搭建项目
这里我们创建普通的 Maven 工程即可,在 pom.xml 中我们添加 MyBatis 和 MySql 驱动的依赖,这样 Maven 就会自动将我们需要的 Jar包导入项目当中
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
接着我们创建 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>
<!-- 配置别名 -->
<typeAliases>
<!-- package用于要指定配置别名的包,当指定之后,该包下所有实体类都会注册别名,且别名就是类名,不区分大小写 -->
<package name="book.pojo"></package>
</typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/javaweb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- package用于指定dao接口所在的包,当指定完成之后,就不需要在写resources或者是Class了 -->
<package name="book.mapper" />
</mappers>
</configuration>
- typeAliases:配置别名,所有实体类将会注册别名,通过别名也可以调用对应的实体类
- environments:即 MyBatis 连接的数据库环境。在这个节点下可配置多个 environment,在不同环境如开发、测试、生产等环境下,根据 environments 上 default 属性指定对应的 id,即可连接对应的数据库
- mappers:定义 mapper.xml 文件的路径,mapper.xml 里存放着各个 Sql 语句
pojo 实体类
对应数据库表中的信息,我们建立起 Book 实体类
public class Book {
int id;
String name;
String author;
// get、set、toString方法省略
}
建立 BookMapper 接口
BookMapper 定义客户端调用的方法
public interface BookMapper {
List<Book> findAll();
}
BookMapper.xml
BookMapper.xml 是 MyBatis 中定义 Sql 的 xml 文件。同时,也做为 BookMapper 接口的实现类,是我们在日常开发中最经常接触到的一个文件。许多人在编写这个文件的过程中经常出错,因此我们需要多注意这个文件。
下面是一个查找所有书籍、根据Id查找书籍的两个语句
<?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="book.mapper.BookMapper">
<select id="findAll" resultType="book">
select * from book;
</select>
<select id="findById" resultType="book" parameterType="int">
select * from book where id = #{id};
</select>
</mapper>
- namespace:绑定接口文件,从包路径开始
- id:绑定接口文件中的方法
- resultType:定义返回数据的类型
- parameterType:定义接收数据的类型
项目的结构图如下所示
注:service 为不是实现类,而是主方法,MyBatis 的执行流程将在这里实现
MyBatis 的执行流程
BookService 的编写
- 1、调用 getResourceAsStream() 方法读取 resources 目录下的 MyBatis-Config.xml
- 2、通过 SqlSessionFactoryBuilder 工厂类构造器构建一个工厂 SqlSessionFactory、
- 3、使用工厂创建 SqlSession 对象
- 4、使用 SqlSession 创建 Dao 接口对象
- 5、执行接口方法,调用 Mapper.xml
- 6、执行事务的提交,并释放资源
public class BookService {
private static InputStream in;
private static SqlSession session;
private static BookMapper bookMapper;
public static void main(String[] args) throws IOException {
in = Resources.getResourceAsStream("MyBatis-Config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
session = factory.openSession();
bookMapper = session.getMapper(BookMapper.class);
List<Book> books = bookMapper.findAll();
Book bookId = bookMapper.findById(1);
session.commit();
session.close();
in.close();
for (Book book : books) {
System.out.println(book);
}
System.out.println(bookId);
}
}
运行结果
执行流程图解
接下来的文章,我们将逐一分析这几个流程,对每一个流程进行详细的解析,后续精彩,也请不要错过。