11.18MyBatis 学习2

news2025/7/20 23:51:07

1 #和$的区别

#{}表示一个占位符号 

  • 通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
  • #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。
  • 可以自动对值添加 ’ ’ 单引号

${}表示拼接 sql 串

  • 通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,
  • ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
  • 比如order by id  这种的,以id排序  那么这个id 是没有单引号的,就是简单的SQL拼接,所以我们应该使用${} 而不是#{}

多个参数

当我涉及到多个参数传参的时候,这个时候,我们直接使用变量名会发现控制台有错误提示

 Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]说

这个使用我们也需要通过@Param的注解来解决这个问题  

  int update(@Param("addr") String addr, @Param("id")int id);

2 paramerterType 和 resultType

paramerterType  参数类型

之所以我们可以直接写类名的原因就是因为这些这些常用类型,mybatis已经帮我们配置好了别名。下图是类型对照说明。

针对于实体类,我们如果也想用简写,就需要我们自己去配置别名了。

resultType 结果集的类型 

设置包 下所有实体类的别名,别名就是类名

     <package name="com.example.mybatisIone.entity"/>

resultMap    匹配数据规则

多个单词往往是用_连接,但是在实体类中的属性往往采用小驼峰的方式命名。这就导致字段名无法对应上,这个时候我们就需要配置resultMap来解决这个问题了。

通过resultMap,我们可以指定查询结果字段和实体属性字段的映射关系。

<resultMap id="userResult" type="User">
    <id column="id" property="id" />
    <result property="nickname" column="nickname" />
    <result property="schoolName" column="school_name" />
property 对应的是实体类    column 对应的是数据库
</resultMap>

mybatis-config.xml   中mappers标签中的mapper

Resource  使用相对于类路径的资源如:一劳永逸

<mapper resource="com/tledu/zrz/dao/IUserDao.xml" />

class  使用 mapper 接口类路径如:

<mapper class="com.tledu.zrz.dao.UserDao"/>

注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中,这里如果希望能够扫描到包下面的xml文件的话,需要在maven中进行配置。

  • package  注册指定包下的所有 mapper 接口如:

    <package name="com.tledu.zrz.mapper"/>

需要在maven中进行配置如下

<resources>
            <resource>
                <!-- directory:指定资源文件的位置 -->
                <directory>src/main/java</directory>
                <includes>
                    <!-- “**” 表示任意级目录    “*”表示任意任意文件 -->
                    <!-- mvn resources:resources :对资源做出处理,先于compile阶段  -->
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <!--  filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name}) -->
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
</resources>

动态sql

if

<select id="list" parameterType="User" resultMap="userResult">
        select  * from t_user where 1=1
        <if test="username != null and username != ''">
            and username = #{username}
        </if>
        <if test="nickname != null and nickname != ''">
            and nickname like concat('%',#{nickname},'%')
        </if>
</select>
id= 方法名
parameterType=方法返回的实体类
resultMap=结果集


 where 标签解决了两个问题

解决了两个问题

1.去掉第一个遇到的and

 2.当where标签内为空时,会自动去掉自己where

 <select id="list" parameterType="User" resultMap="userResult">
        select * from t_user 
        <where>
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
            <if test="nickname != null and nickname != ''">
                and nickname like concat('%',#{nickname},'%')
            </if>
        </where>
</select>

set标签解决了一个问题带来一个问题

 解决问题

 1.set标签帮咱们去掉了最后一个,

 带来了一个问题

1.当标签内部为空时,把自己去掉了,带来了语法错误

<update id="updateNickname">
        update t_user
        <set>
            <if test="nickname != null and nickname != ''">
                nickname = #{nickname},
            </if>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
        </set>
        where id = #{id}
</update>

foreach

属性说明

  • collection 需要遍历的列表
  • item 每一项的形参名
  • index 每一项索引名
  • separtor 分隔符
  • open 开始符号
  • close 关闭符号
<insert id="insertB" parameterType="Address">
        insert into t_address(addr,phone,postcode)values
        <foreach collection="addressList" item="eve" index="index" separator=",">
            (#{eve.addr},#{eve.phone},#{eve.postcode})
        </foreach>
    </insert>

使用foreach批量添加代码如下

    <insert id="insertB" parameterType="Address">
        insert into t_address(addr,phone,postcode)values
        <foreach collection="addressList" item="eve" index="index" separator=",">
            (#{eve.addr},#{eve.phone},#{eve.postcode})
        </foreach>
    </insert>

in 查询

<select id="list" parameterType="User" resultMap="userResult">
        select * from t_user
        <where>
            <if test="user.username != null and user.username != ''">
                and username = #{user.username}
            </if>
            <if test="user.nickname != null and user.nickname != ''">
                and nickname like concat('%',#{user.nickname},'%')
            </if>
            and id in
            <foreach collection="idList" item="item" separator="," open="(" close=")">
                #{item}
            </foreach>
        </where>
</select>

联查


在项目中,某些实体类之间肯定有关联关系,比如一对一,一对多等,在mybatis 中可以通过association和collection,来处理这些关联关系。

1 对 1  关系
在实现1对1映射的时候,可以通过association属性进行设置。在这里有三种方式

在地址表中,每个地址对应有一个创建用户,每次查询地址的时候希望查询到创建用户的内容

第一种:使用select

<resultMap id="address" type="Address">
        <id column="id" property="id" />
        <association property="user" column="user_id" javaType="User" select="com.tledu.erp.dao.IUser2Dao.selectById"/>
</resultMap>

第二种:直接进行联查,在association中配置映射字段

<!--    //第二种方式-->
    <resultMap id="adderandmap" type="AdderAndUser" autoMapping="true">
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <association property="user" javaType="User" autoMapping="true">

        </association>

    </resultMap>

第三种:嵌套的resultType

<!--    //第三种实现方法-->
    <resultMap id="adderandmap2" type="AdderAndUser" autoMapping="true">
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <association property="user" javaType="User" autoMapping="true" resultMap="qwe"/>
    </resultMap>
    <resultMap id="qwe" type="User" autoMapping="true">

    </resultMap>

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

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

相关文章

【附源码】Python计算机毕业设计天气预报查询管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

linux x64 下的redis安装

1.官网下载linux版本的安装包&#xff0c;官网地址&#xff1a;http://redis.io/download 2.新建目录 mkdir /usr/local/src/redis&#xff0c;并上传到该目录&#xff0c;解压 tar xzvf redis-7.0.5.tar.gz 3…执行make 对Redis解压后文件进行编译 在编译完成之后查看当前文…

MeterSphereV2.3版本Mac本地启动详细教程(含常见错误)

一、准备工作 因为代码是java语言写的&#xff0c;所以提前准备好java的环境JDK11 &#xff1a;https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.htmlmaven&#xff08;3.6.2以上都行&#xff09;&#xff1a;https://archive.apache.org/dist/mave…

进程的虚拟地址空间

每个程序运行起来后&#xff0c;都拥有一个自己的虚拟地址空间&#xff08;注意是虚拟的&#xff0c;不是实际存在的&#xff09;&#xff0c;这个虚拟地址空间的大小由计算机的硬件平台 关于虚拟的概念&#xff0c;当时IBM给出了一种说法很形象生动&#xff1a; 它存在&#x…

XSS-labs靶场实战(三)——第7-8关

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XSS-labs靶场实战第7-8关。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

PyQt5_股票策略校验工具_升级版

相对 PyQt5_股票策略校验工具 博文&#xff0c;图形展示方面增加多行图展示&#xff0c;原本只有K线图&#xff0c;升级版工具可以动态添加多行指标图 股票策略有效与否的确认&#xff0c;需要在不同股票&#xff0c;不同时间段&#xff0c;运行对比&#xff0c;确认在哪些条件…

图文轻松说透 K8S Pod 各种驱逐场景

图文轻松说透 K8S Pod 各种驱逐场景 Kubernetes Pod 被驱逐是什么意思&#xff1f; 它们被终止&#xff0c;通常是没有足够资源的结果。但是为什么会这样呢&#xff1f; 驱逐是指派给节点的Pod 被终止的过程。Kubernetes 中最常见的情况之一是Preemption&#xff0c;为了在资…

基于PHP+MySQL健身俱乐部系统的设计与实现

随着时代的发展和人们对生活的热爱,健身已经成为人们工作之余的一种热爱,相对应的各种健身俱乐部也如雨后春笋般出现,处于宣传的目的各类健身俱乐部网站也不断的出现,处于对健身俱乐部的宣传作用,我们通过PHP语言和MYSQL数据库开发了健身俱乐部系统 PHP&#xff1a;MySQL健身俱…

笔试强训第29天(有假币+求正数数组的最小不可组成和)

单选 A选项&#xff1a;当内存访问越界的时候&#xff0c;线程会收到信号&#xff0c;进而进行信号处理。调用信号处理函数。 B选项&#xff1a;ACM时间。 A&#xff1a;最后访问时间&#xff0c;文件被读取而更新的时间 C&#xff1a;状态修改时间&#xff0c;文件的属性或者权…

pymsql模块+事务+mysql 注入+数据库备份和恢复

import pymysqlconn pymysql.connect(host127.0.0.1, userroot, password123456, databasehomework) # cur conn.cursor(cursorpymysql.cursors.DictCursor)#查询返回字典 cur conn.cursor() # cursor游标&#xff0c;默认返回元组 try:cur.execute(select * from students…

前端加密与解密

插件加密 MD5加密&#xff08;不可逆&#xff09; MD5加密是不可逆的&#xff0c;相当于是插件加密&#xff0c;当然你也可以把他的方法抄过来自己实现。 MD5.js是通过前台js加密的方式对用户信息&#xff0c;密码等私密信息进行加密处理的工具&#xff0c;前端用的比较多。…

【毕业设计】深度学习手势识别检测系统 - python

文章目录1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估6 识别效果7 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长…

【ASE+python学习】批量实现将含有空位的结构进行氢饱和(实际就是在某个位置添加氢原子)

批量实现将含有空位的结构进行氢饱和任务大纲任务思路氢原子相对位置计算代码实现-单个结构加氢导入所需库/包计算氢原子坐标给结构加氢运行结果代码实现-批量结构加氢导入相关库/包遍历文件夹内所有结构&#xff0c;并逐次给结构加氢批量实现的逻辑与结果在搬砖过程中&#xf…

【教学类-15-01】20221115《学号(姓名)描字帖-A4横版-竖切》(中班)

效果展示 浅蓝色打印纸&#xff08;灰色字体&#xff09; 背景需求&#xff1a; 在中3班的Python学具实验中&#xff0c;发现至少有3位幼儿明确表示自己不会写学号&#xff0c;还有3位幼儿书写的学号是镜像字&#xff08;两个数字位置互换、两个数字都左右镜像、2和5上下镜像等…

【树莓派不吃灰】命令篇⑤ ps -ef | grep xxx | grep -v grep | wc -l 命令

目录1. 简介2. grep -v grep 命令作用2.1 ps -ef | grep python32.2 grep -v grep❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11-18 ❤️❤️ 本篇更新记录 2022-11-18 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &am…

让 Serverless 更普惠,阿里云函数计算 FC 宣布全面降价,最大幅度达 37.5%

背景 11 月 5 日&#xff0c;2022 杭州 云栖大会上&#xff0c;阿里云宣布函数计算 FC 开启全面降价&#xff0c;vCPU 单价降幅 11% &#xff0c;其他的各个独立计费项最高降幅达 37.5% 。 本次云栖大会上&#xff0c;阿里云智能总裁张建锋表示&#xff0c;以云为核心的新型…

动态分区算法(头歌实验)第1关:首次适应算法。第2关:最佳适应算法。

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 题目&#xff1a; 第1关&#xff1a;首次适应算法 任务描述 假设初始状态下可用的内存空间为55MB&#xff0c;并有如下的请求序列&#xff1a; 作业1申请15MB 作业2申请30M…

Yolov5+图像分割+百度AI接口——车牌实时检测识别系统

Hallo&#xff0c;各位小伙伴大家好呀&#xff01;这两天一直在肝项目&#xff0c;都是关于计算机视觉方面的&#xff0c;所以这两天一直也没有更新&#xff08;真的不是我懒&#xff09;&#xff01;在这个过程中我对Yolov5有了更深刻的理解&#xff0c;在原有的Yolov5框架上增…

14.4、SpringWebFlux-2

14.4、SpringWebFlux-2 14.4.3、SpringWebFlux执行流程和核心 API SpringWebFlux 基于 Reactor&#xff0c;默认容器是 Netty&#xff0c;Netty 是高性能的 NIO 框架&#xff0c;异步非阻塞&#xff08;AIO&#xff0c;是 NIO 的升级&#xff09;的框架 14.4.3.1、执行流程 …

jrtplib开源库系列之三:jrtplib发送接收数据流程

说明 前面2篇文章主要说明了如何安装jrtplib库&#xff0c;以及对example1进行了说明&#xff0c;这篇文章主要说下jrtplib库数据的收发流程。 数据收发流程 从例子1就可以很好的说明jrtplib的使用是非常简单的&#xff0c;主要分为以下几步 1. 设置会话参数(比如时间戳&am…