Mybatis零基础教程,Java访问数据库核心操作,详解Spring-boot整合Mybatis持久层!

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接口在项目中的地址
idBookMapper接口中方法名
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


版权声明:本文为m0_59562547原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。