当前位置:首页 » 《关于电脑》 » 正文

Java-09 深入浅出 MyBatis - 注解开发 注解映射 基本介绍 与 一对一模型

6 人参与  2024年12月03日 10:01  分类 : 《关于电脑》  评论

点击全文阅读


点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

MyBatis(正在更新)

常用注解

MyBatis 是一款优秀的持久层框架,它支持通过注解的方式进行开发,而无需使用传统的 XML 配置文件。这种方式更加简洁、直观,适合于简单的应用场景或轻量级开发项目。MyBatis 提供了一系列注解,用于代替 XML 配置文件中定义的 SQL 语句和映射规则。这些注解直接写在接口或方法上,使得开发更加面向对象,也减少了配置文件的维护成本。

Insert 新增Update 更新Delete 删除Select 查询Result 结果集封装Results 与 Result 一起使用,封装多个结果集One 实现一对一的结果封装Many 实现一对多的结果封装

Select

用途:用于执行查询操作。
位置:放在 Mapper 接口的方法上。
支持功能:可以直接写简单的查询语句,支持动态参数。

Insert

用途:用于执行插入操作。
位置:放在 Mapper 接口的方法上。
支持功能:支持插入单条记录或批量插入,支持自动生成主键。

Update

用途:用于执行更新操作。
位置:放在 Mapper 接口的方法上。
支持功能:支持根据条件更新记录。

Delete

用途:用于执行删除操作。
位置:放在 Mapper 接口的方法上。
支持功能:支持根据条件删除记录。

Results 和 Result

用途:用于结果集的手动映射,将查询的字段与对象属性一一对应。
位置:放在 Mapper 接口的方法上。
支持功能:用于字段名和对象属性名不一致的情况。

Param

用途:用于给 SQL 中的参数命名,绑定方法的参数到 SQL 语句中的占位符。
位置:放在 Mapper 方法的参数上。
支持功能:解决方法参数无法直接被引用或多参数的绑定问题。

Options

用途:用于设置方法的额外选项,比如主键生成、查询的缓存等。
位置:放在 @Insert、@Update 等注解上。

ResultMap

用途:引用 XML 或注解中定义的结果映射。
位置:放在 Mapper 接口的方法上。
支持功能:简化复杂的结果映射。

ConstructorArgs 和 Arg

用途:用于在构造函数映射场景中,将查询结果映射到构造函数参数。
位置:放在 Mapper 接口的方法上。

注解优点

简洁:直接在代码中定义 SQL,无需额外的 XML 文件。强类型支持:与 Java 代码紧密结合,便于重构和代码检查。便于维护:SQL 紧贴业务逻辑,便于定位问题。

注解缺点

不适合复杂 SQL:对于动态 SQL 和大段查询,注解方式不够灵活。代码冗长:复杂查询可能导致注解内容过多,影响可读性。SQL 可重用性差:注解中的 SQL 不能像 XML 一样被复用。

常见使用

简单 SQL 使用注解,复杂 SQL 使用 XML 配置文件。使用 @Param 命名参数,避免歧义。对大段复杂 SQL 优先采用 XML 的 和 标签,提高复用性。结合 SpringBoot 使用 @MapperScan 注解统一管理 Mapper。

注解映射

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用 Results 注解,Result 注解,One 注解,Many 注解结合起来完成复杂功能的开发。

在这里插入图片描述
在这里插入图片描述

一对一

查询模型

用户表和订单表的关系,一个用户有多个订单,一个订单只从属于一个用户,一对一查询的需求是,查询一个订单,与此同时查询出该订单所属的用户。

编写代码

OrderMapper

新增了一个方法 findAllWithAnnotation,通过注解的方式进行开发:

@Select("select * from wzk_orders")@Results({        @Result(id = true, property = "id", column = "id"),        @Result(property = "ordertime", column = "ordertime"),        @Result(property = "total", column = "total"),        @Result(                property = "user", column = "uid",                javaType = WzkUser.class,                one = @One(select = "icu.wzk.mapper.UserMapper.findByIdWithAnnotation")        ),})List<WzkOrder> findAllWithAnnotation();

截图如下所示:
在这里插入图片描述

UserMapper

在该类中再加入一个新的方法,也用注解的方式,因为 OrderMapper 中要用到:

@Select("select * from wzk_user where id = #{id}")WzkUser findByIdWithAnnotation(int id);

对应的截图如下所示:
在这里插入图片描述

调用代码

package icu.wzk;import icu.wzk.mapper.OrderMapper;import icu.wzk.mapper.UserMapper;import icu.wzk.model.WzkOrder;import icu.wzk.model.WzkUser;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;import java.util.List;public class WzkIcu11 {    public static void main(String[] args) throws IOException {        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()                .build(resourceAsStream);        SqlSession sqlSession = sqlSessionFactory.openSession();        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);        List<WzkOrder> dataList = orderMapper.findAllWithAnnotation();        dataList.forEach(System.out::println);        sqlSession.close();    }}

对应的代码截图如下所示:
在这里插入图片描述

测试结果

执行代码,对应的控制台输出结果如下所示:

WzkOrder(id=1, ordertime=Mon Nov 11 00:00:00 CST 2024, total=100.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null))WzkOrder(id=2, ordertime=Mon Nov 11 00:00:00 CST 2024, total=200.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null))WzkOrder(id=3, ordertime=Sun Nov 10 00:00:00 CST 2024, total=150.0, user=WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null))24/11/13 09:02:37 DEBUG jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@75329a49]

对应的截图如下所示:
在这里插入图片描述


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/195802.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1