当前位置: 首页 > news >正文

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

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();
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • js进阶——作用域闭包
  • 【JS代码规范】如何优化if-else代码规范
  • 【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
  • 【C++篇】引领C++模板初体验:泛型编程的力量与妙用
  • ElasticSearch学习笔记
  • FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
  • 「C++系列」动态内存
  • 超越sora,最新文生视频CogVideoX-5b模型分享
  • ChatGPT 在国内使用的方法
  • aws 容器镜像仓库操作
  • 数据结构——二叉搜索树
  • Java调用数据库 笔记05(查询篇)
  • 植物大战僵尸【源代码分享+核心思路讲解】
  • 【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法
  • openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群
  • (三)从jvm层面了解线程的启动和停止
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • codis proxy处理流程
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • gitlab-ci配置详解(一)
  • orm2 中文文档 3.1 模型属性
  • TypeScript迭代器
  • VUE es6技巧写法(持续更新中~~~)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 小程序button引导用户授权
  • 优化 Vue 项目编译文件大小
  • 1.Ext JS 建立web开发工程
  • k8s使用glusterfs实现动态持久化存储
  • PostgreSQL之连接数修改
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $.ajax()
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (175)FPGA门控时钟技术
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (离散数学)逻辑连接词
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)Java算法:二分查找
  • (一)SpringBoot3---尚硅谷总结
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET CORE Aws S3 使用
  • .NET 快速重构概要1
  • .NET单元测试
  • .net经典笔试题
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET业务框架的构建
  • ??myeclipse+tomcat
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @EventListener注解使用说明
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [AIGC] MySQL存储引擎详解