1、前言
持久层是JavaEE中访问数据库的核心操作,Mybatis是一款优秀的持久层框架,诞生于,迁移至Github。它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。
阿里巴巴、京东、美团等互联网公司基本都是用Mybatis做为持久层框架的,所以Mybatis是一定要学的!
优点:
①简单易学:本身就很小且简单,单纯仅需要一个依赖即可。易于学习,通过源代码和案例可以非常容易理解设计思路和实现。
②灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
③解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
④Spring-boot提供全自动化配置方案,可以做到Mybatis开箱即用。Mybatis官网及文档请访问:/mybatis-3/zh/index.html。
2、项目框架
Spring boot 2.5.3Mybatis3.5+数据库Mysql8.0+JDK13开发工具 IntelliJ IDEA3、零基础完成一个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的具体教程可以参考链接/youarenotme/article/details/109291819
其次我们需要在spring配置文件application.properties中添加数据库基本连接信息。
具体配置文本如下:
#mysql配置spring.datasource.url=jdbc:mysql://127.0.0.1:3306/example?characterEncoding=UTF-8spring.datasource.username=rootspring.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上添加注解@Mapperpublic 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 mapperPUBLIC "-////DTD Mapper 3.0//EN""/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中的参数说明:
⑤第五步:创建服务类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;@Servicepublic class BookService {@AutowiredBookMapper bookMapper;//引入数据库访问接口BookMapperpublic 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;@RestControllerpublic class BookController {@AutowiredBookService bookService;//引入服务类BookService@GetMapping("/book")public void mybook(){//根据实体新增Book book1 = new Book();//创建一个新增的实体类book1book1.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,可供使用。详细访问/baomidou/mybatis-plus