整合Mybatis
MyBatis 是一个半自动化的 ORM 框架,所谓半自动化是指MyBatis只支持将数据库查出的数据映射到POJO实体类上,而实体到数据库的映射则需要我们自己编写SQL语句实现。,相较于Hibernate 这种完全自动化的框架,Mybatis 更加灵活,我们可以根据自身的需求编写 sql 语句来实现复杂的数据库操作。
随着Spring Boot的流行,Mybatis 也开发了一套基于Spring Boot模式的starter: mybatis-spring-boot-spring。使用该模块,将实现构建独立的应用程序,将样板文件减少为零,更少的xml配置。
现在我们来看看怎么使用
引用依赖
在项目pom.xml中配置mybatis-spirng-boot-starte依赖
<!--引入 mybatis-spring-boot-starter 的依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
最新依赖可以参考官网
配置 MyBatis
在Spring Boot的全局配置文件(application.properties/yaml)中进行配置
mybatis配置的属性如上,根据需求配置属性
--- mybatis配置
# 指定mapper.xml位置
mapper-locations:classpath:mybatis/mapper/*.xml
# 扫描实体类的位置,在此处指明扫描实体类的包,在mapper.xml 中就可以不写实体类的全路径名
type-aliase-package: com.liang.pojo
创建实体类
在指定数据库内创建一个worker表,并插入一些数据,如下表
根据worker表,创建相应实体类Worker
导入了lombok依赖
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Worker {
private Integer no;
private String name;
}
创建Mapper接口
在com.liang.mapper创建一个WorkerMapper接口,并在该类上使用@Mapper注解,代码如下:
//注入Mapper注解
@Mapper
public interface WorkerMapper {
//通过id查询工人信息
Worker getWorkerById(@Param("no") int no);
}
注意:当 mapper 接口较多时,我们可以在 Spring Boot 主启动类上使用 @MapperScan 注解扫描指定包下的 mapper 接口,而不再需要在每个 mapper 接口上都标注 @Mapper 注解。
创建Mapper配置文件
xml方式
在配置文件application.properties/yml 通过 mybatis.mapper-locations 指定的位置中创建 WorkerMapper.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.liang.mapper.WorkerMapper">
<select id="getWorkerById" resultType="Worker" parameterType="int">
select * from `worker` where `no`= #{no}
</select>
</mapper>
注解方式
使用Mapper的xml配置进行开发,,需要遵循以下规则:
-
mapper 映射文件中 namespace 必须与对应的 mapper 接口的完全限定名一致。
-
mapper 映射文件中 statement 的 id 必须与 mapper 接口中的方法的方法名一致
-
mapper 映射文件中 statement 的 parameterType 指定的类型必须与 mapper 接口中方法的参数类型一致。
-
mapper 映射文件中 statement 的 resultType 指定的类型必须与 mapper 接口中方法的返回值类型一致。
Mapper接口使用注解的方式,不需要创建Mapper映射文件,也不需要设置 mybatis.mapper-locations,代码如下:
//注入Mapper注解
@Mapper
public interface WorkerMapper {
@Select("select * from `worker` where `no` =#{no}")
//通过id查询工人信息
Worker getWorkerById(@Param("no") int no);
}
创建Service接口
在项目com.liang.service包中创建一个名为WorkerService的接口,代码如下
public interface WorkerService {
public Worker getWorkerById(int id);
}
创建Service接口实现类
在项目com.liang.service包中创建一个名为WorkerServiceImpl的类,代码如下
@Service("userService")
public class WorkerServiceImpl implements WorkerService{
@Autowired
private WorkerMapper workerMapper;
@Override
public Worker getWorkerById(int id) {
return workerMapper.getWorkerById(id);
}
}
创建Controller的类
在项目com.liang.controller包中创建一个名为SearchController的类,代码如下
@Controller
@RequestMapping("/worker")
public class SearchController {
@Autowired
private WorkerService workerService;
@RequestMapping("/query")
public String queryById(int no ,Model model)
{
Worker worker = workerService.getWorkerById(no);
if(worker!=null)
{
System.out.println("查询成功");
}else{
System.out.println("查询失败");
}
//传一个值到worker页面
model.addAttribute("worker",worker);
return "worker";
}
}
创建HTML页面
在项目resources/templates目录下,创建一个worker.html,代码如下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>狂神说</title>
</head>
<body>
<div th:text="${worker.no}">工号</div>
<div th:text="${worker.name}">姓名</div>
</body>
</html>
在项目resources/static目录下,创建一个index.html,代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/worker/query" method="get">
<p>
<input type="text" name="no" placeholder="请输入工号">
</p>
<p>
<input type="submit" value="查询">
</p>
</form>
<script type="text/javascript">
</script>
</body>
</html>
启动Spring Boot
启动sprng boot后,进入index页面,输入指定的工号,就跳转到worker.xml,输出指定worker的信息。
说明
区别: xml和注解
mapper 映射文件其实就是一个 XML 配置文件,它存在 XML 配置文件的通病,即编写繁琐,容易出错。即使是一个十分简单项目,涉及的 SQL 语句也都十分简单,我们仍然需要花费一定的时间在mapper 映射文件的配置上。
为了解决这个问题,MyBatis 针对实际实际业务中使用最多的“增伤改查”操作,分别提供了以下注解来替换 mapper 映射文件,简化配置:
- @Select
- @Insert
- @Update
- @Delete
注意:
mapper 接口中的任何一个方法,都只能使用一种配置方式,即注解和 mapper 映射文件二选一,但不同方法之间,这两种方式则可以混合使用,例如方法 1 使用注解方式,方法 2 使用 mapper 映射文件方式。
我们可以根据 SQL 的复杂程度,选择不同的方式来提高开发效率。
如果没有复杂的连接查询,我们可以使用注解的方式来简化配置;
如果涉及的 sql 较为复杂时,则使用 XML (mapper 映射文件)的方式更好一些。