MyBatis框架基础

news2024/11/17 16:03:38

文章目录

  • 1 MyBatis概述
  • 2 MyBatis入门
    • 2.1 相关依赖
    • 2.2 properties配置文件
    • 2.3 预编译SQL
  • 3 基本操作
    • 3.1 新增操作
    • 3.2 删除操作
    • 3.3 更新操作
    • 3.4 查询操作
  • 4 动态SQL
    • 4.1 XML映射文件
    • 4.2 if/set/where标签
    • 4.3 foreach标签
    • 4.4 sql/include标签
  • 5 参考资料


1 MyBatis概述

MyBatis是一款优秀的持久层(即数据访问层)框架,它支持定制化SQL、存储过程避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java对象映射成数据库中的记录。

官网:https://mybatis.org/mybatis-3/zh/index.html


2 MyBatis入门

2.1 相关依赖

创建Spring Boot工程,并导入MyBatis Framework、MySQL Driver。

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Lombok工具包:通过注解的形式自动生成构造器、getter、setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。

  1. @Data = @Getter + @Setter + @ToString + @EqualsAndHashCode:为所有的属性提供get方法、set方法,生成易阅读的 toString 方法,自动重写 equals 方法和 hashCode 方法。

  2. @NoArgsConstructor:为实体类生成无参的构造器方法。

  3. @AllArgsConstructor:为实体类生成除了static修饰的字段之外带有各参数的构造器方法。

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2.2 properties配置文件

在Spring Boot项目中,可以编写application.properties文件配置数据库连接信息,包括driver-class-name、url 、username,password。同时可以根据需要进行其他配置。

# 数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234

# 将MyBatis日志输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# 自动将下划线命名的字段名按驼峰命名规则映射
mybatis.configuration.map-underscore-to-camel-case=true

2.3 预编译SQL

编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译,只是输入的参数不同。同时能将敏感字进行转义,保障SQL的安全性,防止SQL注入。

在Mybatis中提供的参数占位符有两种:${…} 、#{…}

  1. #{…}:执行SQL时,会将#{…}替换为 ? ? ?,生成预编译SQL,会自动设置参数值,一般用于参数传递,项目开发中更推荐使用。

  2. ${…}:拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题,如果对表名、列表进行动态设置时使用。


3 基本操作

3.1 新增操作

@Mapper注解:MyBatis框架中的注解,用于标注数据访问层的接口。

@Insert注解:用于编写INSERT操作的SQL语句。

@Options注解:可以用于设置缓存时间或为对象生成自增的主键值。

@Mapper
public interface EmpMapper {
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("INSERT INTO emp(username, name, gender, job, entry_date, dept_id, create_time, update_time) "
            +"VALUES(#{username},#{name},#{gender},#{job},#{entryDate},#{dept},#{createTime},#{updateTime})")
    void insertEmp(Emp emp);
}

3.2 删除操作

@Delete注解:用于编写DELETE操作的SQL语句。

@Mapper
public interface EmpMapper {
    @Delete("DELETE FROM emp WHERE id=#{id}")
    void deleteEmpById(Integer id);
}

3.3 更新操作

@Update注解:用于编写UPDATE操作的SQL语句。

@Mapper
public interface EmpMapper {
    @Update("UPDATE emp SET username=#{username},name=#{name},image=#{image},update_time=#{updateTime} WHERE id=#{id}")
    void updateEmp(Emp emp);
}

3.4 查询操作

@Select注解:

@Mapper
public interface EmpMapper {
    @Select("SELECT id, username, password, name, gender, image, job, entry_date, dept_id, create_time, update_time FROM emp WHERE id=#{id}")
    Emp selectEmpById(Integer id);
}

4 动态SQL

4.1 XML映射文件

实现复杂的SQL功能,建议使用XML来配置映射语句,在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

  1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在Resource中相同包下;

  2. XML映射文件的namespace属性为Mapper接口全限定名一致;

  3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

在这里插入图片描述

4.2 if/set/where标签

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

<if test="条件表达式">
    要拼接的sql语句
</if>

<where>:只会在子元素有内容的情况下才插入WHERE子句,而且会自动去除子句的开头的AND或OR。

<set>:动态的在SQL语句中插入SET关键字,并会删掉额外的逗号。

EmpMapper.java

@Mapper
public interface EmpMapper {
    void updateEmp2(Emp emp);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.EmpMapper">

    <update id="updateEmp2">
        UPDATE emp
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="image!=null">
                image=#{image},
            </if>
            <if test="updateTime!=null">
                update_time=#{updateTime}
            </if>
            WHERE id=#{id}
        </set>
    </update>

</mapper>

4.3 foreach标签

<foreach>:遍历集合内的参数并进行拼接。

<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" 
         open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>

EmpMapper.java

@Mapper
public interface EmpMapper {
    void deleteEmpByIds(List<Integer> ids);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.EmpMapper">

    <delete id="deleteEmpByIds">
        DELETE FROM emp WHERE id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

</mapper>

4.4 sql/include标签

<sql>:定义可重用的SQL片段。

<include>:通过属性refid,指定包含的SQL片段。

EmpMapper.java

@Mapper
public interface EmpMapper {
    void updateEmp2(Emp emp);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.EmpMapper">

    <sql id="commonSelect">
        SELECT id, username, password, name, gender, image, job, entry_date, dept_id, create_time, update_time
        FROM emp
    </sql>

    <select id="selectEmpByCondition" resultType="com.example.pojo.Emp">
        <include refid="commonSelect"/>
        <where>
            <if test="name!=null">
                name LIKE CONCAT('%',#{name},'%')
            </if>
            <if test="gender!=null">
                AND gender=#{gender}
            </if>
            <if test="begin!=null and end!=null">
                AND entry_date BETWEEN #{begin} AND #{end}
            </if>
            ORDER BY update_time DESC
        </where>
    </select>

</mapper>

5 参考资料

黑马程序员JavaWeb开发教程-bilibili

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

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

相关文章

入侵检测系统(IDS)

入侵检测 入侵检测&#xff08;Intrusion Detection&#xff09;是指发现或确定入侵行为存在或出现的动作&#xff0c;也就是发现、跟踪并记录计算机系统或计算机网络中的非授权行为&#xff0c;或发现并调查系统中可能为视图入侵或病毒感染所带来的异常活动。 入侵检测系统 …

XL5300 dTOF测距模块 加镜头后可达7.6米测距距离 ±4%测距精度

XL5300 直接飞行时间&#xff08;dToF&#xff09;传感器是一个整体方案dTOF 模组&#xff0c;应用设计简单。片内集成了单光子雪崩二极管&#xff08;SPAD&#xff09;接收阵列以及VCSEL激光发射器。利用自主研发的 SPAD 和独特的ToF 采集与处理技术&#xff0c;XL5300模块可实…

NV-Embed论文阅读笔记

这是NVIDIA的一篇论文&#xff0c;LLM通常使用的是GPT的decoder范式作为一个生成模型&#xff0c;文章探讨如何利用这样的decoder生成模型来实现BERT这样的encoder的功能&#xff0c;即提取有效的embedding。现有的方法提取embedding的方式无非是 1 mean pooling&#xff1b; 2…

无线领夹麦克风哪个牌子好用?一文揭秘哪种领夹麦性价比最高!

​无线领夹麦克风&#xff0c;无疑是现代音频技术的杰出代表。它摆脱了传统有线麦克风的束缚&#xff0c;让声音的传播更加自由、灵活。无论是追求极致音质的音乐爱好者&#xff0c;还是需要高效沟通的商务人士&#xff0c;无线领夹麦克风都能满足你的需求&#xff0c;让你的声…

HarmonyOS 角落里的知识 —— 状态管理

一、前言 在探索 HarmonyOS 的过程中&#xff0c;我们发现了许多有趣且实用的功能和特性。有些总是在不经意间或者触类旁通的找到。或者是某些开发痛点。其中&#xff0c;状态管理是ArkUI开发非常核心的一个东西&#xff0c;我们进行了大量的使用和测试遇到了许多奇奇怪怪的问…

AD层次原理图绘制

一、在原理图中添加端口 二、添加层次图 三、更新层次图 四、也可以先画层次图&#xff0c;再绘制原理图&#xff0c;这里就不做演示了

天地图 uniapp使用笔记

官网地址&#xff1a;天地图API 效果&#xff1a; <template><view><!-- 显示地图的DOM节点 --><view id"container" class"content"></view><!-- END --><!-- 数据显示 --><h3>城市名称(IP属地)&#x…

关于归一化能量与归一化功率(连续与离散+1)

前言&#xff1a; ① 周期信号 与 直流信号 都是功率信号 ②一个信号可以既不是能量信号也不是功率信号&#xff0c;但不可能既是能量信号又是功率信号 归一化能量 对于一个连续时间信号 ( x(t) )&#xff0c;归一化能量 ( E ) 的定义为&#xff1a; E lim ⁡ T → ∞ ∫ −…

某宝APP参数通过SDK把APP参数转URL参数链接方法

app里参数无法在电脑端或者在没有XX宝的手机里支付, 所以需要转成H5参数进行代付操作 出某xx宝 支付sdk转h5链接方式算法

苹果不会等到明年才对 Siri 进行改进|TodayAI

据彭博社报道&#xff0c;今年苹果&#xff08;APPLE&#xff09;将推出一个更令人满意的 Siri。 当 iOS 18 今年秋季推出时&#xff0c;Siri 的功能不仅仅是让你的 iPhone 边缘显示彩虹光环。虽然苹果智能功能要到 2025 年才会向非测试版用户推出&#xff0c;但据报道&#x…

工作人员能从轧钢测径仪上获取哪些有效信息?

轧钢测径仪安装在轧钢生产线中&#xff0c;无论是热轧还是冷轧&#xff0c;都不能阻挡测径仪的高速无损高精检测。它采用八轴测量系统&#xff0c;能全方位检测外径尺寸&#xff0c;并且配备了测控软件系统&#xff0c;为工作人员提供更加丰富的产线信息。 普通轧钢测径仪能获…

跨境电商必备?揭秘原生IP的作用

一、什么是原生IP&#xff1f; 原生IP&#xff08;Native IP&#xff09;是指由互联网服务提供商&#xff08;ISP&#xff09;或服务器提供商直接分配给用户的IP地址&#xff0c;这种IP地址直接与用户设备或网络相连&#xff0c;也就是指这个IP的注册地址和服务器机房所在的国…

自养号补单:Shopee,Lazada等东南亚电商卖家销量提升的必备技能

在东南亚电商跨境平台中、lazada、shopee是东南亚地区最大的在线购物网站&#xff0c;其目标主要是印地&#xff0c;马来&#xff0c;台湾&#xff0c;菲律宾&#xff0c;新加坡&#xff0c;泰国和越南等用户。而自养号补单作为一种有效的推广手段&#xff0c;正逐渐被越来越多…

安防监控视频平台LntonAIServer视频智能分析平台烟火检测

LntonAIServer烟火检测技术是一种先进的技术&#xff0c;它结合了人工智能的强大能力&#xff0c;专门用于识别和检测烟雾或火焰的存在。这种技术在现代社会的许多领域中都发挥着至关重要的作用&#xff0c;尤其是在安全监控和火警预警系统等关键领域&#xff0c;它的应用更是不…

【PL理论】(33) 类型系统:推导树证明 φ ⊢ e∶t | 继续定义关系:γ ⊢ e∶t

&#x1f4ac; 写在前面&#xff1a;本章我们将讲解推导树证明&#xff0c;推导树实际上就是推理规则的应用。只要学会如何选择并应用适当的推理规则&#xff0c;证明就不是难事了。 目录 0x00 推导树证明 &#x1d753; ⊢ &#x1d486; ∶ &#x1d495; 0x01 继续定义关…

瑞数信息入选IDC《中国WAAP厂商技术能力评估,2024》

5星满分&#xff1a;WAF、Bot流量管理、行业应用等评估维度 日前&#xff0c;全球领先的IT市场研究和咨询公司IDC发布《中国WAAP厂商技术能力评估&#xff0c;2024》。报告聚焦WAAP能力&#xff0c;通过对中国市场中主要WAAP产品提供商的技术评估以及对大量最终用户的客观访谈…

深入了解 Android 中的 ViewStub

在 Android 开发中&#xff0c;性能优化一直是一个重要的话题。ViewStub 作为一种轻量级视图容器&#xff0c;可以帮助我们在合适的时机延迟加载视图&#xff0c;从而优化应用性能。本文将详细介绍 ViewStub 的概念、使用方法以及在实际开发中的应用场景。 什么是 ViewStub&am…

rollup学习笔记

一直使用的webpack,最近突然想了解下rollup,就花点时间学习下. 一,什么是rollup? rollup 是一个 JavaScript 模块打包器&#xff0c;可以将小块代码编译成大块复杂的代码,比如我们的es6模块化代码,它就可以进行tree shaking,将无用代码进行清除,打包出精简可运行的代码包. 业…

uniapp 微信小程序自定义分享图片

场景&#xff1a;微信小程序用户&#xff0c;点击小程序里商品的分享按钮时&#xff0c;想要不同的商品展示不用的分享内容&#xff0c;比如分享图片上展示商品的图片、价格等信息。分享的UI图如下&#xff1a; 实现方法&#xff1a; 1. 分享按钮&#xff1a;<button open-…

朋友圈新功能:实现定时发圈,自动跟圈

1.多号同时发圈 可以选择多个号同时发圈&#xff0c;提高工作效率。 2.定时发布 可以一次性设置完很多天的朋友圈&#xff0c;选好发送时间就可以解放双手。 3.一键转发 点击转发&#xff0c;可直接跳转到编辑页面。无需复制粘贴。 4.自动转发&#xff08;跟圈&#xff09; …