MyBatis详解(5)-- MyBatis注解

MyBatis详解(5)

    • 注解
        • 映射器xml配置文件的缺陷:
        • 常用注解
        • 1.基本注解:实现简单的增删改查操作。
          • @Insert 新增
          • @Options(useGeneratedKeys = true, keyProperty = "主键属性") 主键回填
          • @SelectKey ( statement = "自增规则", keyProperty = "主键属性", resultType = 结果类型, before = true ) 主键自增
          • @Delete 删除
          • @Update 更新
          • @Selete 查询
        • 传递多参
        • 2.**结果映射注解**:实现结果的映射关系,也可以完成级联映射。
          • @Results 结果映射
          • 单表
          • 多表(相当于两个单表查询,之后再拼接)
        • 3.动态SQL注解:实现动态 SQL 的内容 (3种方式)

注解

映射器xml配置文件的缺陷:

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

2.不直观:配置文件和接口直接只是名称相同,对应起来比较麻烦.

常用注解
1.基本注解:实现简单的增删改查操作。
@Insert 新增
@Options(useGeneratedKeys = true, keyProperty = “主键属性”) 主键回填
@Insert("insert into student(sname,birthday,ssex,classid) "
		+ "values(#{sname},#{birthday},#{ssex},#{classid})")
@Options(keyProperty = "sid",useGeneratedKeys = true)
public int addStu(Student s);
@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(“delete from student where sid= #{sId} ”)
    public int delStudent(int sid);
@Update 更新
    @Update(“update student set ssex =#{ssex},classid = #{classid}public int updateStudent(Student s);
@Selete 查询
	@Select("select * from student")
	public List<Student> findStudents();
传递多参

方法5:@Param 方式

	@Select("select * from student where ssex=#{xingbie} limit #{weizhi},#{sizepage}")
	public List<Student> findStudentsBysexpage(
			@Param("xingbie") String sex,
			@Param("weizhi") int curpage,
			@Param("sizepage") int sizepage
			);
2.结果映射注解:实现结果的映射关系,也可以完成级联映射。
@Results 结果映射
单表
	@Results(id = "stuMap" , value= {
			@Result(column = "sid", property = "sid"),
			@Result(column = "sname", property = "sname"),
			@Result(column = "birthday", property = "birthday"),
			@Result(column = "ssex", property = "ssex"),
			@Result(column = "classid", property = "classid")		
	})	
	@Select("select * from student")
	public List<Student> findStudent();
多表(相当于两个单表查询,之后再拼接)

一对一:@one

	@Results(id = "stuMap" , value= {
		@Result(column = "sid", property = "sid"),
		@Result(column = "sname", property = "sname"),
		@Result(column = "birthday", property = "birthday"),
		@Result(column = "ssex", property = "ssex"),
		@Result(column = "classid", property = "classid"),
			
		//一对一
		@Result(property = "bj",column = "classid" , 
		one = @One(select = "com.ape.mapper.ClassMapper.findBanjiList")
		)		
	})	
	@Select("select * from student")
	public List<Student> findStudentAndClass();

一对多:@many

	@Results(id= "class_map" , value = {
			@Result(column="classid",property="classid"),
			//一对多
			@Result(column = "classid",property = "slist",
					many = @Many(select = "com.ape.mapper.StudentMapper.findStudentByclassid")
			)
	})
	@Select("select * from class")
	public List<Banji> findBanjiAndStu();
3.动态SQL注解:实现动态 SQL 的内容 (3种方式)

1)脚本sql:XML配置方式的动态SQL,是用< script >的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置

//脚本SQL
@Select("<script>"
		+ "select * from student"
		+ "<where>"
		+ "<if test = \"ssex !=null\"> and ssex = #{ssex}</if>"
		+ "<if test = \"classid !=0\"> and classid = #{classid}</if>"
		+ "</where>"			
		+ "</script>")
public List<Student> findStudents(Student s);

2)方法中构建sql

	//在方法中构建动态SQL
	@UpdateProvider(type = StudentSql.class, method = "xiugaiStuSql")
	public int updateStudentFun(Student s);
	//内部类
		 class StudentSql{
		public String xiugaiStuSql(Student s) {
				String sql = "update student set ";
				
				if (s.getSsex() !=null) {
					sql += ",ssex =#{ssex}";
				}			
				if (s.getClassid() != 0) {				
					sql += ",classid =#{classid}";
				}
				sql += " where sid= #{sid}";
				sql = sql.replaceFirst(",", " ");
				
				return sql;
			}
		}

3)SQL 语句构造器:实现动态 SQL 的内容(推荐)

在这里插入图片描述

//SQL构造器
	@SelectProvider(type = StudentSql.class , method = "findGZQ")
	public List<Student> findStudentsGZQ(Student s);
	
	@InsertProvider(type = StudentSql.class , method = "gzqADD")
	public int addStudent(Student s);
	
	@UpdateProvider(type = StudentSql.class , method = "gzqUpdate")
	public int updateStudent(Student s);
	
	@DeleteProvider(type = StudentSql.class , method = "gzqDel")
	public int delStudent(int sid);
	
	public String findGZQ(Student s) {
				return new SQL() {
					{
						SELECT("*");
						FROM("student");
						if (s.getSsex() != null) {
							WHERE("ssex = #{ssex}");
						}
						if (s.getClassid() != 0) {
							OR();
							WHERE("classid = #{classid}");
						}
					}
				}.toString();
			} 
			 
			 public String gzqADD(Student s) {
				
				 return new SQL() {
					 
					 {
						INSERT_INTO("student"); 
						if (s.getSname() !=null) {
							VALUES("sname","#{sname}");
						}
						if (s.getBirthday() !=null) {
							VALUES("birthday","#{birthday}");
						}
		
						if (s.getSsex() !=null) {
							VALUES("ssex","#{ssex}");
						}
						if (s.getClassid() !=0) {
							VALUES("classid","#{classid}");
						}
						
					 }
				 }.toString();
			}
			 
			 public String gzqUpdate(Student s) {
				
				 return new SQL() {
					 {
						 UPDATE("student"); 
							if (s.getSname() !=null) {
								SET("sname = #{sname}");
							}
							if (s.getBirthday() !=null) {
								SET("birthday=#{birthday}");
							}
			
							if (s.getSsex() !=null) {
								SET("ssex=#{ssex}");
							}
							if (s.getClassid() !=0) {
								SET("classid= #{classid}");
							}
							
							WHERE("sid = #{sid}");
					 }
				 }.toString();
			}
			 
			 public String gzqDel(int sid) {
					
				 return new SQL() {
					 {
						 DELETE_FROM("student");
						 WHERE("sid = #{sid}");
					 }
				 }.toString();
			}
		}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql大数据量分页优化

前言 之前有看过到mysql大数据量分页情况下性能会很差&#xff0c;但是没有探究过它的原因&#xff0c;今天讲一讲mysql大数据量下偏移量很大&#xff0c;性能很差的问题&#xff0c;并附上解决方式。 原因 将原因前我们先做一个试验&#xff0c;我做试验使用的是mysql5.7.2…

Matlab|【完全复现】基于价值认同的需求侧电能共享分布式交易策略

目录 1 主要内容 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序完全复现《基于价值认同的需求侧电能共享分布式交易策略》&#xff0c;针对电能共享市场的交易机制进行研究&#xff0c;提出了基于价值认同的需求侧电能共享分布式交易策略&#xff0c;旨在降低电力市…

北京摇号政策梳理汇总

文章目录 政策梳理 家庭申请资格 家庭积分规则 参考资料 目前&#xff0c;北京车牌摇号实施的政策&#xff0c;主要是2021年1月1日的《<北京市小客车数量调控暂行规定>实施细则》。本文梳理了与博主本人直接相关的一些内容&#xff0c;可能对大部分网友也有帮助。 政…

基于springboot宠物领养系统

摘要 随着社会的不断发展和人们生活水平的提高&#xff0c;宠物在家庭中的地位逐渐上升&#xff0c;宠物领养成为一种流行的社会现象。为了更好地管理和促进宠物领养的过程&#xff0c;本文基于Spring Boot框架设计和实现了一套宠物领养系统。该系统以用户友好的界面为特点&…

有趣的移位操作符和位操作符(由浅入深轻松搞定!)

目录 1. 原码&#xff0c;反码&#xff0c;补码 2.移位操作符 2.1 左移操作符 2.2 右移操作符 3.位操作符 (&、|、^、~) 4.使用移位操作符和位操作符写一些有趣的代码~ 1.不能创建临时变量&#xff08;第三个变量&#xff09;&#xff0c;实现两个数的交换 2.编写代…

[echarts] 图表工具栏 toolbox

option{// 工具栏配置toolbox:{id:1, // 组件IDshow:true, // 是否显示工具栏orient:horizontal, // 工具栏 icon 的布局朝向itemSize:15, // 工具栏 icon 的大小itemGap:10, // 工具栏…

算法沉淀——双指针算法(leetcode真题剖析)

算法沉淀——双指针算法 01.移动零02.复写零03.快乐数04.盛最多水的容器05.有效三角形的个数06.和为s的两个数字07.三数之和08.四数之和 双指针算法&#xff08;Two Pointer Algorithm&#xff09;是一种常用于数组&#xff08;或链表&#xff09;操作的算法技巧。它的核心思想…

Kano模型

目录 1.介绍&#xff1a;2.Kano模型的作用&#xff1a;3.KANO模型使用场景&#xff1a;4.使用步骤&#xff1a;4.1设计问卷&#xff1a;4.2 数据分析4.2.1 KANO属性4.2.2 Better系数、Worse系数4.2.3 举例&#xff1a; 小结&#xff1a; 1.介绍&#xff1a; Kano模型是一种质量…

C#常见内存泄漏

背景 在开发中由于对语言特性不了解或经验不足或疏忽&#xff0c;往往会造成一些低级bug。而内存泄漏就是最常见的一个&#xff0c;这个问题在测试过程中&#xff0c;因为操作频次低&#xff0c;而不能完全被暴露出来&#xff1b;而在正式使用时&#xff0c;由于使用次数增加&…

【JavaScript 基础入门】02 JavaScrip 详细介绍

JavaScrip 详细介绍 目录 JavaScrip 详细介绍1. JavaScript 是什么2. JavaScript的作用3. HTML/CSS/JS 的关系4. 浏览器执行 JS 简介5. JavaScript 的组成6. JavaScript 的特点 1. JavaScript 是什么 JavaScript&#xff0c;通常缩写为 JS&#xff0c;是一种高级的&#xff0c;…

【SpringSpringBoot】概述

Spring&SpringBoot专题 【注】&#xff1a; 本专题围绕框架核心概念展开&#xff0c;渐进式深入总结学习、面试、开发经验&#xff0c;集中整理便于回顾 持续补充与施工中~~~~ 1.发展史 2.基本架构 Spring框架的基本架构是一个分层架构&#xff0c;包括多个模块&#x…

STL---stackqueue

一、stack 1.stack的介绍 stack介绍文档 https://legacy.cplusplus.com/reference/stack/stack/?kwstack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适…

AI技术大揭秘:探索人工智能的核心领域与必备技能

随着人工智能的不断进步&#xff0c;AI技术在各个领域都发挥着越来越关键的作用。想要成为AI领域的从业者&#xff0c;不仅需要对整体格局有清晰认识&#xff0c;更要掌握关键技术和必备技能。本文将深入解析AI的核心技术领域&#xff0c;以及在这个前沿领域里需要掌握的技能。…

Java_集合类

集合可以看作是一个容器&#xff0c;集合中的各个对象&#xff0c;很容易将其从集合中取出来&#xff0c;也很容易将其存放到集合中&#xff0c;还可以按照一定的顺序进行摆放。JAVA中提供了不同的集合类&#xff0c;这些类具有不同的存储对象的方式&#xff0c;同时提供了相应…

04-JVM虚拟机-课堂笔记

04-JVM虚拟机 1. JVM虚拟机概述 1.4 对象的创建流程与内存分配 1.4.1 创建流程 1.4.2 对象内存分配方式 内存分配的方法有两种&#xff1a;不同垃圾收集器不一样 指针碰撞(Bump the Pointer) 空闲列表(Free List) 分配方法说明收集器指针碰撞(Bump the Pointer)内存地址…

论机器生产内容MGC与新数字时代的两个世界

摘要&#xff1a;本文从新数字时代人类社会的两种存在形态&#xff1a;数字世界&#xff08;元宇宙&#xff09;与物理世界&#xff08;时空宇宙&#xff09;&#xff0c;以及新兴数字产业&#xff1a;机器生产内容MGC的发展、现状与未来出发&#xff0c;通过对新数字时代及两个…

【MIdjourne基础】 |MIdjourney基础参数全解析,各类辅助知识

文章目录 1 参数列表1.1 基础参数列表 2 基础参数详解2.1 模型版本选择2.2 模型出图模式选择2.3 基础生图参数2.3.1 --ar2.3.2 --stylize2.3.3 --no2.3.4 --chaos2.3.5 --quality2.3.6 --stop2.3.7 --hd2.3.8 --repeat 1 参数列表 1.1 基础参数列表 模型版本选择 目标参数作…

什么是微服务?(微服务的技术栈)

微服务是一种架构风格&#xff0c;它将一个单一的应用拆分为多个小型的服务&#xff0c;每个服务运行在自己的进程中&#xff0c;服务间采用轻量级的通信机制&#xff08;如HTTP/webservice等&#xff09;。这些服务围绕业务能力构建&#xff0c;并且可以全自动独立部署。微服务…

PageHelper 分页逻辑 源码解析

一、PageHelper PageHelper 是一个用于在 MyBatis 中进行分页查询的开源分页插件。它能够方便地帮助开发者处理分页查询的逻辑&#xff0c;简化代码&#xff0c;并提高开发效率。PageHelper 支持多种数据库&#xff0c;包括 MySQL、Oracle、PostgreSQL 等。 PageHelper 的实现…

了解OpenCV的数据类型

OpenCV是一个开源的计算机视觉库&#xff0c;广泛应用于图像和视频处理领域。在OpenCV中&#xff0c;数据类型扮演着非常重要的角色&#xff0c;它们决定了数据的存储方式和操作方式。本文将介绍OpenCV中常见的数据类型&#xff0c;包括图像数据类型、矩阵数据类型和轮廓数据类…