1、前言
持久层是JavaEE中访问数据库的核心操作,Mybatis是一款优秀的持久层框架,诞生于2010年,2013年迁移至Github。它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。
阿里巴巴、京东、美团等互联网公司基本都是用Mybatis做为持久层框架的,所以Mybatis是一定要学的!
优点:
①简单易学:本身就很小且简单,单纯仅需要一个依赖即可。易于学习,通过源代码和案例可以非常容易理解设计思路和实现。
②灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
③解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
④Spring-boot提供全自动化配置方案,可以做到Mybatis开箱即用。Mybatis官网及文档请访问:https://mybatis.org/mybatis-3/zh/index.html。
2、项目框架
- Spring boot 2.5.3
- Mybatis3.5+
- 数据库Mysql8.0+
- JDK13
- 开发工具 IntelliJ IDEA
3、零基础完成一个Mybatis操作数据库的案例
①第一步:利用idea创建一个spring项目,添加Web、Mybatis、Mysql数据库连接池三个依赖。


打开maven配置文件pom.xml,已经添加上述依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>②第二步:创建数据库和表并配置数据库基本连接信息。
首先我们在Mysql中创建example数据库,并创建book表,该表由id(int,主键自增长类型)、name(varchar255)、author(varchar255)三个字段组成,我们添加4条数据。Mysql的具体教程可以参考链接https://blog.csdn.net/youarenotme/article/details/109291819

其次我们需要在spring配置文件application.properties中添加数据库基本连接信息。

具体配置文本如下:
#mysql配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/example?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root账号密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver这里,我先行把项目最终结构树进行展示,以方便大家后续搭建项目结构。

③第三步:创建实体类Book,数据库访问接口BookMapper。
package com.example.mybatis.pojo;
/**
* Book实体类,和数据库保持一致即可
*/
public class Book {
private Integer id;
private String name;
private String author;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getAuthor() {return author;}
public void setAuthor(String author) {this.author = author;}
}package com.example.mybatis.repository;
import com.example.mybatis.pojo.Book;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
//@Mapper注解表明该接口是一个Mybatis中的Mapper,这种方式需要在每个Mapper上添加注解
@Mapper
public interface BookMapper {
int addbook(Book book);//增加接口
int updatebook(Book book);//更新接口
int deletebook(Integer id);//删除接口
Book getbookbyid(Integer id);//单条查询接口
List<Book> getallbook();//批量查询接口
}这里@Mapper注解表明该接口是一个Mybatis中的Mapper,这种方式需要在每个Mapper上添加注解,还有一种简单的方式是在配置类上面添加@MapperScan("com.example.mybatis")注解,即表示扫描"com.example.mybatis包下面所有接口作为Mapper,这样就不需要在每个接口都配置@Mapper了。
④第四步:在数据库访问接口BookMapper相同位置创建BookMapper.xml文件,代码如下:
(1)针对BookMapper接口中的每一个方法都在BookMapper.xml中列出了实现。
(2)#{...}用来代替接口中的参数,实体类中的属性可以直接通过#{实体类属性名}获取。
(3)<select></select>中写入sql语句如:select、update、insert、delete等。
<?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.repository.BookMapper">
<insert id="addbook" parameterType="com.example.mybatis.pojo.Book">
insert into book(name,author) values(#{name},#{author})
</insert>
<update id="updatebook" parameterType="com.example.mybatis.pojo.Book">
update book set name=#{name},author=#{author} where id =#{id}
</update>
<delete id="deletebook" parameterType="int">
delete from book where id=#{id}
</delete>
<select id="getbookbyid" parameterType="int" resultType="com.example.mybatis.pojo.Book">
select * from book where id =#{id}
</select>
<select id="getallbook" resultType="com.example.mybatis.pojo.Book">
select * from book
</select>
</mapper>BookMapper.xml中的参数说明:
| namespace | 命名空间,这里填入BookMapper接口在项目中的地址 |
| id | BookMapper接口中方法名 |
| parameterType | 传入参数类型,可以是数据类型或者实体类 |
| resultType | 返回参数类型,可以是数据类型或者实体类 |
⑤第五步:创建服务类BookService和访问接口BookController,代码如下:
package com.example.mybatis.service;
import com.example.mybatis.pojo.Book;
import com.example.mybatis.repository.BookMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookService {
@Autowired
BookMapper bookMapper;//引入数据库访问接口BookMapper
public int addbook(Book book){
return bookMapper.addbook(book);
}
public int updatebook(Book book){
return bookMapper.updatebook(book);
}
public int deletebook(Integer id){
return bookMapper.deletebook(id);
}
public Book getbookbyid(Integer id){
return bookMapper.getbookbyid(id);
}
public List<Book> getallbook(){
return bookMapper.getallbook();
}
}package com.example.mybatis.controller;
import com.example.mybatis.pojo.Book;
import com.example.mybatis.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class BookController {
@Autowired
BookService bookService;//引入服务类BookService
@GetMapping("/book")
public void mybook(){
//根据实体新增
Book book1 = new Book();//创建一个新增的实体类book1
book1.setName("聊斋志异");
book1.setAuthor("蒲松龄");
int i = bookService.addbook(book1);//返回执行成功条数
System.out.println("新增书>>>数量为"+i+"条!");
//根据id更新
Book book2 = new Book();//创建一个更新的实体类book2,将三国演义更新为三国志通俗演义
book2.setId(4);
book2.setName("三国志通俗演义");
book2.setAuthor("罗贯中");
int j = bookService.updatebook(book2);//返回执行成功条数
System.out.println("更新书>>>数量为"+j+"条!");
//根据id单条查询
Book book3 = bookService.getbookbyid(2);//查询id=2的书
System.out.println("id为2的书名>>>"+book3.getName());
//批量查询
List<Book> book4 = bookService.getallbook();//查询book表里面所有数据
for (Book booklist : book4){
System.out.println("批量查询>>>"+booklist.getId()+booklist.getName()+booklist.getAuthor());
}
//根据id删除
int k =bookService.deletebook(1);//删除id=1的数据,返回执行成功条数
System.out.println("删除id为1的书>>>数量为"+k+"条!");
}
}⑥第六步:配置pom.xml文件,将BookMapper.xml放在项目下。(很重要,否则项目编译时会丢失该xml文件)
在Maven工程中,XML配置文件默认放在resource目录下,但是上文中的BookMapper.xml是与数据库访问接口BookMapper放在一起,所以Maven工程运行时会忽略BookMapper.xml文件,因此需要在pom.xml文中重新指明一下xml资源文件位置,配置如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>这样整个项目就既包含src/main/java下面的xml资源,也包含resource下面的所有资源。配置完毕需要重新加载pom.xml(右键点击pom.xml>>Maven>>Reload project)。
4、测试及结论
①我们启动项目,接下来在浏览器中输入http://localhost:8080/book,即可以看到数据库中的变化,控制台也打印出相关日志。

数据库变为:

②结论:
(1)Mybatis基本上实现了开箱即用的特性。自动化配置将开发者从反繁杂的配置文件中解脱出来,以专注于业务逻辑开发。
(2)SQL代码写在xml文件中,统一管理便于维护,并通过数据库访问接口类进行读取,进而实现业务逻辑和数据库访问分离。
(3)Mybatis作为学习Java和Spring的必要课程,是需要详细掌握的。
(4)Git上还提供了开源的企业级Mybatis-Mate和增强包Mybatis-plus,可供使用。详细访问https://gitee.com/baomidou/mybatis-plus