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

news/2024/10/19 3:33:06/

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会自动引入

<!--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文件中设置基础配置
#设置连接数据库的url、username、password,这三部分不能省略
spring:datasource:url: jdbc:mysql://localhost:3306/hr?serverTimezone=Asia/Shanghai&characterEncoding=utf8username: rootpassword: 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;}@Overridepublic 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 {@Autowiredprivate LocationsMapper locationsMapper;@Testpublic void testGetLocationsAll() {List<Locations> locationsAll = locationsMapper.getLocationsAll();for (Locations locations : locationsAll) {System.out.println(locations);}}
}

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

#开启驼峰规则
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 {@Autowiredprivate LocationsMapper locationsMapper;@Testpublic void testGetLocationsAll() {List<Locations> locationsAll = locationsMapper.getLocationsAll();for (Locations locations : locationsAll) {System.out.println(locations);}}@Testpublic void testAddLocations() {int rows = locationsMapper.addLocations();System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");}@Testpublic void testUpdateLocations() {int rows = locationsMapper.updateLocations();System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");}@Testpublic 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文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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文件所在路径,否则会找不到资源
mybatis:mapper-locations: classpath: mapper文件所在路径

①**application.yml**

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

6.6 测试查询

①**TestMyBatisXml**

java">/*** 用于测试基于MyBatis注解开发的入门案例*/
@SpringBootTest
public class TestMyBatisXml {@Autowiredprivate JobsMapper jobsMapper;@Testpublic 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**

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 {@Autowiredprivate JobsMapper jobsMapper;@Testpublic void testGetJobsAll() {List<Jobs> all = jobsMapper.getJobsAll();for (Jobs jobs : all) {System.out.println(jobs);}}@Testpublic void testInsert() {int rows = jobsMapper.insertJobs();System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");}@Testpublic void testUpdate() {int rows = jobsMapper.updateJobs();System.out.println(rows > 0 ? "修改成功!" : "修改失败!!");}@Testpublic void testDelete() {int rows = jobsMapper.deleteJobs();System.out.println(rows > 0 ? "删除成功!" : "删除失败!!");}
}

上一篇文章:SpringBoot整合JDBCTemplate(day34)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/142098654

下一篇文章: MyBatis的占位符(day36)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/142969916


http://www.ppmy.cn/news/1540169.html

相关文章

Android常用界面控件——ImageView

目录 1 ImageView 1.1在XML 中定义ImageView&#xff1a; 1.1.1 ImageView常用XML属性 1.1.2 ImageView ScaleType用法 1.2 在Java代码中控制ProgressBar&#xff1a; 1.3 区别总结 1.3.1 应用场景选择建议 1 ImageView ImageView&#xff0c;图像视图&#xff0c;直接…

人员跌倒检测系统的设计与实现(Yolov Python38 深度学习)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

.net core 3.0 与 6.0 有哪些不同

.NET Core 3.0 和 .NET 6.0&#xff08;注意&#xff0c;从 .NET 5.0 开始&#xff0c;微软将 .NET Core 和 .NET Framework 合并为一个统一的 .NET 平台&#xff09;之间有许多重要的区别。这些区别包括性能改进、新功能、API 的变化以及对不同平台的支持。下面是一些主要的区…

RA6M5——GPIO

文章目录 GPIO输入输出RASC图形化配置输出模式&#xff1a;输入模式&#xff1a;配置选项&#xff1a; 接口函数实例代码&#xff1a; GPIO输入输出 RASC图形化配置 输出模式&#xff1a; 输入模式&#xff1a; 配置选项&#xff1a; 配置项取值/描述Model “Input mode”&a…

被DNS污染劫持,怎么见招拆招?

在畅游互联网的海洋时&#xff0c;我们可能会遭遇DNS污染劫持这一 “暗礁”&#xff0c;它就像一个隐藏在暗处的 “海盗”&#xff0c;干扰着我们正常的网络航行。那么&#xff0c;当遇到DNS污染劫持时&#xff0c;我们该如何见招拆招呢&#xff1f; 首先&#xff0c;我们要明…

千兆超薄lan transformer H82412S应用主板英特尔光仟网卡

千兆超薄lan transformer H82412S应用主板英特尔光仟网卡&#xff1a;I992643OO38 网卡网络变压器应用广泛&#xff0c;但如何找到适合自己公司使用的产品&#xff0c;还真要对网络变压器有一定的了解才行&#xff0c;这节将和大家分享有关知识点&#xff0c;希望大家喜欢。一&…

高效地理位置数据处理:Redis Geospatial Indexes详解

在现代应用中&#xff0c;地理位置数据处理变得越来越重要。无论是共享单车、外卖配送还是社交应用&#xff0c;地理位置服务都扮演着关键角色。Redis提供了Geospatial Indexes数据结构&#xff0c;能够高效地存储和查询地理位置数据。本文将介绍Redis的Geospatial Indexes的基…

「C++」类和对象最终回

目录 前言 初始化列表&#xff1a; 使用及特点&#xff1a; 总结&#xff1a; 案例分析&#xff1a; 类型转换 单参数构造函数&#xff1a; 多参数构造函数&#xff1a; static成员 友元 内部类 匿名对象 特点 使用方法&#xff1a; 匿名对象使用实例补充&#…