【MyBatis】Java 数据持久层框架:认识 MyBatis

ops/2024/11/14 12:46:26/

Java 数据持久层框架:认识 MyBatis

  • 1.CRUD 注解
  • 2.映射注解
  • 3.高级注解
    • 3.1 高级注解
    • 3.2 MyBatis 3 注解的用法举例

MyBatis 和 JPA 一样,也是一款优秀的 持久层框架,它支持定制化 SQL、存储过程,以及高级映射。它可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通 Java 对象)映射成数据库中的记录。

MyBatis 3 提供的注解可以取代 XML。例如,使用注解 @Select 直接编写 SQL 完成数据查询;使用高级注解 @SelectProvider 还可以编写动态 SQL,以应对复杂的业务需求。

1.CRUD 注解

增加删除修改查询 是主要的业务操作,必须掌握这些基础注解的使用方法。MyBatis 提供的操作数据的基础注解有以下 4 个。

  • @Select:用于构建查询语句。
  • @lnsert:用于构建添加语句。
  • @Update:用于构建修改语句。
  • @Delete:用于构建删除语句。

下面来看看它们具体如何使用,见以下代码:

@Mapper
public interface UserMapper{@Select("SELECT * FROM user WHERE id = #{id}")User queryById(@Param("id") int id);@Select("SELECT * FROM user")List<User> queryAll();@Insert(("INSERT INTO user(name,age) VALUES(#{name},#{age})"))int add(User user);@Delete("DELETE FROM user WHERE id = #{id}")int delById(int id);@Update("UPDATE user SET name=#{name},age=#{age} WHERE id = #{id}")int updateById(User user);@Select("SELECT * FROM user")Page<User> getUserList();
}

从上述代码可以看出:首先要用 @Mapper 注解来标注类,把 UserMapper 这个 DAO 交给 Spring 管理。这样 Spring 会自动生成一个实现类,不用再写 UserMapper 的映射文件了。最后使用基础的 CRUD 注解来添加要实现的功能。

2.映射注解

MyBatis 的映射注解用于建立实体和关系的映射。它有以下 3 个注解。

  • @Results:用于填写结果集的多个字段的映射关系。
  • @Result:用于填写结果集的单个字段的映射关系。
  • @ResultMap: 根据 ID 关联 XML 里面的 <resultMap>

可以在查询 SQL 的基础上,指定返回的结果集的映射关系。其中,property 表示实体对象的属性名,column 表示对应的数据库字段名。使用方法见以下代码:

@Results({@Result(property = "username", column = "USERNAME"),@Result(property = "password", column = "PASSWORD")
})
@Select("select * from user")
List<User> list();

3.高级注解

3.1 高级注解

MyBatis 3.x 版本主要提供了以下 4 个 CRUD 的高级注解。

  • @SelectProvider:用于构建动态查询 SQL。
  • @InsertProvider:用于构建动态添加 SQL。
  • @UpdateProvider:用于构建动态更新 SQL。
  • @DeleteProvider:用于构建动态删除 SQL。

高级注解主要用于编写动态 SQL。这里以 @SelectProvider 为例,它主要包含两个注解属性, 其中,type 表示工具类,method 表示工具类的某个方法(用于返回具体的 SQL)。

以下代码可以构建动态 SQL,实现查询功能:

@Mapper
public interface UserMapper {@SelectProvider(type = UserSql.class, method = "listAll")List<User> listAllUser();
}

UserSql 工具类的代码如下:

public class UserSql {public String listAll() {return "select * from user";}
}

3.2 MyBatis 3 注解的用法举例

如果要查询所有的值,则基础 CRUD 的代码是:

@Select("SELECT * FROM user3")
List<User> queryAll();

也可以用映射注解来一一映射,见以下代码:

// 使用注解编写 SQL, 完成映射 @Select("select * from user3")
@Results({  @Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "age", column = "age")
})
List<User> listAll;

如果要用多个参数进行查询,则必须加上注解 @Param,否则无法使用 EL 表达式获取参数。

UserMapper 接口的写法如下:

@Select("select * from user where name like #{name} and age like #{age}")
User getByNameAndAge(@Param("name") String name, @Param("age") int age);

对应的控制器代码如下:

@RequestMapping("/querybynameandage")
User querybynameandage(String name, int age) {return userMapper.getByNameAndAge(name,age);
}

还可以根据官方提供的 API 来编写动态 SQL:

public String getUser(@Param("name") String name, @Param("age") int age) { return new SQL() {{SELECT("*");FROM("user3");if (name != null && age != 0) {WHERE("name like #{name} and age like #{age}")} else {WHERE("1=2");}}}.toString();
}

http://www.ppmy.cn/ops/111713.html

相关文章

vue组件注册

项目目前的组件注册机制是按需注册&#xff0c;是在需要用到的页面才引入。 <template><Menu><SubMenu></SubMenu><Menu><menu><sub-menu></sub-menu><menu> </template> <script> import { Menu } from a…

20道经典自动化测试面试题【建议收藏】

概述 觉得自动化测试很难&#xff1f; 是的&#xff0c;它确实不简单。但是学会它&#xff0c;工资高啊&#xff01; 担心面试的时候被问到自动化测试&#xff1f; 嗯&#xff0c;你担心的没错&#xff01;确实会被经常问到&#xff01; 现在应聘软件测试工程师的岗位&…

代码随想录算法训练营第48天 | LeetCode739.每日温度、 LeetCode496.下一个更大元素I、 LeetCode503.下一个更大元素II

目录 LeetCode739.每日温度 LeetCode496.下一个更大元素I 1. 暴力解法 2. 单调栈法 LeetCode503.下一个更大元素II LeetCode739.每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于…

中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速

鸿蒙生态大势所趋&#xff0c;各种应用适配加速 近日&#xff0c;华为纯血鸿蒙系统&#xff08;HarmonyOS NEXT&#xff09;再度引发市场高度关注。据媒体消息&#xff0c;鸿蒙NEXT Beta版将在9月24日对Mate 60系列、X5系列、Pura70系列等16款旗舰机型进行推送&#xff0c;这已…

神经网络通俗理解学习笔记(4) 深度生成模型VAE、GAN

深度生成模型 什么是生成式模型蒙特卡洛方法变分推断Variational Inference变分自编码器VAE生成对抗网络Generative Adversarial NetworkDiffusion 扩散模型 什么是生成式模型 判别式和生成式模型 判别式:CNN/RNN/transformer;生成式:AE/VAE/GAN 判别式模型学习类别边界&#…

linux-系统备份与恢复-系统恢复

Linux 系统备份与恢复&#xff1a;系统恢复 1. 概述 Linux 系统的恢复是系统管理的重要组成部分&#xff0c;它指的是在系统崩溃、硬件故障、误操作或安全问题后&#xff0c;恢复系统到可用状态的过程。良好的系统恢复计划可以有效避免数据丢失和业务中断&#xff0c;并确保系…

HarmonyOS开发5.0【骨架屏】 app界面制作

实现原理 1.定义组件和状态变量&#xff1a; 使用 Entry 和 Component 装饰器定义了一个名为 IvSkeleton 的组件。 定义了一个状态变量 translageX&#xff0c;初始值为 -100%&#xff0c;用于控制闪电效果的位置。 定义了两个数值变量 widthValue 和 heightValue&#xff0c;…

C# Redis 框架开发技术详解

引言 Redis 是一个高性能的键值存储系统&#xff0c;广泛用于缓存、消息队列和实时分析等场景。在 C# 中&#xff0c;有几个著名的库和框架可以方便地与 Redis 进行交互。以下是几个常用的 C# Redis 库&#xff1a; StackExchange.Redis: 这是目前最流行、最推荐的 C# Redis 客…