Mybatis 到 MyBatisPlus

news2024/11/18 15:38:42

Mybatis 到 MyBatisPlus

Mybatis

MyBatis(官网:https://mybatis.org/mybatis-3/zh/index.html )是一款优秀的 持久层 (ORM)框架,用于简化JDBC的开发。是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    持久层:指的是就是数据访问层(dao),是用来操作数据库的。

1. 依赖和配置

引入 mybatis 依赖和数据库连接依赖
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
 
<dependency>
     <groupId>com.mysql</groupId>
     <artifactId>mysql-connector-j</artifactId>
     <scope>runtime</scope>
 </dependency>

数据源信息和mapper映射扫描配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    mapper-locations: classpath:mapper/*.xml

Spring MapperScan自动扫描配置
一般在启动类上新增 MapperScan 注解即可

@MapperScan("com.pjh.apigf.mapper")

本案例使用 mybatis-spring-boot-starter 自动装配依赖,因此 mybatis 会自动读取spring.datasource 下面的数据源配置信息;并会自动扫描 @mapper 注解的类加入Ioc容器中进行管理。

注意:如果使用 spring + mybatis 依赖,则需要在 mybatis-config.xml 中指定 数据源信息,mapperScan 目录等,否则会报错。

2. 基本使用

使用时需要创建对应的实体类,对应的 mapper.java 持久层;

2.1 Mapper映射实现

要求 Mapper.xml 与Mapper.java 在相同目录结构下:
在这里插入图片描述
在 Mapper.java 中创建需要的数据操作方法

User getUserById(@Param("userId") String userId) ;

相同的 Mapper.xml 中需要有对应的方法
在这里插入图片描述
常用的标签:

select: 用于查询操作,从数据库中检索数据。
id: 唯一标识符,用于匹配接口方法。
resultType: 查询结果的Java类型,可以是具体类名或别名。
resultMap: 当查询结果需要复杂的映射关系时使用,引用之前定义的<resultMap>。
parameterType: 传入参数的类型,通常是Java Bean类型或基本类型。

insert: 用于插入操作,向数据库插入数据。
id, parameterType, useGeneratedKeys, keyProperty: 类似于<select>,其中useGeneratedKeys和keyProperty用于处理自动生成的主键。

update: 用于更新操作,更新数据库中的数据。
id, parameterType: 同上。

delete: 用于删除操作,从数据库中删除数据。
id, parameterType: 同上。

动态SQL标签:
<if>: 根据条件判断是否包含某段SQL<choose>, <when>, <otherwise>: 类似于Javaswitch-case语句。
<where>: 动态生成WHERE子句,自动处理第一个条件前的ANDOR<set>: 用于动态生成UPDATE语句的SET子句。
<foreach>: 遍历集合,常用于IN语句中。

sql: 定义可重用的SQL片段,提高代码复用性。
id: 片段的唯一标识。

resultMap: 复杂结果集的映射,定义列名到JavaBean属性的映射关系。
id: resultMap的唯一标识。
type: 映射的目标Java类型。
<id><result>: 分别定义主键映射和普通属性映射
2.2 注解方式实现
  • @Select用于标记查询语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Select注解时,需要在注解中指定SQL语句
  • @Insert用于标记插入语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Insert注解时,需要在注解中指定SQL语句。
  • @Update用于标记更新语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Update注解时,需要在注解中指定SQL语句。
  • @Delete用于标记删除语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Delete注解时,需要在注解中指定SQL语句。
  • @Results用于标记结果集映射,该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@Results注解时,需要指定Result映射规则。
@Select("SELECT * FROM users WHERE id = #{id}")
@Results(id = "userResultMap", value = {
	@Result(property = "id", column = "id"),
	@Result(property = "name", column = "name"),
	@Result(property = "age", column = "age")
})
User getUserById(@Param("id") Long id);
  • @Result用于标记单个属性与结果集中的列之间的映射关系。该注解可以用于接口方法或XML文件中,通常与@Results注解一起使用。使用@Result注解时,需要指定映射规则。
  • @ResultMap用于标记结果集映射规则。该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@ResultMap注解时,需要指定映射规则。
@Select("SELECT * FROM users WHERE id = #{id}")
@ResultMap("userResultMap")
User getUserById(@Param("id") Long id);
  • @Options用于指定一些可选的配置项。该注解可以用于接口方法或XML文件中,通常与@Insert、@Update、@Delete等注解一起使用。使用@Options注解时,可以指定一些可选的配置项。
    useGeneratedKeys :自增主键并返回,keyProperty 实体对应的元素
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
  • @SelectKey用于在执行INSERT语句后获取自动生成的主键值。该注解可以用于接口方法或XML文件中,通常与@Insert注解一起使用。使用@SelectKey注解时,需要指定生成主键的SQL语句和将主键值赋给Java对象的哪个属性。
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Long.class)
int insertUser(User user);
  • @Param用于为SQL语句中的参数指定参数名称。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@Param注解时,需要指定参数名称。
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") Integer age);
  • @One用于在一对一关联查询中指定查询结果的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@One注解时,需要指定查询结果映射的Java对象类型和查询结果映射的属性。
<resultMap id="userResultMap" type="User">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="age" property="age"/>
	<association property="department" resultMap="departmentResultMap"/>
</resultMap>

<resultMap id="departmentResultMap" type="Department">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="description" property="description"/>
	<one property="manager" resultMap="userResultMap"/>
</resultMap>

上述代码中,@One注解用于指定查询结果的映射方式,这里使用了嵌套的标签实现了一对一关联查询。在departmentResultMap中,使用@One注解指定了查询结果映射的Java对象类型为User,查询结果映射的属性为manager,resultMap参数指定了查询结果映射的结果集映射规则为userResultMap。

  • @Many用于在一对多关联查询中指定查询结果的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@Many注解时,需要指定查询结果映射的Java对象类型和查询结果映射的属性。
<resultMap id="departmentResultMap" type="Department">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="description" property="description"/>
<collection property="members" ofType="User" resultMap="userResultMap"/>
</resultMap>

<resultMap id="userResultMap" type="User">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="age" property="age"/>
</resultMap>
  • @ResultType用于指定查询结果的类型。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@ResultType注解时,需要指定查询结果的类型。
@Select("SELECT name, age FROM users WHERE id = #{id}")
@ResultType(User.class)
User getUserById(Long id);
  • @TypeDiscriminator用于在自动映射时指定不同子类型的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@TypeDiscriminator注解时,需要指定类型列的名称和不同子类型的映射方式。
<resultMap id="vehicleResultMap" type="Vehicle">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="type" property="type"/>
	<discriminator javaType="String" column="type">
		<case value="car" resultMap="carResultMap"/>
		<case value="truck" resultMap="truckResultMap"/>
		<case value="bus" resultMap="busResultMap"/>
	</discriminator>
</resultMap>
<resultMap id="carResultMap" type="Car">
	<result column="engine" property="engine"/>
	<result column="seats" property="seats"/>
</resultMap>
<resultMap id="truckResultMap" type="Truck">
	<result column="load" property="load"/>
</resultMap>
<resultMap id="busResultMap" type="Bus">
	<result column="capacity" property="capacity"/>
</resultMap>

上述代码中,@TypeDiscriminator注解用于指定不同子类型的映射方式。在vehicleResultMap中,使用@TypeDiscriminator注解指定了类型列的名称为type,javaType参数指定了类型列的Java类型为String,标签中的value属性分别对应不同的子类型(car、truck、bus),resultMap属性用于指定不同子类型的结果集映射规则。

MyBatisPlus

CRUD 操作:MyBatisPlus 提供了丰富的 CRUD 方法(如 insert, update, delete, select),开发者无需编写 SQL 语句,仅通过方法名即可实现基本的数据库操作。而在 MyBatis 中,你需要为每一个 CRUD 操作编写 SQL 语句。
条件构造器:MBP 提供了强大的条件构造器,可以灵活构建复杂的 WHERE 条件,这相比 MyBatis 手动拼接 SQL 更加方便且安全。
分页支持:MBP 内置了分页插件,只需简单配置即可实现物理分页,而 MyBatis 需要手动编写分页逻辑或者集成第三方分页插件。
性能优化:比如自动填充(如创建时间、更新时间)、乐观锁等功能,MBP 提供了开箱即用的解决方案,减少了开发者在这些常规需求上的重复工作。
注解驱动:MBP 强化了注解的使用,很多功能可以通过简单的注解配置实现,降低了 XML 配置文件的依赖,使得项目结构更加清晰。

踩坑

分清 spring 依赖,和 boot 自动装配依赖。使用原生的 mybatis 依赖需要配置mybatis-config.xml 配置文件,大致如下,关键内容为 dataSource、SqlSessionFactoryBean、MapperScannerConfigurer;而使用 boot 自动装配依赖时会将以上配置和bean进行自动装配。

<?xml version="1.0" encoding="UTF-8" ?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
>

    <context:component-scan base-package="com.pjh.apigf.mapper"></context:component-scan>

    <!-- 加载jdbc.properties配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 配置 MyBatis 数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
    </bean>

    <!-- 配置 mybatis Session -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--<property name="configLocation" value="classpath:mybatis-config.xml"></property>-->
        <property name="mapperLocations" value="classpath:com/pjh/apigf/mapper/*.xml" />
    </bean>

    <!-- 扫描Mapper接口(Spring会使用AOP为其实现具体方法) -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="top.yiqifu.study.p061_mybatis" />
    </bean>


</beans>

mybatis-spring-boot-starter 和普通的 mybatis 依赖有以下几个主要区别:

集成便利性:
mybatis-spring-boot-starter 是专为 Spring Boot 应用设计的 Starter,它提供了自动配置的功能,使得在 Spring Boot 应用中集成 MyBatis 变得更加简便。你只需要在 pom.xml 中添加这个 Starter 依赖,无需手动编写大量的配置代码,Spring Boot 会自动配置好 MyBatis 的关键组件,比如 SqlSessionFactory 和 SqlSessionTemplate。
普通的 mybatis 依赖则是 MyBatis 的核心库,不包含任何 Spring 特定的集成代码。在非 Spring Boot 项目或者传统的 Spring 项目中使用时,你需要手动配置数据源、SqlSessionFactory、事务管理器等组件,并且可能需要额外的 mybatis-spring 依赖来桥接 MyBatis 和 Spring。

自动配置:
mybatis-spring-boot-starter 内部集成了自动配置逻辑,可以根据应用的环境和配置文件(如 application.properties 或 application.yml)自动设置 MyBatis 的配置项,比如映射文件的位置、类型别名、数据源等。
使用普通的 mybatis 依赖时,这些配置都需要手动在 Spring 配置类中完成。

依赖管理:
mybatis-spring-boot-starter 作为 Spring Boot 的 Starter,它内部已经管理了必要的依赖关系,例如它会自动引入 mybatis, mybatis-spring 以及可能的其他相关依赖,确保版本兼容性。这减少了 Maven 或 Gradle 依赖冲突的可能性。
使用普通 mybatis 依赖时,你需要自己管理所有相关依赖及其版本兼容性。

约定优于配置:
Spring Boot 的理念是“约定优于配置”,mybatis-spring-boot-starter 遵循这一原则,很多配置都有默认值,开发者只需关注需要改变的部分。而传统方式使用 MyBatis 则需要显式地配置每一部分。

综上所述,mybatis-spring-boot-starter 提供了一种快速、简化的方式来在 Spring Boot 应用中集成 MyBatis,减少了手动配置的工作量,并且通过自动配置和依赖管理提高了开发效率。而普通的 MyBatis 依赖则提供了更多的灵活性,但需要开发者自行处理更多的配置细节。

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

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

相关文章

vscode关于java扩展

包含IDEA同款代码提示&#xff0c;vscode的debug&#xff0c;除了创建类要手动新建java文件以外&#xff0c;其他都还行&#xff0c;满足初学者要求。

免费插件集-illustrator插件-Ai插件-测量路径周长

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行测量路径周长处理。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&…

【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解

最终效果 文章目录 最终效果前言存储位置信息存储更多数据存储场景信息持久化存储数据 前言 前面写过小型游戏存储功能&#xff1a; 【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解&#xff08;包含数据安全处理方案的加密解密&#xff09; 这次做一个针…

HarmonyOS应用开发学习经验

一、HarmonyOS学习官网 开发者能力认证 HarmonyOS应用开发者基础认证6月之前的学习资源官网已经关闭过期&#xff0c;大家不要慌&#xff0c;官方更新了最新资源&#xff0c;但是&#xff0c;对于之前没有学习完的学员不友好&#xff0c;存在知识断片的现象&#xff0c;建议官…

小程序中this(1)

}, onLoad: function() {}, }) 此时经过编译后模拟器的显示&#xff1a; 这里都容易理解&#xff0c;当点击了button按钮后&#xff0c;触发点击事件执行testfun函数&#xff0c;将test02设置为8&#xff0c;如图&#xff1a; 通过this.data.test028这种方式直接赋值可以吗&…

音乐创作与制作软件:Studio One 6.6.1中文版安装激活使用指南

音乐创作与制作软件&#xff1a;Studio One 6.6.1 简介 StudioOne 的设计核心是易于使用。十年来&#xff0c;它已将久经考验的录音棚模型与当今以节拍和循环为导向的制作过程无缝地结合在一起&#xff0c;因此您可以比以往更快地将音乐创意带入声音现实。高效的单屏幕界面可…

酷开系统丨酷开科技AI赋能数字大屏,开启智能家居新纪元

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的崛起无疑为科技领域带来了革命性的变化。酷开科技&#xff0c;正以其独特的"AI数字大屏"战略&#xff0c;将创新理念转化为现实&#xff0c;引领行业发展新潮流。 酷开科技的智能电视操作系统…

芯片设计公司供应链软件管理包括哪些内容

芯片设计公司的供应链软件管理是一个复杂而精细的过程&#xff0c;它涵盖了从原材料采购到最终产品交付的各个环节。以下是关于芯片设计公司供应链软件管理内容的科普介绍。 首先&#xff0c;供应链软件管理的起点是原材料采购。这部分内容主要关注确保供应商提供高质量、符合设…

【C++】相机标定源码笔记-相机内参标定类

相机内参标定类 该代码是一个关于摄像头内参处理类的实现。它主要做了以下几件事情&#xff1a; 1. 提供读取和保存相机内参的功能。 2. 允许用户设置一系列参数&#xff08;如图像尺寸、棋盘格尺寸等&#xff09;。 3. 支持从图像中检测棋盘格角点&#xff0c;并根据检测到的角…

每台电脑的ip地址是随机改动的吗

在数字化快速发展的今天&#xff0c;互联网已成为我们生活和工作的重要组成部分。当我们使用电脑上网时&#xff0c;IP地址作为电脑在网络中的唯一标识&#xff0c;起到了至关重要的作用。然而&#xff0c;很多人对于IP地址的分配和变化存在疑问&#xff0c;尤其是关于每台电脑…

上涨至13.6分!当之无愧的顶级期刊,影响因子“狂飙”,门槛较低,2个月可录!

本期解析 1、2024年6月20日&#xff0c;科睿唯安正式公布2024年度《期刊引证报告》。 2、本次主要解析Elsevier旗下一本TOP顶刊&#xff0c;期刊表现优秀&#xff0c;在最新的影响因子更新中由12.8上涨至13.6&#xff0c;是一本妥妥评职高分宝刊&#xff01;接下来看看它是否…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中&#xff0c;我们通过系统思考仿真演练深入探索决策背后的动因。例如&#xff0c;我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”&#xff0c;这些都是麻省理工MBA学生的必修课。此外&#xff0c;还有更简洁的“红黑游戏”“收获季节”等模拟…

04 Shell编程之正则表达式与文本处理器

1、正则表达式 1.1 正则表达式的定义 正则表达式又称为正规表达式、常规表达式。 正则表达式是使用单个字符来描述、匹配一系列符合某个句法规则的字符串&#xff0c; 简单来说&#xff0c;正则表达式就是一种匹配字符串的方法&#xff08;通过一些特殊符号&#xff0c;实现…

vant4好玩的新组件

1.Barrage 弹幕 模拟视频弹幕 设置 auto-play 为 false 属性后&#xff0c;需要使用 play() 进行弹幕播放&#xff0c;暂停可以使用 pause() 实现。<van-barrage v-model"list" ref"barrage" :auto-play"false"><div class"video&…

PostgreSQL使用教程

安装 PostgreSQL 您可以从 PostgreSQL 官方网站下载适合您操作系统的安装程序&#xff0c;并按照安装向导进行安装。 启动数据库服务器 安装完成后&#xff0c;根据您的操作系统&#xff0c;通过相应的方式启动数据库服务器。 连接到数据库 可以使用命令行工具&#xff08;如 p…

Spring Cloud Netflix:构建强大微服务生态系统的利器

Spring Cloud Netflix是一组集成框架&#xff0c;它将Netflix的多个开源组件整合到Spring Boot应用程序中&#xff0c;使得构建云原生应用程序变得更加简单。这些组件包括用于服务发现和注册的Eureka&#xff0c;断路器模式的实现Hystrix&#xff0c;用于API网关的Zuul&#xf…

项目管理:如何解决项目延期的那些问题?

在项目管理中&#xff0c;项目延期是一种普遍现象&#xff0c;也管理者最为头疼的一个问题。为了有效地解决项目延期问题&#xff0c;我们需要从多个方面入手&#xff1a; 1、快速识别原因&#xff1a;当项目出现延期迹象时&#xff0c;首要任务是迅速识别并定位导致延期的根…

kettle创建资源库无法登录问题

问题&#xff1a;You dont seem to be getting a connection to the server. Please check the path youre using and make sure the server is up and running. 1. 删除资源库 2.删除数据库中R_开头的表 3.重新创建资源库连接&#xff0c;查看是否成功产生表 4.创建成功&…

[windows] 无拓展名文件设置默认打开方式为记事本

前言 本文是对[windows] 无拓展名文件设置默认打开方式_给无后缀文件添加打开方式选项-CSDN博客 的细节上的补充&#xff0c;对小白更友好。建议对照引用的博客观看。 管理员状态运行cmd 右键左下角开始位置&#xff0c;出现 左键点击打开终端管理员。 进去后直接输入cmd即…

考研选学硕还是专硕?综合考虑哪个更难?

看录取分数&#xff0c;哪个相对容易一些考哪一个。如果未来对读博有想法的话&#xff0c;学硕可能更适合一些。大部分学校的学硕分数还是要高一些的&#xff0c;对于想要上岸一定要抓住数学和专业课。 24数学总体要比23年难不少&#xff0c;主要难在计算量大&#xff0c;尤其…