带动态查询的mybatis案例请参考:
https://blog.csdn.net/weixin_38568503/article/details/121381914.

项目结构:
在这里插入图片描述

一、创建一个SpringBoot项目

项目名称:springboot-mybatis-druid

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加部分依赖:

在这里插入图片描述

在这里插入图片描述

二、pom中引入相关依赖:

需要的依赖预览:

记忆方式:mysql数据库驱动–>druid数据库连接池–>mybatis进行增删改查
①连接mysql数据库的驱动:mysql数据库驱动依赖mysql-connector-java
②使用druid和springboot整合的数据库连接池的:druid-spring-boot-starter
③进行数据库的增删改查的mybatis和springboot的整合依赖:mybatis-spring-boot-starter
web核心依赖:spring-boot-starter-web

注意:这里为了大家更加专注mybatis的使用,所以不使用thymeleaf模板进行页面渲染。
这里我也没有使用druid依赖,因为druid依赖需要多些一个配置文件config,在配置文件中配置druid监控等各种bean,比较麻烦。而使用druid-spring-boot-starter则不需要单独配置各种bean

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.example</groupId>
    <artifactId>springboot-mybatis-druid</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatis-druid</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <!--spring-boot-starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--对应自己电脑安装的mysql版本-->
            <version>8.0.22</version>
        </dependency>
        <!--druid-spring-boot连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>
        <!--mybatis-spring-boot-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <!--spring-boot-starter-web核心模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.0</version>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--spring-boot-test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--打包插件(spring-boot-maven的打包方式)-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

依赖分析:(有些博主还导入spring-boot-starter-jdbc,其实用了mybatis后就没必要导入了,多此一举)
在这里插入图片描述

三、编写application.yml:

首先删除掉自带的application.properties.
然后在resources文件夹下新建File文件application.yml

因为我们依赖导入了数据库驱动等,所以需要在yml中进行数据库连接信息的配置,以及mybatis的一些配置。
application.yml:

spring:
  #数据库的连接信息:5项,这里我是mysql8的连接信息
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
    password: root
    username: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource  #当前数据源操作类型
    #以下省略druid的监控的一些配置。

mybatis:
  #匹配sql语句的映射文件的位置,classpat代表在resources下
  mapper-locations: classpath:mybatis/mapper/*.xml
  #以下两个配置可以省略,然后在mapper映射文件中配置也是可以的。
  #使用type-aliases-package中指定entity扫描包类让mybatis自定扫描到自定义的entity
  type-aliases-package: com.example.entity
  configuration:
    # 开启驼峰uName自动映射到u_name
    map-underscore-to-camel-case: true

(1)yml配置说明为了省事,我们可以在yml中只配置mybatis.mapper-locations来指明sql语句位置即可,开启驼峰命名匹配可以在mybatis的mapper映射文件中配置,而resultType直接使用实体类的全限定名即可

(2)type-aliases-package使用说明:

方式一:直接使用实体类的全限定名:
mapper.xml文件中resultType或者parameterType会使用JavaBean作为返回结果或者参数需要使用完全限定名来指定引用。

例如

<select id="getUsers" resultType="com.example.entity.User">

方式二:yml中进行配置,然后使用类名来直接代替全限定名:
又或者你可以通过在application.properties中指定POJO扫描包来让mybatis自动扫描到自定义POJO:
application.properties中的配置:

mybatis.type-aliases-package=com.example.entity

mapper中可以写成

<select id="getUsers" resultType="User">

到此配置完毕。我们开始写代码



四、准备数据库和表t_book:

本人机器上安装的是mysql8.0.22版本:

我们可以创建一个test数据库,然后在test数据库中创建一个表t_book

这里我使用sqlyog,也可以使用navcat等
在这里插入图片描述

然后点击保存即可。
可以先保存一两条数据备用;

在这里插入图片描述

五、创建一个实体类Book:

entity.Book:

package com.example.springbootmybatisdruid.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book{
    private int id;
    private String name;
    private String author;
    //两个参数的构造方法
    public Book(String name,String author){
        this.name = name;
        this.author = author;
    }

}

六、编写mapper接口:

在不使用mybatis之前我们一般是dao层–>service层–>controller层。

使用了mybatis之后,我们的dao层被演变成了两个东西:
(1)java包下的mapper接口(mapper接口和实体类,controller等包同级)。
(2)resources类路径下的mapper映射文件(写sql语句的)。

注意:这里我们先测试一个查询的方法,其他增删改查的方法在文章末尾补充
mapper.BookMapper:

package com.example.springbootmybatisdruid.mapper;
import com.example.springbootmybatisdruid.entity.Book;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper//指定这是一个操作数据库的mapper
@Repository
public interface BookMapper {
    //增加,修改,删除图书,都返回int,用于判断是否增加成功等
    /*
    public int addBook(Book book);
    //删除图书
    public int delBook(int id);
    //修改图书
    public int updateBook(Book book);
    */
    //查询图书
    public Book queryBook(int id);
}

项目结构

在这里插入图片描述

七、编写sql映射文件:

注意此sql映射文件对应于mapper接口.

在resources目录下新建mybatis/mapper目录,并在这个目录下新建BookMapper.xml文件:

在这里插入图片描述

注意:sql映射文件的位置是根据yml中的约定路径来写的

在这里插入图片描述

注意
1.namespace中需要与使用@Mapper的接口对应
2.BookMapper.xml文件名称必须与使用@Mapper的接口名一致
3.标签中的id必须与@Mapper的接口中的方法名一致,且参数一致

BookMapper.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">
<!--namespace对应mapper接口所在的位置-->
<mapper namespace="com.example.springbootmybatisdruid.mapper.BookMapper">
    <!--对应mapper接口中的方法public Book queryBook(int id);-->
    <select id="queryBook" resultType="book">
        select * from t_book where id = #{id}
    </select>
   
</mapper>

八、编写service层:

(1)service接口:service.BookService
service接口中不需要任何注解,只是一些方法的声明。

package com.example.springbootmybatisdruid.service;

import com.example.springbootmybatisdruid.entity.Book;

public interface BookService {
    //复制mapper接口中的方法到这里
    public Book queryBook(int id);
}

(2)写接口的实现类: service.impl.BookServiceImpl 实现刚才的接口BookService

注意:需要在接口实现类中使用@Service注解,才能被SpringBoot扫描,使用@Authwired/@Resource注入

package com.example.springbootmybatisdruid.service.impl;
import com.example.springbootmybatisdruid.entity.Book;
import com.example.springbootmybatisdruid.mapper.BookMapper;
import com.example.springbootmybatisdruid.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookMapper bookMapper;

    @Override
    public Book queryBook(int id) {
        Book book = bookMapper.queryBook(id);
        return book;
    }
}

九、编写controller层:

controller.BookController:

package com.example.springbootmybatisdruid.controller;
import com.example.springbootmybatisdruid.entity.Book;
import com.example.springbootmybatisdruid.service.BookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController//返回json字符串
@Slf4j//日志打印
public class BookController {
    @Autowired
    private BookService bookService;//这里注入接口,实际使用的是实现类
    //1.通过id获取book所有信息
    // http://localhost:8080/queryBook/1(此处1为要获取的id)
    @RequestMapping(value = "/queryBook/{id}",method = RequestMethod.GET)//使用restful风格传参数
    public Book queryBook(@PathVariable("id") Integer id){
        Book book = bookService.queryBook(id);
        log.info("查询结果:{}",book);
        return book;//@RestController使得返回的是book实体类的字符串形式
    }
  
}

十、在启动类中添加对@MapperScan的扫描:

注意:如果启动类中使用了@MapperScan,可以在mapper接口中不用使用@Mapper注解

package com.example.springbootmybatisdruid;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.springbootmybatisdruid.mapper")//使用MapperScan批量扫描所有的Mapper接口;
public class SpringbootMybatisDruidApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisDruidApplication.class, args);
    }

}

项目结构:
在这里插入图片描述

十、运行测试:

启动运行springboot项目:
在这里插入图片描述
看控制台打印:发现使用druid数据源:

在这里插入图片描述
浏览器测试:

在这里插入图片描述
控制台打印出:
在这里插入图片描述



附录(其他增删改查方法):

同理:测试新增等方法:
1.mapper.BookMapper接口:

@Mapper//指定这是一个操作数据库的mapper
@Repository
public interface BookMapper {
    //增加,修改,删除图书,都返回int,用于判断是否增加成功等
    public int addBook(Book book);
    //删除图书
    public int delBook(int id);
    //修改图书
    public int updateBook(Book book);
    //查询图书
    public Book queryBook(int id);
}

2.BookMapper.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">
<!--namespace对应mapper接口所在的位置-->
<mapper namespace="com.example.springbootmybatisdruid.mapper.BookMapper">

    <!--对应mapper接口方法public void addBook(Book book);-->
    <insert id="addBook" parameterType="book">
        insert into t_book (name,author) values (#{name},#{author});
    </insert>
    <!--对应mapper接口方法public int delBook(int id);-->
    <delete id="delBook" parameterType="integer">
        delete from t_book where id = #{id};
    </delete>
    <!--对应mapper接口方法public int updataBook(Book book);-->
    <update id="updateBook" parameterType="book">
        update t_book
        set name=#{name},author=#{author}
        where id=#{id};
    </update>
    <!--对应mapper接口中的方法public Book queryBook(int id);-->
    <select id="queryBook" resultType="book">
        select * from t_book where id = #{id};
    </select>

</mapper>

service接口:

public interface BookService {
    //复制mapper接口中的方法到这里
    public int addBook(Book book);

    public int delBook(int id);

    public int updateBook(Book book);

    public Book queryBook(int id);
}

service实现类:

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookMapper bookMapper;

    @Override
    public int addBook(Book book) {
        int i = bookMapper.addBook(book);
        return i;
    }

    @Override
    public int delBook(int id) {
        int i = bookMapper.delBook(id);
        return i;
    }

    @Override
    public int updateBook(Book book) {
        int i = bookMapper.updateBook(book);
        return i;
    }

    @Override
    public Book queryBook(int id) {
        Book book = bookMapper.queryBook(id);
        return book;
    }
}

BookController:

@RestController//返回json字符串
@Slf4j//日志打印
public class BookController {
    @Autowired
    private BookService bookService;//这里注入接口,实际使用的是实现类
    //1.通过id获取book所有信息
    // http://localhost:8080/queryBook/1(此处1为要获取的id)
    @RequestMapping(value = "/queryBook/{id}",method = RequestMethod.GET)//使用restful风格传参数
    public Book queryBook(@PathVariable("id") Integer id){
        Book book = bookService.queryBook(id);
        log.info("查询结果:{}",book);
        return book;//@RestController使得返回的是book实体类的字符串形式
    }

    //2.插入新用户,这里使用浏览器模拟发送get请求的一个实体类
    //http://localhost:8080/addBook?name=西游记4&author=吴承恩4
    @RequestMapping(value = "/addBook",method = RequestMethod.GET)//注意,实际开发中将这里改成POST
    public String addBook(Book book){

        int i = bookService.addBook(book);
        if(i >= 1){
            return "新增book成功";
        }else {
            return "新增book失败";
        }
    }

    //通过id删除
    //http://localhost:8080/delBook/8(此处8为要删除的id)
    @RequestMapping(value = "/delBook/{id}",method = RequestMethod.GET)//使用restful风格传参数
    public String delBook(@PathVariable("id") int id){
        int i = bookService.delBook(id);
        if(i >= 1){
            return "刪除book成功";
        }else {
            return "刪除book失败";
        }
    }

    //根据id更新book信息,这里使用浏览器模拟发送get请求的一个实体类
    //http://localhost:8080/updateBook?id=12&name=西游记2&author=吴承恩2
    @RequestMapping(value = "/updateBook",method = RequestMethod.GET )//注意,实际开发中将这里改成POST
    public String updateBook(Book book){
        log.info("前台参数book:{}",book);
        int i = bookService.updateBook(book);
        if(i >= 1){
            return "修改book成功";
        }else {
            return "修改book失败";
        }
    }
}

测试:

发送get请求到后台:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐