MyBatis详解(5)-- MyBatis注解

news2024/11/20 20:34:30

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏洞复现-EduSoho任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

强化合作!浪潮信息携手业界伙伴筑牢算力底座

以太平金融科技服务&#xff08;上海&#xff09;有限公司&#xff08;以下简称“太平金科”&#xff09;为例&#xff0c;在算力新型基础设施建设方面&#xff0c;该公司一直不遗余力。近日&#xff0c;该公司更携手全球领先的IT基础设施供应商浪潮信息&#xff0c;优化算力基…

腾讯云幻兽帕鲁服务器创建教程,附4核16G服务器价格表

腾讯云0基础搭建帕鲁服务器4C16G14M服务器稳定无卡顿&#xff0c;先下载SteamCMD&#xff0c;并运行&#xff1b;然后下载Palserver&#xff0c;修改服务ini配置&#xff0c;启动PalServer&#xff0c;进入游戏服务器。腾讯云百科txybk.com分享腾讯云创建幻兽帕鲁服务器教程&am…

【Apollo CyberRT】源码分析之 “component” 模块

代码位置 apollo/cyber/component 功能 在自动驾驶系统中&#xff0c;模块&#xff08;如感知、定位、控制系统等&#xff09;在 Cyber ​​RT 下以 Component 的形式存在。不同 Component 之间通过 Channel 进行通信。Component 概念不仅解耦了模块&#xff0c;还为将模块拆…

Maven入门及其使用

目录 一、Maven入门 1.1 初识Maven 1.2 Maven的作用 1.2.1 依赖管理 1.2.2 统一项目结构 1.2.3 项目构建 1.3 Maven坐标 1.4 Maven仓库 1.4.1 Maven仓库概述 二、Maven的下载与安装 2.1 安装步骤 2.1.1 解压安装&#xff08;建议解压到没有中文、特殊字符的路径下。&#xff09…

C语言-指针的基本知识(上)

一、关于内存 存储器&#xff1a;存储数据器件 外存 外存又叫外部存储器&#xff0c;长期存放数据&#xff0c;掉电不丢失数据 常见的外存设备&#xff1a;硬盘、flash、rom、u盘、光盘、磁带 内存 内存又叫内部存储器&#xff0c;暂时存放数据&#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 基础参数列表 模型版本选择 目标参数作…

Redis -- 前置知识

目录 简要 分布式系统 负载均衡 引入缓存 数据库分表 微服务 小结 简要 redis是存储数据在内存中, 定义变量就是在内存中, 但是redis是在分布式系统中, 才能真正发挥威力, 如果只是单机程序, 那么直接通过变量来存储数据的方式将是最优的选择. …

同为科技(TOWE)自动控制循环定时插座

随着科技的发展&#xff0c;智能化家居已成为我们生活的重要组成部分。作为国内领先的智能家居品牌&#xff0c;同为科技&#xff08;TOWE&#xff09;推出的自动控制循环定时插座&#xff0c;无疑将科技与生活完美地结合在一起。 1.外观设计 同为科技&#xff08;TOWE&#x…

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求。 Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索 Similar…

Linux 驱动开发基础知识——总线设备驱动模型(七)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

一道CTF签到题

点击题目的签到&#xff0c;提示&#xff1a; 看来需要修改请求的源地址&#xff1a; 上来我先尝试了我最常用的xff&#xff0c;结果不行&#xff0c;于是尝试了其他的几个常用请求头&#xff1a; 1.host头 如果后端从host取值来判断是否是本地就可以通过此方法进行绕过&…

简洁思路推理 KMP 算法——子字符串匹配

例题 28. 找出字符串中第一个匹配项的下标 暴力遍历解法 枚举原串 ss 中的每个字符作为「发起点」&#xff0c;每次从原串的「发起点」和匹配串的「首位」开始尝试匹配&#xff1a; 匹配成功&#xff1a;返回本次匹配的原串「发起点」。 匹配失败&#xff1a;枚举原串的下一个…

Python实战:将爬虫获取到的数据存到数据库中

在前几篇 Python 实战中&#xff0c;我们直接把爬虫获取到的数据存储到 excel 文件或者 csv 文件中。今天&#xff0c;我们将爬虫获取到的数据存储到数据库中。 而存到数据库中&#xff0c;我们可以选择 MySQL、PostgreSQL、SqLite、Sql Server 等数据库。 在这些数据库中 Sq…

重装Windows系统出现Windows无法安装到这个磁盘,选中的磁盘采用GPT分区

文章目录 1.问题描述2.问题解决 1.问题描述 重装Windows系统时&#xff0c;出现Windows无法安装到这个磁盘&#xff0c;选中的磁盘采用GPT分区这个提示 2.问题解决 1.shiftF10&#xff0c;打开命令行 2.输入&#xff1a;diskpart (打开分区工具) 3.输入&#xff1a;list di…

C语言“%”运算符是否可以对小数进行运算?

一、问题 “&#xff05;”运算符是否可以对⼩数进⾏运算&#xff1f; 二、解答 “&#xff05;”运算符&#xff0c;称为求余运算符或者模运算符&#xff0c;要求“&#xff05;”两侧都为整型数据&#xff0c;否则将会产⽣错误 #include <stdio.h> int main() {floa…

电路笔记 :MOS场效应晶体管+红外遥控+AMS1117 电源模块

三极管&#xff08;BJT&#xff0c;Bipolar Junction Transistor&#xff09;和 MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;是两种不同类型的晶体管&#xff0c;它们在工作原理、性能特性和应用方面有一些重要的区别。 结构和工作原理…

Qt项目文件以及对象树

"在哪里走散&#xff0c;你都会找到我~" 前篇&#xff0c;我们仅仅对Qt创建了第一个简单的项目。相比于使用其他IDE创建工程项目&#xff0c;Qt会为自动创建诸如&#xff1a;.pro、.h\.cpp、.iu等文件&#xff0c;这些文件到底是什么&#xff1f;我们在使用Qt时 应该…

欢迎来到 Greasy Fork,这里是一个提供用户脚本的网站。

官方地址&#xff1a; https://greasyfork.org/zh-CN 欢迎来到 Greasy Fork&#xff0c;这里是一个提供用户脚本的网站。 脚本适用于&#xff1a; baidu.com bilibili.com qq.com iqiyi.com sohu.com 更多… 用户脚本是什么&#xff1f; 用户脚本是一段代码&#xff0c;它们能…

前端——CSS

目录 文章目录 前言 一.CSS简介 1.CSS选择器 2.CSS选择器语法 3.CSS样式引入 4.CSS 高级选择器 二.CSS样式 1.字体 ​编辑 2.文本 3. 背景 4.边框 5.边距 6.浮动 7.清除浮动 8.定位 9. 列表样式 10.伪类样式 三.盒子模型 四.CSS3新特性 1.边框 2.盒子阴影 …