引言
Spring Boot+MyBatis依然是当下国内最流行和使用最广泛的框架,让我们从基础部分来重新学习下这套经典组合吧。
什么是MyBatis
MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis配置简单,使用方便灵活,下面我们就来看一下Spring Boot如何轻松集成MyBatis的吧!
引入依赖
本文使用的Spring Boot版本为2.7.4,这里可以通过Maven或者Gradle来引入依赖
Maven
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
Gradle
dependencies {
compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2")
}
版本适配情况
因为使用的MySQL数据库,还需要引入以下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
如需要了解MySQL的安装过程,可以查看我的另外一篇文章:CentOS8安装MySQL8详细教程,爬坑必备,希望可以帮到你。
应用配置
设置数据源以及MyBatis的基础配置
# 数据源配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/dbname
username: someuser
password: yourpassword
mybatis:
# Mapper.xml文件的路径配置
mapper-locations: classpath*:/mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
Spring数据源配置
配置数据库连接URL以及用户名密码
MyBatis mapper-locations
配置Mapper.xml文件的存放位置,一般放在resources下的mapper文件夹下(Mapper.java和Mapper.xml一般是要一一对应的,名称最好保持一致),如果未设置的话,会出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)的异常
MyBatis map-underscore-to-camel-case
开启带有下划线的表字段与驼峰命名的Java实体字段自动映射的功能
编写代码
我们先来创建一个user表
create table user
(
id bigint auto_increment
primary key,
name varchar(64) null
);
创建实体类
建好表以后,我们来创建User的实体类
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "id: " + getId() + ", name: " + name;
}
}
创建Mapper接口
下面我们来创建MyBatis中最重要的Mapper接口,真正操作数据库的方法就在这里定义。下面这段代码简单定义了插入数据和查询数据的方法
@Mapper
public interface UserMapper {
void insert(User user);
List<User> select();
}
UserMapper使用了@Mapper注解,用来标记这是一个MyBatis的Mapper接口
创建Mapper XML
Mapper接口已经定义了,那我们具体要怎么实现呢?Mapper.xml就是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">
<mapper namespace="com.example.mybatis.UserMapper">
<insert id="insert" >
insert into user(name)
values (#{name})
</insert>
<select id="select" resultType="com.example.mybatis.User">
select * from user
</select>
</mapper>
我们来分析下上面的这段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">
这是XML的文档声明和DTD文档类型定义,http://mybatis.org/dtd/mybatis-3-mapper.dtd文件中定义了XML的标签、属性以及描述等信息,我们这里不过多关注。
mapper标签
<mapper namespace="com.example.mybatis.UserMapper">
这个标签是用来跟Mapper接口建立关联的,它只有一个属性namespace,用来指定相应Mapper接口的引用Reference。这里如果配置的引用路径不正确,也会出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)的异常。
insert标签
<insert id="insert" >
insert into user(name)
values (#{name})
</insert>
表示一个insert语句,其中id属性是该标签的唯一标识符,对应Mapper接口中定义的具有相同名称的方法,这个例子中就对应UserMapper接口中insert(User.class)方法
#{name}表示获取传入对象中name属性值
select标签
<select id="select" resultType="com.example.mybatis.User">
select * from user
</select>
表示一个select语句,id属性与insert标签的id属性一样
resultType属性定义了查询结果要映射的实体类型
Mapper.xml就相当于是Mapper接口的实现类,mapper标签通过namespace属性与Mapper接口进行映射,mapper下的insert、select等子标签对应的就是Mapper接口的方法,子标签中的id属性值与方法名要
一致。
测试代码
我们创建一个UserTest的测试类
@SpringBootTest
public class UserTest {
@Autowired
UserMapper userMapper;
@Test
void testInsert() {
User user = new User();
user.setName("Spring");
userMapper.insert(user);
System.out.println("Insert success.");
}
@Test
void testSelect() {
List<User> userList = userMapper.select();
System.out.println("Select success: " + userList);
}
}
我们先来测试insert方法,如下图点击测试方法左上角的按钮进行测试
测试成功会输出如下内容
这时我们使用DataGrip或者Navicat去连接数据库,查看数据是否插入成功:
OK,我们再来测试查询的方法,点击运行,输出如下
至此,简单的新增和查询功能就编写与测试完成了。更新和删除这里就不做介绍了,实现起来一样简单优雅。
效率插件
如果你使用的是Intellij IDEA,这里推荐一款插件,可以提高MyBatis的开发效率——MyBtisX。
插件主要功能:
- Mapper的接口和XML之间快速跳转
- 代码提示与检查
- 代码生成器
快速跳转
在IDEA的插件市场里搜索安装后,你会发现Mapper接口和Mapper.xml文件发生了变化:
左侧多出了几个小图标,点击图标或者Ctrl + Alt + 鼠标左键点击方法就可以跳转到Mapper.xml中对应标签上。
代码提示与检查
如果你在IDEA#Database中配置了当前项目使用的数据库,那么在XML中编写SQL语句就会像在DataGrip或Navicat中一样,智能提示,非常方便
假如在XML中我们故意将标签下的namespace属性值的包名写错,如下
这时属性值会变红并有错误提示,跟写Java代码是一样的,这样可以快速发现错误。
代码生成器
在IDEA#Database中找到你要生成代码的表,右键点击会弹出如下提示
点击进入生成器配置页面
点击选择module path,将base package配置为我们的包名com.example.mybatis,然后点击【Next】按钮,进入下面这个页面
可以根据个人需要进行调整,最后点击【Finish】就可以生成代码了。
本文介绍了Spring Boot如何集成MyBatis以及简单使用的过程,后面还会陆续推出一系列MyBatis的进阶课程,这里你可以学到关于MyBatis的一切,有问题可以在评论区交流下,欢迎点赞关注收藏。