前言
本篇文章将对如何搭建一个Mybatis
测试工程进行介绍,并在此基础上介绍Springboot整合Mybatis
。
正文
一. Mybatis工程搭建
1. 创库建表
首先创建一个名为test的MySQL
数据库,并在test数据库中创建一张book表,建表语句如下所示。
CREATE TABLE book(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
b_name VARCHAR(255) NOT NULL,
b_price FLOAT NOT NULL
)
然后往book表插入三条数据,插入语句如下所示。
INSERT INTO book (b_name, b_price) VALUES ("Math", 20.5)
INSERT INTO book (b_name, b_price) VALUES ("English", 21.5)
INSERT INTO book (b_name, b_price) VALUES ("Water Margin", 30.5)
上述数据用于Mybatis
工程搭建好之后,测试能否基于Mybatis
对数据库中数据进行操作。
2. 添加依赖
需要在POM文件中添加Mybatis
的依赖,以及数据库驱动的依赖。POM文件中添加的依赖如下所示。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
在引入MySQL
数据库驱动时,需要注意安装的MySQL
数据库版本与驱动版本要匹配,具体的关系可以查看下表。
Connector/J Version | Driver Type | JDBC Version | MySQL Server Version | 状态 |
---|---|---|---|---|
5.1 | 4 | 3.0,4.0,4.1,4.2 | 5.6,5.7,8.0 | 可用 |
8.0 | 4 | 4.2 | 5.6,5.7,8.0 | 推荐使用 |
由于安装的MySQL
数据库版本为8.0.26,所以根据官方推荐,使用的驱动版本为8.0.16,而8.0版本的MySQL
数据库驱动在配置dataSource时,driver属性需要设置为com.mysql.cj.jdbc.Driver
,有别于5.1的com.mysql.jdbc.Driver
。
3. 配置文件
添加好Mybatis
相关依赖之后,需要编写Mybatis
的配置文件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>
<settings>
<setting name="useGeneratedKeys" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.mybatis.learn.dao"/>
</mappers>
</configuration>
如果不清楚配置文件的各个标签以及含义,可以参考MyBatis XML配置,里面有关于Mybatis
配置的详细说明。
4. 实体类
新建一个Book
实体类,用于和book表进行映射,如下所示。
@Data
public class Book {
private long id;
private String bookName;
private float bookPrice;
}
5. 映射接口和映射文件
由于在mybatis-config.xml
中注册映射文件时是基于<package name="com.mybatis.learn.dao"/>
这样的方式进行注册,这种方式要求映射接口和映射文件需要同名且在同一目录下,所以这里编写一个映射接口名为BookMapper
,以及编写一个映射文件名为BookMapper.xml
。映射接口BookMapper
如下所示。
public interface BookMapper {
List<Book> selectAllBooks();
}
映射文件BookMapper.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="com.mybatis.learn.dao.BookMapper">
<resultMap id="bookResultMap" type="com.mybatis.learn.entity.Book">
<result column="b_name" property="bookName"/>
<result column="b_price" property="bookPrice"/>
</resultMap>
<select id="selectAllBooks" resultMap="bookResultMap">
SELECT
b.id, b.b_name, b.b_price
FROM
book b
</select>
</mapper>
由于maven默认不会将src/main/java下的非Java
文件进行打包,所以需要在POM文件中再作如下配置,以实现将映射文件也一并打包。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
6. 工程结构
整个工程结构如下所示。
其中MybatisTest
类用于测试查询功能,如下所示。
public class MybatisTest {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream(resource));
SqlSession sqlSession = sqlSessionFactory.openSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
List<Book> books = bookMapper.selectAllBooks();
books.forEach(book -> System.out.println(book.toString()));
}
}
这里特别注意Resources.getResourceAsStream()
这个方法,该方法的注释如下。
Returns a resource on the classpath as a Stream object.
即Resources.getResourceAsStream()
这个方法会去加载classpath下的配置文件,那么在MybatisTest
测试类中,就会去classpath下加载名为mybatis-config.xml
的配置文件。现在先将整个工程编译一下,并去查看编译后的目录结构,如下所示。
所以可以成功读取到Mybatis
的配置文件。
现在执行MybatisTest
测试类,结果如下。
上述结果表明整个测试工程搭建成功,可以通过Mybatis
对数据库进行操作。
二. Springboot整合Mybatis
Mybatis
提供了和Springboot整合的启动器,基于启动器,可以方便的使用Mybatis
,本节将对Springboot整合Mybatis
进行介绍。
首先在POM文件中引入Mybatis
启动器,如下所示。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
最后测试时采用基于rest工具调用接口的方式来触发对数据库的操作,因此还需要引入web依赖,如下所示。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.1</version>
</dependency>
在使用了mybatis-spring-boot-starter
启动器之后,无需再单独为Mybatis
提供配置文件,对于Mybatis
的配置直接写在application.yml中即可,如果在application.yml中没有对Mybatis
进行任何配置,那么Mybatis
的所有配置项将使用默认值。同时dataSource的配置不用再配置到Mybatis
中,按照Springboot配置数据源的方式进行配置即可。application.yml文件内容如下所示。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
username: root
password: root
mybatis:
configuration:
use-generated-keys: true
本节中,映射接口BookMapper
,映射文件BookMapper.xml
与实体类Book
和第一节中完全一致,所以这里不再赘述,但是需要在Springboot的启动类加上@MapperScan
注解来指定映射文件所在的目录,如下所示。
@SpringBootApplication
@MapperScan("com.mybatis.learn.dao")
public class MybatisLearnApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisLearnApplication.class, args);
}
}
至此整合已经结束,整个工程结构如下所示。
service层和controller层用于测试。MybatisService
的实现如下所示。
@Service
public class MybatisService {
@Autowired
private BookMapper bookMapper;
public List<Book> selectAllBooks() {
return bookMapper.selectAllBooks();
}
}
在成功完成整合之后,可以从Spring
容器中获取每个映射接口的映射实例,所以在MybatisService
中通过注入的方式获取到了映射接口BookMapper
的映射实例。MybatisController
的实现如下所示。
@RestController
public class MybatisController {
@Autowired
private MybatisService mybatisService;
@RequestMapping(value = "/api/v1/selectall", method = RequestMethod.GET)
public ResponseEntity<List<Book>> selectAllBooks() {
List<Book> books;
try {
books = mybatisService.selectAllBooks();
} catch (Exception e) {
return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
}
return new ResponseEntity<>(books, HttpStatus.OK);
}
}
最后基于rest工具调用接口,结果如下所示。
总结
本篇文章介绍了如何在一个Maven
工程中通过引入Mybatis
依赖包来搭建一个连接数据库的测试工程,然后对Springboot整合Mybatis
进行了案例演示,无论哪种方式,通过Mybatis
操作数据库都相较于传统JDBC
方式具有更方便更强大的特性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。