Mybatis的介绍和使用,并与SpringBoot整合

说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。

前言

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

01—Mybatis的特点

简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。

解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

02—Mybatis的优缺点

1.sql语句与代码分离,存放于xml配置文件中:

优点:便于维护管理,不用在java代码中找这些语句;

缺点:JDBC方式可以用用打断点的方式调试,但是Mybatis不能,需要通过log4j日志输出日志信息帮助调试,然后在配置文件中修改。

2.用逻辑标签控制动态SQL的拼接:

优点:用标签代替编写逻辑代码;

缺点:拼接复杂SQL语句时,没有代码灵活,拼写比较复杂。不要使用变通的手段来应对这种复杂的语句。

3.查询的结果集与java对象自动映射:

优点:保证名称相同,配置好映射关系即可自动映射或者,不配置映射关系,通过配置列名=字段名也可完成自动映射。 

缺点:对开发人员所写的SQL依赖很强。

4.编写原声SQL:

优点:接近JDBC,比较灵活。

缺点:对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。

接下来我们将使用springboot以xml配置的方式整合mybatis,并完成测试!!!小伙伴们准备好,又要发车咯!!

03—创建user表用于测试

user表结构如下:(因为是用于测试的表,我们尽量设计的简单一点,仅有两个字段,自增主键字段id,与name字段。)

04—依赖文件pom.xml

pom内容如下:(主要引入三个依赖,mysql的驱动依赖、mybatis的依赖、web项目依赖,具体可以参考以下代码)

<?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.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>test-mybatis2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test-mybatis2</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <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>
        <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>
            </plugin>
        </plugins>
    </build>
​
</project>

05—创建user表的实体类对象

User.java

package com.example.testmybatis2.entity;
​
/**
 * <p>user表的实体类</p>
 * @author Bosen 2021/6/6 12:59
 */
public class User {
​
    private int id;
    private String name;
​
    public int getId() {
        return id;
    }
​
    public void setId(int id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

06—创建user表的映射定义接口

UserMapper.java

package com.example.testmybatis2.mapper;
​
import com.example.testmybatis2.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
​
import java.util.List;
​
/**
 * <p>定义操作user表的接口</p>
 * @author Bosen 2021/6/6 13:01
 */
@Repository
@Mapper
public interface UserMapper {
    /*
     * 查找user表的所有数据
     */
    List<User> findAll();
    
    /*
     * 通过id删除
     */
    int deleteById(int id);
    
    /*
     * 插入数据
     */
    int insert(int id, String name);
    
    /*
     * 通过id修改name
     */
    int updateNameById(int id, String name);
}

07—user表的映射配置文件

UserMapping.xml(注意:标签中的id值需要与UserMapper接口定义的方法名一致!!

<?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.testmybatis2.mapper.UserMapper">
​
    <select id="findAll" resultType="com.example.testmybatis2.entity.User">
        select * from `user`;
    </select>
​
    <delete id="deleteById">
        delete from `user` where id = #{id};
    </delete>
​
    <update id="updateNameById">
        update `user` set `name` = #{name} where id = #{id};
    </update>
​
    <insert id="insert">
        insert into `user`(id, `name`) values(#{id}, #{name});
    </insert>
</mapper>

08—项目配置文件

application.yml

server:
  port: 80
​
spring:
  datasource:
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
​
mybatis:
  mapper-locations: classpath:/static/mapping/*Mapping.xml

09—项目结构图

测试

编写测试类TestMybatis2ApplicationTests.java

package com.example.testmybatis2;
​
import com.example.testmybatis2.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
​
@SpringBootTest
class TestMybatis2ApplicationTests {
​
    @Autowired
    UserMapper userMapper;
​
    /*
     * 查找
     */
    @Test
    void selectTest() {
        System.out.println(userMapper.findAll());
    }
​
    /*
     * 插入
     */
    @Test
    void insetTest() {
        System.out.println(userMapper.insert(1, "伊治"));
    }
​
    /*
     * 修改
     */
    @Test
    void updateTest() {
        System.out.println(userMapper.updateNameById(1, "尼治"));
    }
​
    /*
     * 删除
     */
    @Test
    void deleteTest() {
        System.out.println(userMapper.deleteById(1));
    }
}

插入和查找数据测试:

因为此时我们还未对user表中插入数据,因此我们先执行insrertTest();方法,向表中插入数据,执行完毕后执行查找方法selectTest();

修改数据测试:

可以看到已经成功插入了一条id为1,name为伊治的数据,接下来我们对该条数据的name进行修改,执行方法updateTest();运行成功后执行查找方法得如下结果:

删除数据测试:

此时我们已成功将name字段从“伊治”改为了“尼治”,最后我们再来测试删除方法,执行deleteTest后执行查找方法查看结果,打印如下:

此时查找结果为一个空的list链表,证明我们已经成功删除了id为1的数据。

 👇扫描二维码关注

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云丶言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值