MyBatis:mybatis基础操作

news2024/12/23 13:41:54

MyBatis基础操作

新增

接口方法

@Insert()
insert();

删除

接口方法

@Delete()
delete();

@Delete("delete from emp where id = #{id}")
public abstract void delete(Integer id)
//如果只传了一个形参,括号内可以随意写

修改

接口方法

@Update()
update();

查询

接口方法

@Select()
select();

条件查询

接收参数方式一:

直接拼接参数,只能使用${…}(?占位符不能放在单引号内)

使用@Param(“参数名”)标明参数

@Select("select * from emp where name like '%${name}%' and gender
= #{gender} and entrydate between #{begin} and #{end} order by
update_time desc")
public List<Emp> list(@Param("name")String name,
@Param("gender")Short gender , @Param("begin")LocalDate begin
,@Param("end")LocalDate end);
接收参数方式二:

使用concat拼接参数,可以使用预编译sql

@Select("select * from emp wher e name like concat('%',#{name},'%')
and gender = #{gender} and entrydate between #{begin} and #{end}
order by update_time desc")
public List<Emp> list(@Param("name")String name,
@Param("gender")Short gender , @Param("begin")LocalDate begin
,@Param("end")LocalDate end);

mybatis日志输入

在properties配置文件中配置mybatis日志输出位置

#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.logimpl=org.apache.ibatis.logging.stdout.StdOutImpl

预编译SQL

使用?对sql语句中的参数进行提前占位

优势:

性能更高

预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条insert语句时,

防止SQL注入

将敏感字进行转义,安全.

SQL注入

通过操作输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法.

非预编译sql语句每次加载都需要重新编译
预编译sql语句无需重新编译(在内存中保留)

参数占位符

项目中建议使用#{…},防止SQL注入

${...}
#拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题
#使用时机:对列名和表名进行动态设置时使用
`#{...}`
#编译时会将#{...}替换成?,不存在sql注入问题
#生成预编译SQL,自动设置参数
#使用时机:参数传递时,都使用#{...}

自增主键回填

在添加数据完成后,自动获取新数据的主键赋值给对象属性

使用注解@Options(useGeneratedKeys = true, keyColumn = “id”,keyProperty = “id”)

keyColumn 数据库主键名称

keyProperty 实体类主键名称

数据封装

实体类属性名需要与数据库表查询返回的字段名一致,mybatis会自动封装为实体类

1,在SQL语句中起别名与实体类属性名一致也能完成映射
2,使用
@Results({
    values={
        @Result(column = ""
               	property = "")
    })
}
进行手动映射
3,开启驼峰命名(推荐)

mybatis会自动通过驼峰命名规则映射

aB = a_b

参数名说明

springBoot在1.x版本中,所有接口方法形参的变量如果有多个,就需要通过@Param注解来指定SQL语句中的参数名

在2.x版本之后,springBoot的父工程对compiler编译插件进行了默认的参数parameters配置,使得在编译时会在字节码文件中保留原方法形参的名称,所以#{…}里面可以直接通过形参名获取对应值.

eg:

sql语句中直接写: id = #{id}

MySQL动态SQL

会随着用户的输入或者外部条件的变化而变化的SQL语句,称为动态SQL

XML映射文件

如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,即将SQL语句写在XML配置文件中

SQL映射配置文件需要符合一定规范:

XML映射文件的名称和Mapper接口名称一致,且将XML映射文件和Mapper接口放在相同的包下(在resource下创建相同的包).
XML映射文件中的namespace属性为Mapper接口全限定名一致
XML映射文件中sql语句的id与Mapper接口中的方法名一致,且保持参数类型和返回值类型一致
@Mapper test{
	List<Emp> list (String name...)
}
<mapper namespace = "com.itheima.mapper.EmpMapper">
	<select id="list" resultType="">
    	sql语句
    </select>
    <delete id='delete'>
    	sql
    </delete>
 </mapper>    
 //resultType属性标明了查询返回的单条记录封装的类型(实体类)

resultType:实体类全限定名

resultMap:

resultType的一种升级,当实体类无法直接映射时,需要用到resultMap进行手动映射

如下:

请添加图片描述

标签解析:属性column为字段名,property为实体类属性名

id:标识主键

result:其他列标识

collection:标识集合

<mapper namespace="mapper.RoleMapper">
    <resultMap id="pp" type="role" autoMapping="true">
        <id property="rid" column="rid"/>
        <!-- property 保存集合的属性名 -->
        <!-- column 指定查询需要的参数  会将当前对应数据传入查询语句 -->
        <!-- select可以调用对应空间下查询语句进行结构的查询 -->
        <!-- fetchType=lazy 开启懒加载   默认为eager 侵入式查询 会直接调用查询语句执行-->
        <collection property="ps" column="rid" select="mapper.PermissionMapper.selectByRid"
                    fetchType="lazy"/>
    </resultMap>

    <select id="selectAll" resultMap="pp">
        select *
        from role
    </select>

</mapper>

IF

用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL

条件查询
<if test = 条件>
    拼接sql语句
</if>
<where>
	只有在存在子元素的情况下才会插入where子句,且自动去除子句开头的AND或OR
</where>

SET

用于实现部分修改,自动去除修改语句后的逗号

<set>
	<if>
    	aaa = bbb,
    </if>
</set>

Foreach

<foreach 
         collection=""
         item="id"
         separator
         open
         close>
    #{id}
</foreach>

collection:要遍历的集合名称

item:集合遍历出来的元素/项

separator:每次遍历使用的分隔符

open:遍历开始前拼接的片段

close:遍历结束后拼接的片段

sql/include

sql:对sql语句进行封装

<sql id="">
    sql语句
</sql>

include:对封装语句进行复用

<include refid=""/>

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

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

相关文章

Jupyter Notebook魔术命令

Jupyter Notebook是一个基于网页的交互式笔记本&#xff0c;支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实现代码&#xff0c;数学方程&#xff0c;可视化和markdown。用途包括&#xff1a;数据…

MATLAB中自定义栅格数据地理坐标R,利用geotifwrite写入tif

场景描述&#xff1a; 有时候将nc格式的数据转成tiff&#xff0c;或者是将一个矩阵输出成带有地理坐标信息tiff数据时&#xff0c;常常涉及到空间参考的定义和geotiffwrite()函数。 问题描述&#xff1a; 以全球数据为例&#xff0c;今天发现在matlab中对矩阵进行显示后&…

【大模型学习】大模型相关概念

知识库 Embeding 嵌入&#xff0c;又称向量化、矢量化。 Prompt engineer 提示词工程 提示工程技巧 RAG 检索增强生成&#xff0c;提高文本的准确性和丰富性。 Fine tuning 微调&#xff0c;优化已有人工智能模型以适应特定任务的技术。 AI agent AI代理人&…

华为机考入门python3--(19)牛客19- 简单错误记录

分类&#xff1a;字符串 知识点&#xff1a; 分割字符串 my_str.split(\\) 字符串只保留最后16位字符 my_str[-16:] 列表可以作为队列、栈 添加元素到第一个位置 my_list.insert(0, elem) 增加元素到最后一个位置 my_list.append(elem) 删除第一个 my_list.pop(0)…

Python中的数据可视化:阶梯图matplotlib.pyplot.step()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 Python中的数据可视化&#xff1a; 阶梯图 matplotlib.pyplot.step() [太阳]选择题 matplotlib.pyplot.step()的功能是&#xff1f; import matplotlib.pyplot as plt import numpy as…

基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的旅游管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

机器视觉系统-条形光源安装位置计算

使用条形光对反光材质物体打光时&#xff0c;常常出现强烈的光斑反射&#xff0c;影响图像处理。如果不想图像中出现光源的光斑&#xff0c;可以通过计 算得出条形光源的安装范围。 检则PCB板上的二维码字符&#xff0c;使用两个条形光打光的效果图 以及等效模型&#xff1a; …

CSS 鼠标经过放大元素 不影响其他元素

效果 .item:hover{transform: scale(1.1); /* 鼠标悬停时将元素放大 1.1 倍 */ }.item{transition: transform 0.3s ease; /* 添加过渡效果&#xff0c;使过渡更加平滑 */ }

esp32-cam 2. python opencv 拉取摄像头内容

0. 环境 - win10 python3 - pycharm - esp32-cam http://192.168.4.1 1. 创建工程 File -> Create Project -> -> Location: E:\Workspaces\PycharmProjects\esp32cam_opencv -> Create 2. opencv hello 2.1 添加脚本 File -> New -> Python f…

39 死锁

目录 1.死锁 2.线程同步 3.条件变量 4.案例 死锁 概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 四个必要条件 互斥条件&#xff1a;一个资源每次只能被一个执行流使用 请求…

✔ ★Java大项目——用Java模拟RabbitMQ实现一个消息队列(二)【创建核心类、封装数据库操作】

✔ ★Java大项目——用Java模拟RabbitMQ实现一个消息队列 四. 项⽬创建五. 创建核⼼类 ★创建 Exchange&#xff08;名字、类型、持久化、自动删除、参数&#xff09;创建 MSGQueue&#xff08;名字、持久化、独占标识&#xff09;创建 Binding&#xff08;交换机名字、队列名字…

如何使用 Node.js 开发一个文件上传功能?

在 Node.js 中实现文件上传功能可以通过多种方式完成&#xff0c;但其中最常用的方法之一是使用 Express 框架和 Multer 中间件。Express 是一个流行的 Node.js Web 框架&#xff0c;而 Multer 是一个用于处理文件上传的中间件。 步骤 1: 准备工作 首先&#xff0c;确保你已经…

【系统架构师】-选择题(十一)

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

(五)SQL系列练习题(上)创建、导入与查询 #CDA学习打卡

目录 一. 创建表 1&#xff09;创建课程表 2&#xff09;创建学生表 3&#xff09;创建教师表 4&#xff09;创建成绩表 二. 导入数据 1&#xff09;导入课程科目数据 2&#xff09;导入课程成绩数据 3&#xff09;导入学生信息数据 4&#xff09;导入教师信息数据 …

Linux的有关权限的学习

1.认识权限在Linux中的表示 在Linux中&#xff0c;一切皆文件&#xff0c;而每个文件都会有其相对应的操作权限。那么&#xff0c;我们该怎么来认识他们呢&#xff1f; 首先我们可以看到&#xff0c;在每个test文件的前面都会有一个-rw-r--r--这个字符&#xff0c;而这个字符&…

python实现验证码-图片类型

1 utils.py import randomdef get_random_code():code for i in range(5):# 随机生成大写字母upper_char chr(random.randint(65, 90))lower_char chr(random.randint(97, 122))num_char str(random.randint(0, 9))res random.choice([upper_char, lower_char, num_char]…

【Unity Shader入门精要 第4章】数学基础(二)

1. Unity中的坐标空间 1.1 五个坐标空间 模型空间 模型自身的3D坐标系空间&#xff0c;左手坐标系是一个相对空间&#xff0c;坐标轴指向随模型旋转变化当物体有父节点时&#xff0c;Transform组件中各属性的值表示的即为该物体在其父物体的模型空间中的值当模型顶点传入顶点…

js APIS part2

什么是事件&#xff1f; 事件是在编程时系统内发生的 动作 或者发生的事情。比如用户在网页上 单击 一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 绑定事件或者注册…

亚马逊云科技AWS免费证书-EC2服务器设计(含题库)

亚马逊云AWS官方程序员专属免费证书又来了&#xff01;这次证书是关于AWS EC2实例的设计和搭建&#xff0c;EC2作为AWS服务的核心&#xff0c;是学好AWS的第一步。强推没有任何AWS背景和转码的小伙伴去学&#xff01;学完也能变成AWS开发大神&#xff01; 证书名字叫Getting St…