MyBatis学习简要

news2024/11/23 2:55:09

目录

 什么是MyBatis?

MyBatis实现的设想

MyBatis基于配置文件的开发步骤

mybatis的配置文件

Mapper代理开发

配置文件完成增删改查的三步

注解开发

一、条件查询

参数接收时,参数的设置:

动态条件查询:

二、添加功能

 步骤:

Mybatis事务:

返回添加数据的主键:

三、修改功能

四、删除功能

 参数传递

单个参数:

多个参数

mybatis常见问题


学习资料:

 01-MyBatis简介_哔哩哔哩_bilibili

 什么是MyBatis?

  • MyBatis是一款持久层框架
  • MyBatis是半自动的ORM框架,开发时,需要手动编写SQL语句
  • 相比JDBC,MyBatis提供了输入映射和输出映射,便于进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提高了开发的效率。

MyBatis实现的设想

  • 使用数据库连接池管理数据库连接
  • 将sql语句及占位符号和参数全部配置在xml中
  • 将查询的结果集自动映射成java对象 

MyBatis基于配置文件的开发步骤

  • 编写全局配置文件configuration
  • 编写mapper映射文件,mapper.xml,书写SQL,并定义好SQL的输入、输出参数
  • 加载全局配置文件,生成SqlSessionFactory
  • 创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作

优点:

  • 相较于基于注解的开发,用配置文件更方便后续代码的维护

mybatis的配置文件

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAllases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
      • databaseIdProvider(数据库厂商标识)
      • mappers(映射器)
<configuration>
	<!--全局配置文件的配置顺序如下
     properties  //引入放置了数据源信息的properties文件

     settings //用来开启或关闭mybatis的一些特性

     typeAliases     //配置SQL语句的输入、输出参数细节要求等

     typeHandlers    //用来处理java类型和jdbc类型之间的转换

     objectFactory    //用于创建对象实例,用得少

     plugins    //用来配置mybatis的插件

     environments    //用来配置数据源
        environment
            transactionManager
            dataSource

     mappers
     -->
</configuration>

Mapper代理开发

  • 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。接口和配置文件分开放,但包目录结构是一样的
  • 设置SQL映射文件中的namespace属性为Mapper接口全限定名
  • 在Mapper接口中定义方法,方法名就是SQL映射文件中的sql语句中的id,并保持参数类型和返回值类型一致
  • 编码:
    • 通过SqlSession的getMapper方法获取Mapper接口的代理对象
    • 调用对应方法完成sql的执行
    • //获取接口代理对象
      UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
      //执行方法,即执行sql语句
      List<User> users=userMapper.selectAll();

配置文件完成增删改查的三步

  1. 编写接口方法
  2. 编写SQL
  3. 执行方法

注解开发

  • 注解用于完成简单功能;配置文件用于完成复杂功能
  • 常用注解:
    • 查询:@Select
    • 添加:@Insert
    • 修改:@Update
    • 删除: @Delete
  • @Select("select * from tb_user where id=#{id}")
    public User selectById(int id);
    //不用写xml文件了

一、条件查询

  • 参数接收时,参数的设置:

    1. 散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称")
    2. 对象参数:对象的属性名称要和参数占位符名称一致
    3. map集合:SQL中的参数名要和map集合的键的名称一致
  • 动态条件查询:

    1. if:用于判断参数是否有值
    2. test:逻辑表达式,进行条件判断
    3. 存在的问题:由于条件数目变化,where可能会和and连接,构成语句错误
      1. 解决法一:使用恒等式
      2. 解决法二:使用<where>标签替换where关键字

二、添加功能

  •  步骤:

    • 1、编写接口方法:Mapper接口
      • void add(Brand brand);
    • 2、编写SQL语句:SQL映射文件
      • <insert id="add">
            insert into tb_brand(brand_name,company_name,ordered,description,status)
            values(#{brandName},#{companyName},#{ordered},#{description},#{status});
        </insert>
    • 3、执行方法,测试
  • Mybatis事务:

    • 1、openSession():默认开启事务,需要使用sqlSession.commit();手动提交事务
    • 2、openSession(true):自动提交事务
  • 返回添加数据的主键:

    • 1、添加两个属性
    •  2、。。。

三、修改功能

  • 普通修改和动态修改 
  • 步骤:
    • 1、编写接口方法:Mapper接口
      • void update(Brand brand);
    • 2、编写SQL语句:SQL映射文件
      • <update id="update">
             update tb_brand;
                <set>
                    <if test="brandName !=null and brandName !=''">
                        brand_name=#{brandName},
                    </if>
                    <if test="companyName !=null and companyName !=''">
                        companyName=#{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>
    • 3、执行方法,测试

四、删除功能

  • 删除单个和批量删除
  •  步骤:
    • 1、编写接口方法:Mapper接口
      • void deleteByIds(@Param("ids") int[] ids);
        
    • 2、编写SQL语句:SQL映射文件
      • <delete id="deleteByIds">
                delete from tb_brand
                where id in (
                    <foreach collection="ids" item="id" separator=",">
                        #{id}
                    </foreach>
                );
        </delete>
        <!--
        mybatis会将数组参数封装为一个Map集合,所以需要foreach来遍历
            1、默认:array=数组 
            2、使用@Param注解来改变map集合的默认key的名称
        -->
    • 3、执行方法、测试

 参数传递

  • Mybatis接口方法对 接收到的不同的参数 用ParamNameResolver类 进行 不同的封装处理
    • 单个参数:

      • 1、POJO类型:直接使用,属性名和参数占位符名称一致
      • 2、Map集合:直接使用,键名和参数占位符名称一致
      • 3、Collection:封装成Map集合
        • map.put("arg0",collection集合);
        • map.put("collection",collection集合);
      • 4、List:封装成Map集合
        • map.put("arg0",list集合);
        • map.put("collection",list集合);
        • map.put("list",list集合);
      • 5、Array:封装成Map集合
        • map.put("arg0",数组);
        • map.put("array",数组);
      • 6、其他类型
    • 多个参数

      • 封装成Map集合

        • User select(@Param("username")String username,String password);
          

          封装成Map集合后,建议使用@Param注解,替换Map集合中默认的键名,并使用修改后的名称来获取值,提高可读性

mybatis常见问题

  • SQL映射文件的警告,无法识别表信息
    • 解决:在idea中配置mysql数据库连接
  • 实体类属性名和数据库表列名不一致,不能自动封装数据
    • 解决:使用<resultMap>
  • 使用参数占位符${}时,会存在sql注入问题
    • 解决:使用#{}
  • SQL语句中的特殊字符报错,比如"<"
    • 解决:使用转义字符,比如"&lt"表示"<"

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

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

相关文章

Eclipse打jar包与JavaDOC文档的生成

补充知识点——Eclipse打jar包与JavaDOC文档的生成 1、Eclipse如何打jar包&#xff0c;如何运行jar包 Java当中编写的Java代码&#xff0c;Java类、方法、接口这些东西就是项目中相关内容&#xff0c;到时候我们需要把代码提供给甲方、或者是我们需要运行我们编写的代码&…

《2023年网信人才培训-网络安全从业人员能力素养提升培训》第一期成功举办

随着网络强国和数字中国建设的步伐加快&#xff0c;建设规模宏大、结构合理、素质优良的人才队伍成为一项重要工作。知了汇智作为数字产教融合基地&#xff0c;通过与高校、企业等多方合作&#xff0c;建立了完整的网络安全人才培养生态链。凭借自身技术优势和丰富的产业资源&a…

【Go 基础篇】探索Go语言中的Map:数据的魔法盒子

嗨&#xff0c;各位Go语言的探索者们&#xff01;在我们的编程世界中&#xff0c;总会有一些特殊的工具能够让我们的生活变得更加便捷。而在Go语言中&#xff0c;Map就是这样一种神奇的数据结构。它就像是一个魔法盒子&#xff0c;可以帮助我们高效地存储和操作键值对数据。本文…

python技术栈之单元测试中mock的使用

什么是mock&#xff1f; mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试&#xff0c;需要虚拟某些特定对象以便测试…

Spring(九)声明式事务

Spring整合Junit4和JdbcTemplater如下所示&#xff1a; 我们所使用的junit的jar包不同&#xff0c;可以整合不同版本的junit。 我们导入的依赖如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.a…

SAP_ABAP_DEBUG_场景介绍

SAP ABAP顾问能力模型_企业数字化建设者的博客-CSDN博客SAP Abap顾问能力模型https://blog.csdn.net/java_zhong1990/article/details/132469977一 背景说明 二 场景说明 1 SAPerp与第三方系统集成&#xff0c;第三系统通过接口函数请求SAP系统&#xff0c;如何调试&#xff1…

加密的PDF文件,如何解密?

PDF文件带有打开密码、限制编辑&#xff0c;这两种密码设置了之后如何解密&#xff1f; 不管是打开密码或者是限制编辑&#xff0c;在知道密码的情况下&#xff0c;解密PDF密码&#xff0c;我们只需要在PDF编辑器中打开文件 – 属性 – 安全&#xff0c;将权限状态修改为无保护…

使用Angular和MongoDB来构建具有登录功能的博客应用程序

Angular 是一个一站式框架&#xff0c;用于使用相同的可重用代码创建移动和 Web 应用程序。使用 Angular&#xff0c;您可以将整个应用程序划分为可重用的组件&#xff0c;从而更轻松地维护和重用代码。 在本教程系列中&#xff0c;您将学习如何开始使用 Angular 和 MongoDB 作…

JVM 判定对象是否死亡的两种方式

引用计数法&#xff1a;&#xff08;脑门刻字法&#xff09;和 可达性分析 引用计数算法 引用计数器的算法是这样的&#xff1a;在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一…

实用的面试经验分享:程序员们谈论他们的面试历程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

R语言常用数组函数

目录 1.array 2.matrix 3.data.matrix 4.lower.tri 5.mat.or.vec 6.t:转置矩阵 7.cbind 8.rbind 9.diag 10.aperm&#xff1a;对数组进行轴置换&#xff08;维度重排&#xff09;操作 11.%*%&#xff1a;乘法操作要求矩阵 A 的列数等于矩阵 B 的行数 12.crossprod…

基于梯度算法优化的BP神经网络(预测应用) - 附代码

基于梯度算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于梯度算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.梯度优化BP神经网络2.1 BP神经网络参数设置2.2 梯度算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

计算机组成原理之数据的表示和运算(一)

目录 一、引言二、进位计数制2.1 十进制计数法2.2 二进制2.3 八进制2.4 十六进制2.5 进制转换&#xff1a;二进制、八进制、十六进制、十进制之间的转换2.5.1 任意进制到十进制转换2.5.2 二进制与八进制和十六进制如何进行互相转换&#xff1f;2.5.3 十进制到任意进制的转换 2.…

layui框架学习(42:文件上传模块-上)

之前学习asp.net core编程入门教程时结合layui测试过文件上传《基于ASP.Net Core和Layui的多文件上传》&#xff0c;但没有认真学习过layui的文件上传模块&#xff0c;本文开始&#xff0c;计划分两章学习并记录文件上传模块中的属性、事件及函数的使用方法。   layui中的文件…

1.1 数据库系统简介

1.1.数据库系统简介 前言&#xff1a; 数据库系统是一个软件系统&#xff0c;用于管理和操作数据库。它提供了一个组织良好、高效并能够方便存取的数据存储机制&#xff0c;并且能够支持各种数据操作、事务管理、并发控制和恢复功能。以下是数据库系统的一些主要特点和组件&a…

redis缓存雪崩、穿透、击穿解决方案

redis缓存雪崩、穿透、击穿解决方案 背景缓存雪崩缓存击穿缓存穿透总结背景 关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机…

xsschallenge1~13通关详细教程

文章目录 XSS 挑战靶场通关level1level2level3level4level5level6level7level8level9level10level11level12level13 XSS 挑战靶场通关 level1 通过观察发现这个用户信息可以修改 那么我们直接输入攻击代码 <script>alert(/wuhu/)</script>弹框如下&#xff1a; …

烟花厂人员作业释放静电行为检测算法

烟花厂人员作业释放静电行为检测算法通过pythonyolo系列算法模型框架&#xff0c;烟花厂人员作业释放静电行为检测算法在工厂车间入口处能够及时捕捉到人员是否触摸静电释放仪。一旦检测到人员进入时没有触摸静电释放仪&#xff0c;系统将自动触发告警。Python是一种由Guido va…

第 1 章 绪论(计算多项式)

示例代码 1&#xff1a; /* 计算 1 - 1 / x 1 / x * x - ... */#include <stdio.h> #include <sys/timeb.h>int main(void) {double x;int n;printf("Please input x and n: ");scanf_s("%lf%d", &x, &n);struct timeb t1;ftime(&…

2023.8.27 关于 Junit5 详解

目录 引言 注解 断言 用例的执行顺序 参数化 测试套件 引言 Junit 是一个基于Java语言的单元测试框架Selenium 是一个用于Web应用程序测试的自动化测试框架结合二者能让我们的 Web自动化测试 更加完善和全面 注意&#xff1a; 本文所讲的内容&#xff0c;均基于以下依…