MyBatis的CRUD

news2025/1/11 6:04:45

0-基础知识

        id:唯一标识

        type:映射的类型,支持别名

java里的命名规则是驼峰,而sql里面是下划线,如何对数据库表的字段起别名?

        数据库表的字段名称和实体类的属性名称 不一样,则不能自动封装数据,我们提供了三种解决方法。

1、起别名:对不一样的列名起别名,让别名和实体类的属性名一样。

 缺点:每次查询都要定义一次别名。

  <select id="selectAll" resultType="brand">
         select
              id, brand_name as brandName, company_name as companyName, ordered, description, status
         from tb_brand;
     </select>

2、 sql片段

缺点:不灵活。

    <sql id="brand_column">
         id, brand_name as brandName, company_name as companyName, ordered, description, status
     </sql>

     <select id="selectAll" resultType="brand">
         select
             <include refid="brand_column" />
         from tb_brand;
     </select>

 3、resultMap:

1. 定义<resultMap>标签。

 2. 在<select>标签中,使用resultMap属性替换 resultType属性。

    <resultMap id="brandResultMap" type="brand">
        <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
        -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

如何传入参数? 

    #{} 会将等待输入的文本替换成? 如同preparedStatement 防止sql注入。
    ${}在查询的时候,我们需要使用模糊查询like。这时候只能使用此种方法。

   参数类型:parameterType() 可以省略,因为传入什么就赋值什么,在接口中已经定义好了数据类型。


    <select id="selectById" parameterType="int" resultType="com.tsj.pojo.user">
        select *
        from tb_user
        where id = #{};
    </select>

</mapper>
        //随后通过代理对象调用接口中的方法,Mybatis会自动寻找到xml配置文件中相对应的sql语句并执行
        //List<brand> brands = brandMapper.selectAll();
        brand brand = brandMapper.selectByID(id);
        System.out.println(brand);

    特殊字符处理:小于号< 不可以直接食用
    1、转义字符&lt; 相当于小于号,字符比较少的时候使用
    2、CDATA区:字符比较多的时候使用,会将里面的一切都当作纯文本操作

    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand
        where id
         <![CDATA[
            <
         ]]>
         #{id};

    </select>

创建sql的执行对象

sqlSessionFactory.openSession(true/false) 

设置可以选择是否开启事务,true->自动提交 ;false->手动提交;

1-普通的查询->Mybatis的三种参数接收方式 

多条件查询

参数接收:

    <select id="selectByCondition" ResultMap="com.tsj.pojo.brand">
        select *
        from tb_brand
        where status = #{status}
        and company_name like #{company_name}
        and brand_name like #{brand_name}
    </select>

所有配置步骤,包括三种处理参数的方法。 

1、散装参数:如果方法中由多个参数,需要使用@param(sql语句占位符名称) 

@Interface
    List<brand> selectByCondition(@Param("status")int status,@Param("companyName") String company_name,@Param("brandName")String bramd_name);
@Test
List<brand> brands = brandMapper.selectByCondition(status, companyName, brandName);

  2、对象参数:对象属性名称要和参数占位符名称保持一致

@Interface 
List<brand> selectByCondition(brand brand);
@Test
List<com.tsj.pojo.brand> brands = brandMapper.selectByCondition(brand);

3、map集合参数:保证sql中参数名和map集合里面的健的名称对应的上,即可设置成功。

@Interface
List<brand> selectByCondition(Map map);
@Test
List<com.tsj.pojo.brand> brands = brandMapper.selectByCondition(map);

封装数据的过程

        //设置参数
        int status=1;
        String company_name="华为";
        String brand_name="华为";

        //处理参数,用作模糊处理
        company_name="%"+company_name+"%";
        brand_name ="%"+company_name+"%";


        //创建map集合
        Map map=new HashMap();
        map.put("status",status);
        map.put("company_name",company_name);
        map.put("brand_name",brand_name);

        //封装对象
        brand brand=new brand();
        brand.setStatus(status);
        brand.setCompany_name(company_name);
        brand.setBrand_name(brand_name);

2- 动态查询

有一些查询,我们并不要求所有的选项都被用户输入,一旦出现了数据为null的情况,无法从表中查询到有效的数据。

基于此情况,我们需要随着sql语句的变化进行修改,也就是switch判断。Mybatis提供了一套内置的标签,帮助我们进行判断。

<select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <choose><!--相当于switch-->
                <when test="status != null"><!--相当于case-->
                    status = #{status}
                </when>
                <when test="companyName != null and companyName != '' "><!--相当于case-->
                    company_name like #{companyName}
                </when>
                <when test="brandName != null and brandName != ''"><!--相当于case-->
                    brand_name like #{brandName}
                </when>

            </choose>
        </where>
    </select>

3-插入数据

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    </insert>

 返回主键

添加关联数据时。

在订单表和订单项中,他们之间是多对多的关系。即一个订单表和多个商品表对应商品中间表外键。

每当我们插入一个商品的时候, 我们需要将商品和中间表相关联。与此同时,我们需要将订单表也进行更新,更新时我们需要知道添加的是哪件商品,所以需要返回商品的id。

看不懂?以后再来修改。

 4-修改数据

在测试类中,我们仅仅对部分数据进行修改,其他保持不变,并对数据封装后提交给方法。这样会让不想修改的数据变成null。为了解决这个问题,我们可以使用<if></if>标签在配置文件中前进行筛选。

<update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName != ''">
                brand_name = #{brandName},
            </if>
            <if test="companyName != null and companyName != ''">
                company_name = #{companyName},
            </if>
            <if test="ordered != null">
                ordered = #{ordered},
            </if>
            <if test="description != null and description != ''">
                description = #{description},
            </if>
            <if test="status != null">
                status = #{status}
            </if>
        </set>
        where id = #{id};
    </update>

5-删除数据

删除一个数据

    <delete id="deleteById">
        delete from tb_brand where id = #{id};
    </delete>

批量删除

把选中的id值提交给代码,代码挨个去删除。我们会把待删除的id封装成数组,随后按照顺序一个个删除。

Mbatis中配置了遍历数组的标签<foreach>,我们随着遍历,随着将获取到的数据放到?处。

我们需要使用seperate将每个输入的?分隔开。

我们同样open=“” close=“”表示开始和结束的时候拼接什么。
Please Attention 

Mybatis会自动的将我们传递去的数组封装成一个map集合.

默认array=你传递的数组数据.

你可以使用@Param注解来改变map集合默认key的名称。

    <delete id="deleteByIds">
        delete from tb_brand where id
        in
            <foreach collection="array" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>
             ;
    </delete>

6-Mybatis参数传递-Mybatis是如何封装底层数据的

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

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

相关文章

算法套路十五——最长公共子序列LCS

算法套路十五——最长公共子序列LCS 算法示例&#xff1a;LeetCode1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&am…

Windows系统配置Anaconda虚拟环境,并安装Numpy、Scipy和Matplotlib等模块方法

有些项目不是必须在Ubuntu系统下进行的&#xff0c;对大部分人来说更熟悉Window系统&#xff0c;且查阅电脑中相关文件和使用微信更方便&#xff0c;因此记录一下Windows系统配置Anaconda虚拟环境步骤和安装Numpy、Scipy及Matplotlib等模块方法。 一、Anaconda安装 Anaconda可以…

异步电机速度估计-模型参考自适应MRAS法(补充)

导读&#xff1a;前期文章已经介绍过模型参考自适应MRAS进行速度估计的方法&#xff0c;本期文章主要是对MRAS实现的细节做一下补充。 若需要文章的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。 一、MRAS知识点回顾 1.1 基本原理 MRAS 模…

Calico的BGP打通Kubernetes网络和局域网

1、项目背景 随着云原生技术的不断发展&#xff0c;容器化应用已成为企业构建云原生架构的重要方式。而随着集群规模不断扩大&#xff0c;跨主机通信的需求也越来越重要。在 Kubernetes 集群中&#xff0c;Pod 是最小的调度和管理单位&#xff0c;而网络也是 Kubernetes 中最重…

双链表——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰又回来了&#xff0c;到了好久没有更新的数据结构与算法专栏&#xff0c;最近确实发现自己有很多不足&#xff0c;需要学习的内容也有很多&#xff0c;所以之后更新文章可能不会像之前那种一天一篇或者一天两篇啦&…

浅谈 Node.js

Node.js 是什么&#xff1f; Node.js 是一个开源、跨平台的 JavaScript 运行时环境。 官网&#xff1a;https://nodejs.org/zh-cn 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。 Node.js ≠ JavaScript Node.js中&#xff0c;没有BOM和DOM。…

【LLM】LangChain基础使用(构建LLM应用)

note LangChain应用开发框架&#xff0c;支持python和typescript语言&#xff1b;可以帮助生成prompt模板&#xff0c;并通过代理充当其他组件&#xff08;如提示模板、其他大语言模型、外部数据和其他工具&#xff09;的中央接口。LangChain可以直接与 OpenAI 的 text-davinc…

BGW协议(算数共享)

概述 BGW协议可以用于对域上包含加法、乘法、常数乘法门的算术电路求值&#xff0c;此协议强依赖Shamir秘密分享方案&#xff0c;利用其同态特性对各个秘密份额进行适当的处理&#xff0c;就可以在秘密值上进行安全计算。 加法门 算数加法共享&#xff08;两方&#xff09; …

c++ 友元介绍

友元的目的就是让一个函数或类访问另一个函数中的私有成员 友元函数 &#xff08;1&#xff09;普通函数作为友元函数 class 类名{friend 函数返回值类型 友元函数名(形参列表);//这个形参一般是此类的对象.... } 经过以上操作后&#xff0c;友元函数就可以访问此类中的私有…

Vue最新快速上手教程(狂神)

文章目录 前端核心分析1. 第一个Vue程序2. Vue基本语法3. Vue绑定事件4. Vue双向绑定5. 组件讲解6. Axios异步通信7. 计算属性8. 插槽slot9. 自定义事件内容分发10. 第一个vue-cli程序11. webpack学习使用12. vue-router路由13. vueelementUI14. 路由嵌套15. 参数传递及重定向1…

【JAVA】黑马程序员JAVA教程笔记 基础篇 Day 1

常用命令行DOS命令 Path环境变量 用途 1. 可以理解为系统中的一个大管家&#xff0c;记录了很多软件的完整路径。 2. 将常用的软件都交给Path环境变量&#xff0c;便于用命令行打开。 设置步骤 复制要使用的软件的存储地址右键点击 此电脑&#xff0c;打开属性点击 高级系统…

【2023最新】几乎涵盖你需要的Android性能优化的所有操作

前言 现如今&#xff0c;Android开发在市面上的需求不再像以前一样一人难求&#xff0c;僧多认识的情况直接导致整个行业对Android开发岗位的要求越来越高&#xff0c;Android 开发越来越规范&#xff0c;间接导致项目对质量要求的提升。启动优化、内存优化、App 崩溃监控等性…

【网络安全CTF】BUUCTF(Basic篇)

Linux Labs 解题思路&#xff1a;已给用户名密码&#xff0c;直接用ssh工具连接即可获取flag 查找flag在跟下 提交完成。 BUU LFI COURSE 1 访问链接&#xff1a;为php代码审计题&#xff0c;看题目要求构造GET请求读取文件 http://9a7d4988-99f9-4c29-88d8-600e19887723.n…

三极管知识大全

一、三极管的使用 一般可以当做开关管来使用&#xff0c;也可以利用三极管的放大特性&#xff0c;来搭建恒流源&#xff0c;恒压源等等&#xff0c; 三极管当做开关管来使用的话&#xff0c;三极管输出的是高、低、高、低的方波信号 BUCK电源的开关频率在65KHz&#xff0c;也…

【刷题笔记】另类加法+走方格的方案数

一、另类加法 题目&#xff1a; 牛客网链接&#xff1a;另类加法_牛客题霸_牛客网 描述 给定两个int A和B。编写一个函数返回AB的值&#xff0c;但不得使用或其他算数运算符。 测试样例&#xff1a;1&#xff0c;3 返回&#xff1a;4 解析&#xff1a; 因为无法使用算数运算符…

网易云音乐开发--完善video模块

解决多个视频同时播放问题 老样子&#xff0c;npm start开启服务器 说一下问题 现在打开多个视频会让他&#xff0c;同时播放&#xff0c;相当的吵闹。我们只需要一次只有一个视频播放 看文档&#xff0c;我们的思路是点击这个视频&#xff0c;关闭上次视频 我们传入这个id …

shell脚本语言

# 编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 #!/bin/bash# 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 # 杨轩 # myfirstshell.sh # 脚本命令的练习# 2、和当前用户说“hello 用户名” echo "hello xuan"# 3、…

Vue生命周期函数执行顺序(使用注意事项)

文章目录 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed Vue.js 是一个基于 MVVM 模式的前端框架&#xff0c;它的核心是一个响应式的数据绑定系统。在 Vue.js 中&#xff0c;组件是一个可复用的 Vue 实例&#xff0c;它拥有自己的生命周期…

第二章 进程管理

2.1 进程的引入 2.1.1程序的顺序执行 1.程序的顺序执行 程序是人们要计算机完成特定功能的一些指令序列&#xff0c;是一个按严格次序、顺序执行的操作序列&#xff0c;是一个静态的概念。 如&#xff1a;有一个程序&#xff0c;要求先输入数据&#xff0c;再做相应的计算…

platform_get_resource=NULL内核源码分析

platform_get_resourceNULL内核源码分析 文章目录 platform_get_resourceNULL内核源码分析1.第一步&#xff0c;我们看一下什么情况下platform_get_resource函才会返回NULL,也就是没有获取到资源。2.第二步&#xff0c;因为myled这个设节点会转成了platform_device&#xff0c;…