75、SpringBoot 整合 MyBatis------使用 Mapper 作为 Dao 组件

news2024/11/19 21:27:02

总结:
添加一个User类和Mapper接口,
在Mapper接口这个类上面添加@Mapper注解,就可以和数据库进行映射了,
然后在mapper接口写方法和sql,
在测试类进行测试。
pom文件就添加个mybatis-spring-boot-starter 的组件,用于SpringBoot整合Mybatis的需要
就ok了

其实是MyBatis去整合SpringBoot ,SpringBoot本身没有去整合MyBatis(看不上MyBatis)。
如:mybatis-spring-boot-starter ,这个整合的组件是以MyBaits开头的,表示这个整合进SpringBoot的功能组件是MyBatis搞出来的。

★ MyBatis框架

MyBatis只是一个SQL映射框架,并不是ORM框架。
它只是负责将ResultSet映射成对象List。

它不像Jpa(Hibernate)那么强大、但它比JPA(Hibernate)用起来更简单、更容易上手。

核心组件:用Mapper充当DAO组件,而且这些mapper只需提供接口,MyBatis会负责为它们生成实现类。

★ MyBatis整合Spring Boot

 MyBatis不整合Spring Boot(或Spring)时,MyBatis需要自行使用SqlSession的getMapper()方法来获取Mapper组件;

 整合Spring Boot(或Spring)时,Spring容器会负责生成Mapper组件,

 并能将Mapper组件注入到其他组件(如Service组件)中。 

★ MyBatis整合Spring Boot与整合Spring的区别

区别只是整合Spring则需要开发者自行配置DataSource、SqlSessionFactory等基础资源

整合Spring Boot不再需要开发者自行配置DataSource和SqlSessionFactory——因为Spring Boot的功能就是自动配置。

【补充:】如果你要用MyBatis访问多数据库,必须手动配置多个数据源、多个SqlSessionFactory——自动配置就失效的。

★ 创建Mapper组件的两种方式:

▲ Spring Boot或Spring如何识别哪些是Mapper组件呢?有两种方式:

-  方式1:为每个Mapper接口添加@Mapper注解即可

- 方式2:在应用配置类(比如程序主类、或带@Configuration注解修饰的类)上添加@MapperScan注解,
         该注解需要指定一个包名,用于告诉Spring Boot或Spring到哪个包下搜索Mapper组件。

MyBatis官方文档推荐使用第一种方式,可能这种方式更加安全、可靠。
    ——因为:Spring Boot与MyBatis的整合,其实是由Mybatis来提供的,并不是由Spring boot提供的。

★ 基于Mapper的开发方式

(1)定义映射的对象类,非常普通的POJO,甚至无需任何注解。

(2)定义Mapper接口(只需要接口),
     Mapper接口中的每个方法都需要提供SQL语句。
     不同的SQL语句使用对应的注解来提供

代码演示

演示使用 springboot整个mapper组件来关联数据库

一个普通的java类
在这里插入图片描述

Mapper
Mapper 组件,就是Dao 接口,贴上了这个 @Mapper 注解,就可以和数据库进行映射了。
在这里写sql
在这里插入图片描述
在这里插入图片描述

UserMapperTest 测试类
对mapper的方法进行测试
都是成功的
在这里插入图片描述
在这里插入图片描述

application.properties 配置文件
连接数据库,输出sql语句

如果想看到SQL语句输出,需要将Mapper组件的日志级别设置为debug
在这里插入图片描述
如果注释掉,就看不到了,如图
在这里插入图片描述

pom.xml
MyBatis 整合在 SpringBoot 需要添加的组件
在这里插入图片描述

完整代码:

User

package cn.ljh.app.domain;

import lombok.Data;

//普通的java类
@Data
public class User
{
    private Integer id;
    private String name;
    private String password;
    private int age;

    public User()
    {
    }

    public User(Integer id, String name, String password, int age)
    {
        this.id = id;
        this.name = name;
        this.password = password;
        this.age = age;
    }

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

UserMapper

package cn.ljh.app.dao;


import cn.ljh.app.domain.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper
{
    //Mapper接口中的每个方法都需要为它提供SQL语句

    //增
    @Insert("insert into user_inf values (null,#{name},#{password},#{age})")
    int save(User user);

    //删
    @Delete("delete from user_inf where user_id = #{id}")
    int deleteById(Integer id);

    //改
    @Update("update user_inf set name = #{name} , password = #{password} ,age = #{age} where user_id = #{id}")
    int update(User user);

    //查
    @Select("select user_id as id , name , password , age from user_inf where user_id = #{id}")
    User findById(Integer id);


    //根据名字模糊查询
    @Select("select user_id as id , name , password , age from user_inf where name like #{namePattern}")
    List<User> findByNameLike(String namePattern);

    //根据年龄大小进行范围查询
    @Select("select user_id as id ,name , password , age from user_inf where age > #{startAge}")
    List<User> findByAgeGreaterThan(int startAge);


    //根据年龄区间进行范围查询
    @Select("select user_id as id ,name , password , age from user_inf where age between #{startAge} and #{endAge} ")
    List<User> findByAgeBetween(@Param("startAge") int startAge, @Param("endAge") int endAge);

    //根据密码模糊查询
    @Select("select user_id as id ,name , password , age from user_inf where password like #{passwordPattern}")
    List<User> findBySql(String passwordPattern);

    //根据年龄范围修改名字
    @Update("update user_inf set name = #{name} where age between #{startAge} and #{startAge}")
    int updateNameByAge(@Param("name") String name, @Param("startAge") int startAge, @Param("endAge") int endAge);

}

UserMapperTest

package cn.ljh.app;

import cn.ljh.app.dao.UserMapper;
import cn.ljh.app.domain.User;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserMapperTest
{
    @Autowired
    private UserMapper userMapper;

    //添加user对象
    @ParameterizedTest
    @CsvSource({"aa,xxx,2", "bb,xxx,3"})
    public void testSave(String name, String password, int age)
    {
        //没有id,save就是添加
        int save = userMapper.save(new User(null, name, password, age));
        System.err.println(save);
    }

    //根据id删除用户对象
    @ParameterizedTest
    @ValueSource(ints = {15})
    public void testDelete(Integer id)
    {
        userMapper.deleteById(id);
    }

    //根据id修改对象
    @ParameterizedTest
    @CsvSource({"13,a,x,2"})
    public void testUpdate(Integer id, String name, String password, int age)
    {
        //有id,save就是修改
        int update = userMapper.update(new User(id, name, password, age));
        System.err.println(update);
    }



    //根据id查询对象
    @ParameterizedTest
    @ValueSource(ints = {1})
    public void testFindById(Integer id)
    {
        User user = userMapper.findById(id);
        System.err.println(user);
    }

    //根据名字模糊查询
    @ParameterizedTest
    @ValueSource(strings = {"孙%", "%精"})
    public void testFindByNameLike(String namePattern)
    {
        List<User> users = userMapper.findByNameLike(namePattern);
        users.forEach(System.err::println);
    }

    //根据年龄大小进行范围查询
    @ParameterizedTest
    @ValueSource(ints = {500, 10})
    public void testFindByAgeGreaterThan(int startAge)
    {
        List<User> users = userMapper.findByAgeGreaterThan(startAge);
        users.forEach(System.err::println);
    }





    //根据年龄区间进行范围查询
    @ParameterizedTest
    @CsvSource({"15,20", "500,1000"})
    public void testFindByAgeBetween(int startAge, int endAge)
    {
        List<User> users = userMapper.findByAgeBetween(startAge, endAge);
        users.forEach(System.err::println);
    }


    //根据密码模糊查询
    @ParameterizedTest
    @ValueSource(strings = {"niu%", "%3"})
    public void testFindBySql(String passwordPattern)
    {
        List<User> users = userMapper.findBySql(passwordPattern);
        users.forEach(System.err::println);
    }

    //根据年龄范围修改名字
    @ParameterizedTest
    @CsvSource({"牛魔王dd,800,1000"})
    @Transactional
    @Rollback(false)
    public void testUpdateNameByAge(String name, int startAge, int endAge)
    {
        int i = userMapper.updateNameByAge(name, startAge, endAge);
    }
}

application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# 如果想看到SQL语句输出,需要将Mapper组件的日志级别设置为debug
logging.level.cn.ljh.app.dao=debug

db.sql

-- drop database springboot;
-- create database springboot;
-- use springboot;

-- 创建user_inf表
create table user_inf
(
    user_id int primary key auto_increment,
    name varchar(255),
    password varchar(255),
    age int
);
-- 向user_inf表插入数据
insert into user_inf
values
(null, '孙悟空', 'sun123', 500),
(null, '牛魔王', 'niu123', 800),
(null, '猪八戒', 'zhu123', 600),
(null, '沙和尚', 'sha123', 580),
(null, '白鼠精', 'bai123', 23),
(null, '蜘蛛精', 'zhi123', 18),
(null, '玉面狐狸', 'yumian123', 21),
(null, '杏仙', 'xing123', 19);

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.4.5</version>
    </parent>
    <groupId>cn.ljh</groupId>
    <artifactId>MyBatis_Mapper</artifactId>
    <version>1.0.0</version>
    <name>MyBatis_Mapper</name>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <!-- 导入 MyBatis 整合 spring boot 的 starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C 语言简单入门

C 语言发展历史|标准 1972年&#xff0c;丹尼斯里奇&#xff08;Dennis Ritch&#xff09;和肯汤普逊&#xff08;Ken Tompson&#xff09;在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年&#xff0c;布莱恩柯林汉&#xff08;Brian Kernighan&#xff…

Java核心知识点整理大全5-笔记

书接上回Java核心知识点整理大全4-笔记_希斯奎的博客-CSDN博客 目录 3.4.1. HashMap&#xff08;数组链表红黑树&#xff09; 3.4.1.1. JAVA7 实现 3.4.1.2. JAVA8 实现 3.4.2. ConcurrentHashMap 3.4.2.1. Segment 段 3.4.2.2. 线程安全&#xff08;Segment 继承 ReentrantLo…

【C语言】联合体与结构体如何巧妙配合使用节省内存空间?

本篇文章目录 1. 联合体的特点2. 计算联合体占用内存大小3. 利用联合体的特点判断当前机器是以什么字节序顺序存储数据&#xff1f;4. 联合体什么时候使用&#xff1f; 1. 联合体的特点 联合也是一种特殊的自定义类型&#xff0c;这种类型定义的变量也包含一系列的成员&#x…

微软最热门的10款前端开源项目!

本文来盘点微软开源的十大前端项目&#xff0c;这些项目在 Github 上获得了超过 45 万 Star&#xff01; Visual Studio Code Visual Studio Code 是一款由微软开发的开源的代码编辑器。它支持多种编程语言&#xff0c;如C、C、C#、Python、JavaScript 和 TypeScript 等&…

Nginx 代理 MySQL 连接

文章目录 Nginx 代理 MySQL 连接1. 前言2. 部署 Nginx&#xff0c;MySQL3. ngx_stream_core_module 配置方式3.1 stream3.2 server3.3 listen3.4 配置示例 4. 限制访问 IP4.1 allow4.2 deny4.3 配置示例 5. 综合案例 Nginx 代理 MySQL 连接 原文地址&#xff1a;https://mp.wei…

Windows批处理文件 @echo off作用

bat批处理文件代码中有echo off 这样的语句&#xff0c;echo off是什么意思&#xff1f;在bat中扮演着什么作用呢&#xff1f; A&#xff1a; echo off的意思是在批处理运行命令的时候不会一条一条的显示执行的命令&#xff0c;与之相匹配的还有echo on。 echo off 与echo on …

机器视觉康耐视Visionpro-脚本编写标记标识:点,直线,矩形,圆

显示标记标识的重要作用就是,对NG或者OK对操作机器视觉的人去看到具体位置缺陷或者NG坐标。 一.点CogPointMarker CogPointMarker PointMarker1 = new CogPointMarker();//创建对象,点CogPointMarker //注意运行工具 PointMarker1.X = 100; PointMarker1

基于FPGA的16QAM调制verilog代码

名称&#xff1a;FPGA的16QAM调制verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用FPGA实现16QAM的调制&#xff0c;并进行仿真 代码下载&#xff1a;FPGA的16QAM调制verilog_Verilog/VHDL资源下载 代码网&#xff1a;hdlcode.com 部分代…

万界星空科技MES与WMS如何集成的?

传统制造业数字化转型正汹涌而来&#xff0c;要进一步提高产业发展质量&#xff0c;重塑制造业竞争优势&#xff0c;就必须加快发展数字化制造&#xff0c;加紧推动制造业的数字化转型。在这一数字化背景下&#xff0c;新一代科技技术的运用尤为重要。在具体实践中&#xff0c;…

工具及方法 - 二进制编辑软件

之前介绍过用Notepad和VSCode进行二进制文件编辑。 很多通用型的文本编辑器都会集成二进制文件编辑功能&#xff0c;或者使用插件等形式扩展此项功能。比如vi/vim等工具。 而且&#xff0c;作为文本编辑、二进制文件编辑一类的工具&#xff0c;数量众多&#xff0c;各有特色。…

msvcp140为什么会丢失?msvcp140.dll丢失的解决方法

msvcp140.dll 是一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些函数和类&#xff0c;例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2015 及以上版本中的一部分&#xff0c;用于支持 C 应用程序的运行。如果 msvcp140.dll 丢失或损坏&#xff…

redis安装问题

title: “Redis安装问题” createTime: 2022-01-04T20:47:0608:00 updateTime: 2022-01-04T20:47:0608:00 draft: false author: “name” tags: [“redis”] categories: [“install”] description: “测试的” title: redis安装可能遇到的错误 createTime: 2022-01-04T20:47…

如何在pycharm专业版使用conda虚拟环境

目 录 本文背景 前提条件 操作步骤 1.查看当前虚拟环境 2.创建一个新的虚拟环境 3.查看虚拟环境 4.切换虚拟环境 5.无依赖运行pandas代码 6.终端安装依赖 7.再次运行 本文背景 在经历了之前痛苦的环境各种报错的情况下&#xff0c;我终于知道如何有序地管理环境了 那…

SPA项目之登录注册--请求问题(POSTGET)以及跨域问题

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.ElementUI是什么 &#x1f4a1;准备工作&…

数据结构与算法-时间复杂度与空间复杂度

数据结构与算法 &#x1f388;1.概论&#x1f52d;1.1什么是数据结构&#xff1f;&#x1f52d;1.2什么是算法&#xff1f; &#x1f388;2.算法效率&#x1f52d;2.1如何衡量一个算法的好坏&#xff1f;&#x1f52d;2.2算法的复杂度&#x1f52d;2.3时间复杂度&#x1f4d6;2…

Oracle 12c自动化管理特性的新进展:自动备份、自动恢复和自动维护功能的优势|oracle 12c相对oralce 11g的新特性(3)

一、前言: 前面几期讲解了oracle 12c多租户的使用、In-Memory列存储来提高查询性能以及数据库的克隆、全局数据字典和共享数据库资源的使用 今天我们讲讲oracle 12c的另外的一个自动化管理功能新特性:自动备份、自动恢复、自动维护的功能 二、自动备份、自动恢复、自动维护…

新思路,4.9+氧化应激相关基因构建风险模型

今天给同学们分享一篇氧化应激预后模型的生信文章“Construction of an oxidative stress-related lncRNAs signature to predict prognosis and the immune response in gastric cancer”&#xff0c;这篇文章于2023年5月31日发表在Scientific Reports期刊上&#xff0c;影响因…

【LeetCode】——双指针(快慢指针)/多指针

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 前言 大家好&#xff01;这是新开的LeetCode刷题专栏&#xff0c;这个专栏不只是随便的拿一些我练过的题讲解&#xff0c;而是总结我在刷题中的一些方法适用于一大类的题&#xff0c;是给大家提供这一大类题的解题…

STL-函数对象、谓词、常用算法

函数对象 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一个函数 函数对象使用…

第一章:最新版零基础学习 PYTHON 教程(第十节 - Python 语句中的 – Python 如果否则)

在现实生活中,有时我们需要做出一些决定,并根据这些决定来决定下一步应该做什么。在编程中也会出现类似的情况,我们需要做出一些决定,并根据这些决定我们将执行下一个代码块。编程语言中的决策语句决定了程序执行流程的方向(控制流)。 Python 中的控制流类型 在Python…