MyBatis的详细大全,结合项目(Day35)

1 学习目标

  1. 了解MyBatis的介绍和历史
  2. 重点掌握SpringBoot整合MyBatis
  3. 重点掌握MyBatis基于注解方式
  4. 重点掌握MyBatis基于XML方式

2 MyBatis介绍

  • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.

3 MyBatis的历史

  • 原是Apache的一个开源项目iBatis, 该项目最初由Clinton Begin创建。2005年,该项目被提交到了Apache Software Foundation。但是由于名称与IBM拥有的商标iSeries和DB2的i系列冲突,因此项目名称与2010年被更改为MyBatis。

4 SpringBoot整合MyBatis

4.1 项目准备

①在JSDSecondStage项目下,创建MyBatisDemo模块,并指定版本号为2.5.4

②为项目添加相关依赖

注意: 无需引入spring对jdbc的驱动,因为MyBatis会自动引入

html 复制代码
<!--mysql数据库驱动依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!--引入相关mybatis依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

4.2 配置数据源

  • 在application.yml文件中设置基础配置
html 复制代码
#设置连接数据库的url、username、password,这三部分不能省略
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8
    username: root
    password: root

5 MyBatis基于注解方式

5.1 编写实体类

  • ORM(Object Relational Mapping):对象关系映射,指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。其具体的映射规则是:一张表对应一个类,表中的各个字段对应类中的属性,表中的一条数据对应类的一个对象

  • MyBatis可以自动将查询的结果与对应实体类映射,所以需要准备与查询的表相关联的实体类,需要注意的是,实体类的属性需要和表字段保持一致

  • 由于此处我们的入门案例是查询locations表,所以创建Locations类,并在该类中声明与locations表字段相同的属性(属性声明时,最好开启驼峰规则)

①**Locations**

java 复制代码
public class Locations {
    private Integer locationId;
    private String streetAddress;
    private String postalCode;
    private String city;
    private String stateProvince;
    private String countryId;

    public Integer getLocationId() {
        return locationId;
    }

    public void setLocationId(Integer locationId) {
        this.locationId = locationId;
    }

    public String getStreetAddress() {
        return streetAddress;
    }

    public void setStreetAddress(String streetAddress) {
        this.streetAddress = streetAddress;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStateProvince() {
        return stateProvince;
    }

    public void setStateProvince(String stateProvince) {
        this.stateProvince = stateProvince;
    }

    public String getCountryId() {
        return countryId;
    }

    public void setCountryId(String countryId) {
        this.countryId = countryId;
    }

    @Override
    public String toString() {
        return "Locations{" +
                "locationId=" + locationId +
                ", streetAddress='" + streetAddress + '\'' +
                ", postalCode='" + postalCode + '\'' +
                ", city='" + city + '\'' +
                ", stateProvince='" + stateProvince + '\'' +
                ", countryId='" + countryId + '\'' +
                '}';
    }
}

5.2 定义接口和方法

  • MyBatis需要准备一个接口类,作为Mapper,该接口中的每一个方法可以绑定一条SQL,实现调用接口方法即可调用SQL的功能

  • 在 MyBatis 中,Mapper 接口的命名一般要遵循一定的规范,以便于开发人员理解和维护代码。以下是一些常用的命名规范:

    • Mapper 接口的名称应该与对应的 SQL 语句相对应,可以根据表名或者业务功能命名,比如 UserMapper、OrderMapper 等。
    • Mapper 接口的方法名应该能够清晰地表示这个方法所执行的 SQL 语句,一般可以使用动词加上表名或者业务功能的方式来命名,比如 addUser、updateOrder 等。
    • Mapper 接口中的方法参数名应该与 SQL 语句中的参数名相对应,这样可以提高代码的可读性和可维护性。

①**LocationsMapper**

java 复制代码
//指定这是一个操作数据库的mapper
@Mapper
public interface LocationsMapper {
    @Select("SELECT * FROM locations")
    public List<Locations> getLocationsAll();
}

②**TestMyBatisAnno**

java 复制代码
/**
 * 用于测试基于MyBatis注解开发的入门案例
 */
@SpringBootTest
public class TestMyBatisAnno {
    @Autowired
    private LocationsMapper locationsMapper;

    @Test
    public void testGetLocationsAll() {
        List<Locations> locationsAll = locationsMapper.getLocationsAll();
        for (Locations locations : locationsAll) {
            System.out.println(locations);
        }
    }
}

③**application.yml开启驼峰规则**

html 复制代码
#开启驼峰规则
mybatis:
  configuration:
    map-underscore-to-camel-case: true

5.3 测试增删改查

①**LocationsMapper**

java 复制代码
//指定这是一个操作数据库的mapper
@Mapper
public interface LocationsMapper {
    @Select("SELECT * FROM locations")
    public List<Locations> getLocationsAll();
    @Insert("INSERT INTO locations values(6666,'TEST','TEST','TEST','TEST','MX')")
    public int addLocations();

    @Update("UPDATE locations SET city='BEIJING' WHERE location_id = 6666")
    public int updateLocations();

    @Delete("DELETE FROM locations WHERE location_id = 6666")
    public int deleteLocations();
}

②**TestMyBatisAnno**

java 复制代码
/**
 * 用于测试基于MyBatis注解开发的入门案例
 */
@SpringBootTest
public class TestMyBatisAnno {
    @Autowired
    private LocationsMapper locationsMapper;

    @Test
    public void testGetLocationsAll() {
        List<Locations> locationsAll = locationsMapper.getLocationsAll();
        for (Locations locations : locationsAll) {
            System.out.println(locations);
        }
    }

    @Test
    public void testAddLocations() {
        int rows = locationsMapper.addLocations();
        System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");
    }

    @Test
    public void testUpdateLocations() {
        int rows = locationsMapper.updateLocations();
        System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");
    }

    @Test
    public void testDeleteLocations() {
        int rows = locationsMapper.deleteLocations();
        System.out.println(rows > 0 ? "删除成功!" : "删除失败!!");
    }
}

5.4 @MapperScan的使用

  • 由于Mapper接口是需要使用@Mapper注解的,但是随着后续的开发,可能这样的Mapper接口会变得很多,那么可能每个接口都要加@Mapper注解,就会变得很麻烦,所以可以在SpringBoot的主启动类上添加@MapperScan注解,并指定要扫描的mapper包,这样的话,就会自动去获取指定包下的接口了

①**MyBatisDemoApplication**

java 复制代码
//指定mapper接口所在包,当主启动类执行时,会自动扫描指定包下的接口
@MapperScan(value = "cn.tedu.mapper")
@SpringBootApplication
public class MyBatisDemoApplication {

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

}

6 MyBatis基于XML文件

6.1 编写实体类

  • 由于此处我们的入门案例是查询jobs表,所以将Jobs类复制到项目中

6.2 定义接口和方法

  • MyBatis需要准备一个接口类,作为Mapper,该接口中的每一个方法可以绑定一条SQL,实现调用接口方法即可调用SQL的功能

①**JobsMapper**

java 复制代码
package cn.tedu.mapper;

import cn.tedu.pojo.Jobs;
import java.util.List;

public interface JobsMapper {
    public List<Jobs> getJobsAll();
}

6.3 定义SQL文件

  • MyBatis基于XML文件的方式,是通过让SQL文件和指定的接口绑定,然后SQL语句统一书写在XML文件中
  • 一般情况下,MyBatis的mapper.xml和mapper接口会同名,原因是为了方便开发人员进行代码的管理和维护。

JobsMapper.xml文件

html 复制代码
<?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="cn.tedu.mapper.JobsMapper">

</mapper>

6.4 定义SQL

  • 在SQL文件中,可以书写任意的SQL,只不过需要写在对应的标签中,并且id还要和对应的接口名相同

  • 在SQL文件中通过select标签定义查询表所有记录的SQL语句

    • id的值必须要和绑定的接口中的方法名相同
    • resultType则表示查询的结果封装到那个实体类中,也就是返回值的类型,如果返回的是集合,则定义集合中元素的类型
  • 在SQL文件中通过insert ,update ,delete标签定义增删改表中记录的SQL语句

JobsMapper.xml文件

html 复制代码
<?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="cn.tedu.mapper.JobsMapper">
    <select id="getJobsAll" resultType="cn.tedu.pojo.Jobs">
        SELECT * FROM jobs
    </select>
</mapper>

6.5 指定MyBatis中mapper文件扫描路径

  • MyBatis在使用XML方式开发时,必须要在配置文件中指定mapper文件所在路径,否则会找不到资源
html 复制代码
mybatis:
  mapper-locations: classpath: mapper文件所在路径

①**application.yml**

html 复制代码
#设置连接数据库的url、username、password,这三部分不能省略
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8
    username: root
    password: root
#开启驼峰规则
mybatis:
  configuration:
    map-underscore-to-camel-case: true
  #指定mapper文件路径
  mapper-locations: classpath:mapper/*.xml

6.6 测试查询

①**TestMyBatisXml**

java 复制代码
/**
 * 用于测试基于MyBatis注解开发的入门案例
 */
@SpringBootTest
public class TestMyBatisXml {
    @Autowired
    private JobsMapper jobsMapper;

    @Test
    public void testGetJobsAll() {
        List<Jobs> all = jobsMapper.getJobsAll();
        for (Jobs jobs : all) {
            System.out.println(jobs);
        }
    }
}

6.7 测试增删改操作

①**JobsMapper接口**

java 复制代码
public interface JobsMapper {
    public List<Jobs> getJobsAll();
    public int insertJobs();

    public int updateJobs();

    public int deleteJobs();
}

②**JobsMapper.xml**

html 复制代码
<?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="cn.tedu.mapper.JobsMapper">
    <select id="getJobsAll" resultType="cn.tedu.pojo.Jobs">
        SELECT job_id, job_title, min_salary, max_salary FROM jobs
    </select>
    <insert id="insertJobs">
        INSERT INTO jobs VALUE ('6666', 'TEST', 10000, 30000)
    </insert>
    <update id="updateJobs">
        UPDATE jobs SET job_title='TEST666' WHERE job_id = '6666'
    </update>
    <delete id="deleteJobs">
        DELETE FROM jobs WHERE job_id = '6666'
    </delete>
</mapper>

③**TestMyBatisXml**

java 复制代码
/**
 * 用于测试基于MyBatis注解开发的入门案例
 */
@SpringBootTest
public class TestMyBatisXml {
    @Autowired
    private JobsMapper jobsMapper;

    @Test
    public void testGetJobsAll() {
        List<Jobs> all = jobsMapper.getJobsAll();
        for (Jobs jobs : all) {
            System.out.println(jobs);
        }
    }
    @Test
    public void testInsert() {
        int rows = jobsMapper.insertJobs();
        System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");
    }

    @Test
    public void testUpdate() {
        int rows = jobsMapper.updateJobs();
        System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");
    }

    @Test
    public void testDelete() {
        int rows = jobsMapper.deleteJobs();
        System.out.println(rows > 0 ? "删除成功!" : "删除失败!!");
    }
}

上一篇文章:SpringBoot整合JDBCTemplate(day34)-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/142098654

下一篇文章:MyBatis的占位符(day36)-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/142969916

相关推荐
草莓base11 分钟前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
Allen Bright25 分钟前
maven概述
java·maven
qystca27 分钟前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
编程重生之路27 分钟前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱27 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子32 分钟前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
努力进修36 分钟前
“探索Java List的无限可能:从基础到高级应用“
java·开发语言·list
politeboy37 分钟前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
Daniel 大东1 小时前
BugJson因为json格式问题OOM怎么办
java·安全
Ajiang28247353043 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++