Spring Boot教程(五):spring boot整合Mybatis

一、整合过程

1.添加依赖

如果要将其整合到当前项目中,首先我们需要将其依赖配置增加到 pom.xml 文件中,mybatis-springboot-starter 的最新版本为 1.3.2,需要 Spring Boot 版本达到 1.5 或者以上版本,同时,我们需要将数据源依赖和 jdbc 依赖也添加到配置文件中(如果不添加的话,将会使用默认数据源和 jdbc 配置):

 <!-- 引入 MyBatis 场景启动器,包含其自动配置类及 MyBatis 3 相关依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

2.application.properties/xml 配置

Spring Boot 整合 MyBatis 时几个比较需要注意的配置参数:

mybatis.config-location:
配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性,如果项目中配置了 mybatis-config.xml 文件需要设置该参数。

mybatis.mapper-locations:
配置 Mapper 文件对应的 XML 文件路径。

mybatis.type-aliases-package:
配置项目中实体类包路径。

示例:

mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*Dao.xml
mybatis.type-aliases-package=com.wang.entity

我们只配置 mapper-locations 即可,最终的 application.properties 文件如下:

# datasource配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_db?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=你的mysql密码

# 这里的classpath表示resources
mybatis.mapper-locations=classpath:mapper/*Dao.xml

3.启动类增加 Mapper 扫描

在启动类中添加对 Mapper 包扫描 @MapperScan,Spring Boot 启动的时候会自动加载包路径下的 Mapper 接口:

@SpringBootApplication
@MapperScan("com.wang.dao") //会扫描该路径下的Dao类,而无需每个Dao类都使用@Mapper
public class Boot05Application {
    
    

    public static void main(String[] args) {
    
    
        System.out.println("启动spring boot...");
        SpringApplication.run(Boot05Application.class, args);
    }

}

当然也可以直接在每个 Mapper 接口上面添加 @Mapper 注解,但是如果 Mapper 接口数量较多,在每个 Mapper 加注解是挺繁琐的,建议使用扫描注解。

二、实例

首先,确保mysql服务已经启动。

1.数据库中创建表格author

在这里插入图片描述

2.创建实体类

com.wang.entity下创建实体类Author:

扫描二维码关注公众号,回复: 12517520 查看本文章
package com.wang.entity;
import lombok.Data;

@Data
public class Author {
    
    
    private String id;
    private String name;
    private String password;
    private String mail;

    public Author() {
    
    
    }

    public Author(String id, String name, String password, String mail) {
    
    
        this.id = id;
        this.name = name;
        this.password = password;
        this.mail = mail;
    }

    @Override
    public String toString() {
    
    
        return "Author{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", mail='" + mail + '\'' +
                '}';
    }
}

可以看到我没有创建set方法和get方法,但这些都是必须的,其实是因为我引入了工具类,它帮我自动创建了。

下面我介绍一下lombok工具类用法:

  • 导入依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
  • IDEA中下载插件:

依次点击文件-设置-plugins,然后搜索lombok,点击安装,等待安装成功。

  • 通过注解给类自动注入set和get方法:

在类上面使用@Data就可以了。

3.创建Dao类

com.wang.dao下创建AuthorDao接口:

package com.wang.dao;

import com.wang.entity.Author;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper //Application类中已经开启了包扫描,其实这里可以不用此注解
public interface AuthorDao {
    
    

    //增
    int addAuthor(Author author);
    //删
    int delAuthorById(String id);
    //改
    int updateAuthor(Author author);
    //查
    List<Author> getAllAuthor();

}

4.创建Dao接口的映射文件XXDao.xml

在 resources/mapper 目录下新建 Mapper 接口的映射文件 AuthorDao.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 接口的对应关系-->
<mapper namespace="com.wang.dao.AuthorDao">
    <!--配置表结构和实体类的对应关系-->
    <resultMap type="com.wang.entity.Author" id="AuthorResult">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="password" column="password"/>
        <result property="mail" column="mail"/>
    </resultMap>
    <!--针对对应的接口方法,编写具体的 SQL 语句-->
    <insert id="addAuthor" parameterType="com.wang.entity.Author">
        insert into author(id,name,password,mail)
        values(#{
    
    id},#{
    
    name},#{
    
    password},#{
    
    mail})
    </insert>
    <delete id="delAuthorById" parameterType="String">
        delete from author where id=#{
    
    id}
    </delete>
    <update id="updateAuthor" parameterType="com.wang.entity.Author">
        update author
        set name=#{
    
    name},password=#{
    
    password},mail=#{
    
    mail}
        where id=#{
    
    id}
    </update>
    <select id="getAllAuthor" resultMap="AuthorResult">
        select * from author
        order by id desc
    </select>
    
</mapper>

5.新建controller

在com.wang.controller包下创建MybatisController类:

package com.wang.controller;

import com.wang.dao.AuthorDao;
import com.wang.entity.Author;
import com.wang.util.StringTool;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
public class MybatisController {
    
    
    @Resource
    AuthorDao authorDao;

    //增
    @GetMapping("/author/insert")
    public boolean insert(Author author){
    
    
        if(StringTool.isNotBlank(author.getId())&&StringTool.isNotBlank(author.getName())
            &&StringTool.isNotBlank(author.getPassword())){
    
    
            return authorDao.addAuthor(author)>0;
        }
        else {
    
    
            System.out.println("作者信息有误");
            return false;
        }
    }
    //删
    @GetMapping("/author/delete")
    public boolean delete(String id){
    
    
        if(id==null)return false;
        else return authorDao.delAuthorById(id)>0;
    }
    //改
    @GetMapping("/author/update")
    public boolean update(Author author){
    
    
        if(author==null||!StringTool.isNotBlank(author.getId())){
    
    
            System.out.println("id不能为空");
            return false;
        }
        return authorDao.updateAuthor(author)>0;
    }

    //查
    @GetMapping("/author/queryAll")
    public List<Author> queryAll(){
    
    
        return authorDao.getAllAuthor();
    }
}

这里我用到了一个自定义的工具类StringTool,用来判断字符串是否为空或空格。在com.wang.util下定义工具类StringTool:

package com.wang.util;

public class StringTool {
    
    
    public static boolean isNotBlank(String str){
    
    
        if(str==null||str.length()==0)return false;
        char[] chs=str.toCharArray();
        for(char ch:chs){
    
    
            if(ch!=' ')return true;
        }
        return false;
    }
}

6.测试

我们在test下面的com.wang包下创建MybatisTest类:

package com.wang;

import com.wang.controller.MybatisController;
import com.wang.entity.Author;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class MybatisTest {
    
    
    @Autowired
    MybatisController mybatisController;

    @Test
    public void testMybatisController(){
    
    
        //测试insert
        Author author=new Author("123","小王","234","[email protected]");
        System.out.println("test insert:"+mybatisController.insert(author));
        System.out.println("-------------");
        //测试delete
        System.out.println("test delete:"+mybatisController.delete("123"));
        System.out.println("test delete:"+mybatisController.delete("0000"));//并不存在的id
        System.out.println("-------------");
        //测试update
        author.setId("999");
        author.setName("小龙虾");
        author.setMail("[email protected]");
        System.out.println("test update:"+mybatisController.update(author));
        System.out.println("-------------");
        //测试select
        List<Author> list=mybatisController.queryAll();
        System.out.println("test select:");
        for(Author a:list){
    
    
            System.out.println(a);
        }
    }
}

运行方法后:

在这里插入图片描述

在这里插入图片描述

三、Mybatis-Generator自动生成代码

MyBatis Generator 是 MyBatis 官方提供的代码生成器插件,可以用于 MyBatis 和 iBatis 框架的代码生成,支持所有版本的 MyBatis 框架以及 2.2.0 版本及以上的 iBatis 框架。

在前文中我们也介绍了如何使用 MyBatis 进行数据库操作,在进行功能开发时,一张表我们需要编写实体类、DAO 接口类以及 Mapper 文件,这些是必不可少的文件,如果表的数量较大,我们就需要重复的去创建实体类、Mapper 文件以及 DAO 类并且需要配置它们之间的依赖关系,这无疑是一个很麻烦的事情,而 MyBatis Generator 插件就可以帮助我们去完成这些开发步骤,使用该插件可以帮助开发者自动去创建实体类、Mapper 文件以及 DAO 类并且配置好它们之间的依赖关系,我们可以直接在项目中使用这些代码,后续只需要关注业务方法的开发即可。

1.导入依赖

<!--Mybatis-Generator插件-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <dependencies>
                    <dependency>
                        <groupId> mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version> 8.0.23</version>
                    </dependency>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.5</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <phase>package</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <verbose>true</verbose>
                    <!-- 是否覆盖 -->
                    <overwrite>true</overwrite>
                    <!-- MybatisGenerator的配置文件位置 -->
                    <configurationFile>src/main/resources/mybatisGeneratorConfig.xml</configurationFile>
                </configuration>
            </plugin>

2.新增 MyBatis-Generator 的配置文件

在添加插件依赖到 pom.xml 文件中时,我们定义了 Mybatis Generator 的配置文件位置为 src/main/resources/mybatisGeneratorConfig.xml,该文件即为代码生成器插件最重要的配置文件,后续生成代码的规则、数据库连接信息、代码生成后的存放目录等等配置都需要在该配置文件中定义,配置文件内容及相关注释如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="my-blog-generator-config" targetRuntime="MyBatis3">
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="utf-8"/>
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
        <!--创建Java类时对注释进行控制-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库地址及登陆账号密码 改成你自己的配置-->
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/blog?serverTimezone=UTC"
                userId="root"
                password="你的mysql密码">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!--生成实体类设置-->
        <javaModelGenerator targetPackage="com.wang.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!--生成Mapper文件设置-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!--生成Dao类设置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.wang.dao"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!--需要自动生成代码的表及对应的类名设置-->
        <table tableName="generator_test" domainObjectName="GeneratorTest"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

需要自动生成代码的表及对应类名的配置是写在 table 标签中的,如上所示,generator_test 表对应的实体类可以配置为 GeneratorTest,这些是开发者自定义的,也可以改成其他合适的类名。 如果有多张表同时生成,增加多个 table 标签配置即可。
注意:要先在数据库建立相应的表。

3.生成代码

配置文件和表结构都处理完成后就可以进行代码生成步骤了。IDEA 工具中的 Maven 插件中含有 mybatis-generator 的选项,双击 generate 即可,如下图所示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来是最后一个步骤,在代码生成后,我们需要在 DAO 接口类上增加 @Mapper 注解,将其注册到 Spring 的 IOC 容器中以供其他类调用,在生成的文件中默认是没有这个注解的,或者是在主类中添加 @MapperScan 注解将相应包下的所有 Mapper 接口扫描到容器中。

至此,MyBatis-Generator 插件整合完成,也生成了对应的代码,接下来在项目开发时,我们都会使用它来生成我们 DAO 层的代码,之后再根据功能对 Mapper 文件进行修改,使用该插件时的注意事项如下:

由于数据库连接信息是单独定义在配置文件中的,所以在使用时一定要仔细检查,确保数据库连接正常。
在生成代码后,建议将 table 标签注释掉,不然在打包或者生成其他表的代码时会将原先已经生成的代码覆盖,可能会造成一些小麻烦。
代码生成后将 DAO 接口注册至 IOC 容器以供业务方法调用。

猜你喜欢

转载自blog.csdn.net/Tracycoder/article/details/113922282
今日推荐