Mybatis

本文介绍了Mybatis中的级联操作,包括一对一、一对多和多对多的级联映射,并讨论了其优缺点及使用建议。接着详细讲解了Mybatis的注解映射,包括基本注解如@Insert、@Delete、@Update和@Select,以及结果映射注解@Results,同时给出了不同参数传递方式的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多表联查

级联

级联(cascade),是指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率

一对一:一个对象对应唯一的对象

举例:中国公民和身份证

一对多:一个对象对应多个对象

举例:班级和学生

多对多:多个对象对应多个对象

举例:公司角色和公司员工

在这里插入图片描述

一对一级联:

步骤:

在这里插入图片描述

映射:首先在实体类中添加级联表的对象

在这里插入图片描述

一对多级联:

步骤:

在这里插入图片描述

映射:首先在实体类中添加级联表的对象list集合

在这里插入图片描述

级联的缺陷

性能缺陷:

​ 级联操作会降低性能,增加程序的执行时间;

复杂度缺陷:

​ 关联较多造成复杂度的 增加,不利于他人的理 解和维护

使用建议:

1、根据实际情况增加级联关系

2、多层关联式,建议超过三层关联时尽量少使用级联

3、非用不可的话,可以将多层关联分解成一对一 、 一对多

注解

映射器配置文件的缺陷:

1、繁琐:

​ 配置文件的书写本身繁琐,需要掌握的内容比较多

2、不直观:

​ 配置文件和接口直接只是名称相同,对应起来比较麻烦

映射器注解:
1、基本注解:

​ 实现简单的增删改查操作。

分类:
//增加操作	@Insert
	类似 < insert > 完成新增
//删除操作	@Delete
	类似 < delete > 完成删除
//修改操作	@Update
	类似 < update > 完成修改
//查询操作	@Select
	类似 < select > 完成查询
@Insert
语法:
@Insert (“ sql 语句”)
示例:
@Insert (“insert into news (title,author)values (#{ title } ,#{author}) ”)
public void addNews (News news);

说明:

新增时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。

【主键回填】:完成数据库自增主键的回填

语法:
@Options(useGeneratedKeys = true, keyProperty = "主键属性")
示例:
@Insert (“insert into news (title,author)values (#{ title } ,#{author}) ”)
@Options( useGeneratedKeys = true, keyProperty = "newsId" )
public void addNews (News news);

【主键自增】:完成自定义主键的自增

语法:
@SelectKey ( statement = "自增规则", keyProperty = "主键属性", resultType = 结果类型, before = true )
示例:
@SelectKey ( statement = "select max(newsid) + 1 as newsId from news", keyProperty = "newsId",resultType = int.class, before = true )
@Insert(...)
public void addNews (News news);
@Delete
语法:
@Delete (“ sql 语句”)
示例:
@Delete (“delete from news where newsid = #{ newsId } ”)
public void delNews (News news);

说明:

删除时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。

@Update
语法:
@Update (“ sql 语句”)
示例:
@Update (“update news set title =#{title},author = #{author})
public void updateNews (News news);

说明:

更新时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合

@Select
语法:
@Selete (“ sql 语句”)
示例:
@Selete (“select * from news where title = #{title}”)
public List<News> getNews (News news);

说明:

查询时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。

传递多个参数的方式:

方法1:Map

方法2:JavaBean

方法3:@Param

方法4:arg0,arg1(数字从0开始)

方法5:@param(从1开始)

在这里插入图片描述

2、结果映射注解:

​ 实现结果的映射关系,也可以完成级联映射。

@Results 结果映射
语法:
@Results({ @Result(id = 是否为主键, column = "字段", property = "属性" ) })
示例:
@Results({
@Result(id = false, column = "title", property = "title"),
@Result(id = false, column = "author", property = "author")})
public void getNews (News news);

说明:

每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。

@Results 复用 (跟 sqlmap 的 xml 配合使用)
语法:
<resultMap id=”结果名称”>...</resultMap>
@ResultMap (“结果名称”)
示例:
<resultMap id=”result1”>...</resultMap>
@ResultMap (“result1”)
public List<News> getNews (News news);

注意:跟当前接口中有定义使用id属性,每个sql语句前要么有一个@Results映射关系,要么要么@ResultMap,这两个不能同时给一个sql语句

语法:
以前定义过的的@Results(id=“xxx”value={...})
@ResultMap (“xxx”)

示例:

在这里插入图片描述

一对一映射:
语法:
@One( Select = 一对一查询方法, fetchType = FetchType.EAGER )
示例:
@Results({@Result(column="card_id",property="card", one = @One ( select="dao.CardMapper.getCardById",fetchType=FetchType.EAGER ) ) })
public void getNews (News news);

说明:

FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。

案例:

在这里插入图片描述

一对多映射:
语法:
@Many( Select = 一对多查询方法,fetchType = FetchType.EAGER )
示例:
@Results({@Result(column="type_id",property="news", many = @Many ( select="dao.NewsMapper.getNewsByType",fetchType=FetchType.EAGER ) ) })
public void getNews (News news);

说明:

FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。

案例:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值