MyBatis

简介: MyBatis

MyBatis

Mybaits 是一个优秀的 持久层 框架, 用于简化 JDBC 开发

简单的说 : Mabatis 是更简单完成程序和数据库交互的框架, 也就是更简单的操作和读取数据库的工具

#{ } & ${ }

#{ } : 预编译 SQL

${ } : 即时 SQL

SQL 的执行流程

  1. 解析语法, 校验 SQL 有没有问题
  2. SQL 优化编译, 制定执行计划
  3. 执行SQL
  1. 性能区别 : 对于预编译 SQL, 在编译一次过后, 会将编译后的 SQL 语句缓存起来, 后面再次执行这条语句时, 不会重新编译 (只是替换参数), 省去了解析优化等过程, 因此可以提高性能
  2. SQL 注入 : 通过操作输入的数据来修改实现定义好的 SQL 语句, 以达到执行代码, 对服务器进行攻击. ${ } 存在 SQL 注入问题, #{ } 可以解决 SQL 注入问题.


${ } 的使用场景

  1. 排序 : select * from user order by id ${ };
  2. 模糊匹配 : like '%${key}%' – 可以使用内置函数 concat( ) 替代
  3. 分库分表传 表名

数据库连接池 – 池化技术

数据库连接池负责分配, 管理, 和释放数据库连接. 它允许应用程序重复使用一个现有的数据库连接, 而不是每次使用都要重新简历, 使用完毕就释放销毁.

作用 :

  1. 减少了网络开销
  2. 资源重用
  3. 提升了系统的性能

MyBatis 默认使用的数据库连接池是 Hikari .

数据库表和类对象的参数匹配

  1. SQL 语句中使用 as 起别名
  2. 结果映射
<resultMap id="userinfoMap" type="com.zrj.mybatisreview.model.UserInfo">
    <id column="id" property="id"></id>
    <result column="delete_flag" property="deleteFlag"></result>
    <result column="create_tiem" property="createTime"></result>
    <result column="update_time" property="updateTime"></result>
</resultMap>

<select id="queryAllUser" resultMap="userinfoMap">
    select * from userinfo
</select>

  1. 配置文件中开启 驼峰命名
    驼峰命名规则 : 表中字段: abc_xyz => 类对象属性 : abcXyz
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰⾃动转换

使用注释, 操作数据库

// 使用该注释获取数据库表中的主键, 并将其传输到 绑定类对象中的 keyProperty 属性中
@Options(useGeneratedKeys = true, keyProperty = "id")
@Select("Insert into user values(null, #{username}, #{password})")
public Integer insertOne(@Param("username") String username,@Param("password") String password);

@Delete("delete from user where id = #{id}")
public Integer delOne(int id);

@Select("select * from user order by id desc")
public List<User> selectAll();

@Update("update user set username = #{username} where id = #{id}")
public Integer updateOne(@Param("id") int id, @Param("username") String username);

使用 xml 文件, 操作数据库

<resultMap id="userinfoMap" type="com.zrj.mybatisreview.model.UserInfo">
  <id column="id" property="id"></id>
  <result column="delete_flag" property="deleteFlag"></result>
  <result column="create_tiem" property="createTime"></result>
  <result column="update_time" property="updateTime"></result>
</resultMap>

<select id="queryAllUser" resultMap="userinfoMap">
    select * from userinfo
</select>

<insert id="insertUserInfo" useGeneratedKeys="true" keyProperty="userinfo.id">
    insert into userinfo(username, password, age, gender, phone)
    values(#{userinfo.username}, #{userinfo.password},
    #{userinfo.age}, #{userinfo.gender},
    #{userinfo.phone})
</insert>

<update id="updateOne">
    update userinfo set username = #{username} where id = #{id}
</update>

<delete id="delOne">
    delete from user where id = #{id}
</delete>

Mybatis 中动态标签


< if > 标签

<select id="one">
    select
        (username, password,
        <if test="age != 0">
            age,
        </if>
        gender, phone)
    from user where id = #{id}
</select>


< trim > 标签

理论上其他标签都可以使用 trim 标签实现

<insert id="three" useGeneratedKeys="true" keyProperty="userinfo.id">
    insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides="," prefixOverrides=",">
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                `password`,
            </if>
        </trim>
    values
        <trim prefix="(" suffix=")" suffixOverrides="," prefixOverrides=",">
            <if test="username != null">
                #{username},
            </if>
            <if test="password != null">
                #{password},
            </if>
        </trim>
</insert>


< where > 标签

< where > 标签能够自动去除子句开头的 AND 或者 OR

< where > 只会在子元素有内容的情况下才插入 where 子句

<select id="two">
  select (username, password, age, gender, phone)
  from user
    <where>
      <if test="id != null">
        and id = #{id}
      </if>
      <if test="username != null">
        and `username` = #{username}
      </if>
      <if test="password != null">
        and `password` = #{password}
      </if>
   </where>
</select>

< set > 标签

< set > 标签能够自动删除 额外的逗号

<update id="four">
    update userinfo 
    <set>
        <if test="username != null">
            username = #{username} ,
        </if>

        <if test="password != null">
            `password` = #{password},
        </if>
    </set>
    where id = 1
</update>

< foreach > 标签

<delete id="five">
    delete from user where id in
    <foreach collection="ids" open="(" close=")" separator="," item="e" >
        #{e}
    </foreach>
</delete>



< sql > 标签 & < include > 标签

< sql > 标签 : 定义可重用代码片段

< include > 标签 : 通过 refid 属性, 绑定要包含的代码片段

<select id="six1">
    select username, password, age, gender, phone
    from user
</select>

<sql id="e">
    username, password, age, gender, phone
</sql>

<select id="six2">
    select (
    <include refid="e"></include>
    )
    from user
</select>

目录
相关文章
|
缓存 监控 数据可视化
linux查看内存信息
在Linux中检查内存使用:`free -h`或`-m`显示简洁内存统计;`cat /proc/meminfo`获取详细信息;`top`或`htop`(如果安装)实时监控进程内存占用;`vmstat`查看虚拟内存统计;`sar -r`(需要sysstat)报告系统内存活动。图形工具如Gnome System Monitor提供可视化界面。
1640 4
|
2月前
|
存储 人工智能 API
差生文具多?我给自己改造了一款AI周计划工具
WeekToDo是一款免费开源的极简每周计划应用,核心理念就三个词:**极简、本地、周视图**。 它有这些特点: - **以周为单位**:不是日视图那种碎片化视角,而是让你从整周的高度规划时间 - **数据在本地**:所有任务存在浏览器或本地存储,不经过任何云端服务器 - **跨平台**:Web版、Windows、Mac、Linux全支持 - **功能刚刚好**:待办列表、子任务、拖拽排序、任务颜色、循环任务、Markdown支持
487 0
 差生文具多?我给自己改造了一款AI周计划工具
|
2月前
|
人工智能 JSON JavaScript
开发者指南:如何高效导出豆包AI对话记录并进行智能体数据迁移
本文探讨了将豆包AI对话记录完整导出的技术思路,分析了DOM渲染机制带来的挑战,并介绍了浏览器脚本、自动化框架、浏览器扩展等实现路径。重点说明了数据预加载、格式化与JSON/Markdown导出的通用流程,以及导出数据在模型微调、跨平台迁移中的后续利用方法,同时强调了数据安全与合规使用注意事项。
|
9月前
|
人工智能 运维 自然语言处理
别让 LLM 变成“甩锅发动机”——从安全、审计、隐私聊聊运维智能助手怎么落地
别让 LLM 变成“甩锅发动机”——从安全、审计、隐私聊聊运维智能助手怎么落地
694 117
|
人工智能 测试技术 API
Apifox 和 Apipost如何选?2025企业API开发工具选型需求分析及建议
本文对比了 Apipost 与 Apifox 在 AI 功能及 API 功能上的差异,指出 Apipost 凭借 AI 一键补全文档、智能提取 API 文档、AI 断言、模拟测试数据、生成用例、参数更新、脚本生成、全局搜索等能力,显著提升开发效率与质量。同时,Apipost 在离线使用、一键分享、OpenAPI 格式支持、多协议适配、数据库导入、模拟数据、压测功能等基础 API 能力上亦全面领先。在AI时代的2025年,API + AI是Apipost将AI技术融合行业应用的最佳典范,这种趋势下,也说明Apipost 更能助力企业与开发者实现高效智能开发。
653 2
|
9月前
|
Kubernetes 负载均衡 网络协议
裸机 Kubernetes 负载均衡全景:从 MetalLB、Service 到 Ingress,再到云厂商实现原理
本文系统解析裸机Kubernetes中MetalLB、Service与Ingress的协作机制,深入剖析LoadBalancer实现原理,对比云厂商方案,揭示高可用、IP稳定与网络分层真相,助你构建媲美公有云的生产级流量入口体系。
|
9月前
|
程序员 编译器 C#
蓝易云:C#语言中使用"using"关键字的介绍
以上就是 C# 中 "using" 关键字的主要用法。了解并熟练应用这个关键字,对于提高代码质量、解决命名冲突、管理资源都有着重要的作用。它是 C# 编程中不可或缺的一部分,无论是对初学者还是有经验的开发者而言,掌握它都是提高编写高效、清晰、可维护代码的关键。
200 1
|
存储 分布式计算 NoSQL
Facebook内部都在用的存储引擎,LSM凭什么能硬扛亿级写入流量?
RocksDB是Meta开源的高性能键值存储引擎,基于LSM树设计,专为高吞吐写入场景优化。其核心包括内存表MemTable、持久化SSTable、预写日志WAL及合并机制,适用于海量数据处理。
520 0
|
存储 中间件 程序员
一文晓得SaaS、IaaS和 PaaS 是什么,三者的区别是?
一文晓得SaaS、IaaS和 PaaS 是什么,三者的区别是?
11355 0
|
机器学习/深度学习 存储 Java
Java 大视界 -- Java 大数据机器学习模型在游戏用户行为分析与游戏平衡优化中的应用(190)
本文探讨了Java大数据与机器学习模型在游戏用户行为分析及游戏平衡优化中的应用。通过数据采集、预处理与聚类分析,开发者可深入洞察玩家行为特征,构建个性化运营策略。同时,利用回归模型优化游戏数值与付费机制,提升游戏公平性与用户体验。