知识点:

MyBatis 语法概览

MyBatis 是一个强大的数据持久化框架,它提供了一种半自动化的 ORM 实现方式。通过 MyBatis,开发者可以通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

基本查询语句

在 MyBatis 中,基本的查询语句使用 <select> 标签定义。例如,以下是一个简单的查询语句:

<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>

这个语句被称为 selectPerson,接受一个 int 类型的参数,并返回一个 HashMap 类型的对象。

参数和结果映射

MyBatis 允许使用 #{} 和 ${} 两种方式获取参数值。其中 #{} 是预处理语句参数(如 JDBC 的 ?),而 ${} 是直接进行字符串替换。使用 #{} 可以有效防止 SQL 注入。

动态 SQL

MyBatis 支持动态 SQL,这意味着 SQL 语句可以根据传入的参数动态变化。例如,使用 <if> 标签可以根据条件包含不同的 SQL 片段:

<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>

在这个例子中,如果 title 参数不为 null,则会包含一个按标题进行模糊查询的条件。

高级结果映射

MyBatis 的 <resultMap> 元素提供了高级结果映射功能。它允许开发者定义如何从数据库结果集中加载对象,这是 MyBatis 最强大的特性之一。

缓存

MyBatis 提供了强大的缓存功能,可以通过简单地在映射文件中添加 <cache> 标签来启用二级缓存。

总结

MyBatis 通过简化 SQL 操作和提供动态 SQL 功能,使得数据库操作变得更加灵活和强大。它的高级映射功能和缓存机制也为开发者提供了更多的便利。

代码:

import com.alibaba.fastjson2.util.DateUtils;
import org.apache.commons.lang3.ObjectUtils; import java.util.Date; public interface BaseService { default Query query() {
return new Query();
} default Update update() {
return new Update();
} default Insert insert() {
return new Insert();
} static String value(Object value) {
if (ObjectUtils.isEmpty(value)) {
return " NULL ";
}
if (value instanceof Date) {
return "'" + DateUtils.format((Date) value, "yyyy-MM-dd HH:mm:ss") + "'";
}
if (value instanceof String) {
return "'" + value + "'";
}
if (value instanceof Number) {
return value.toString();
}
throw new RuntimeException("无法解析的字段 :" + value);
} class Insert {
StringBuilder sqlBuilder = new StringBuilder();
StringBuilder inertFieldBuilder = new StringBuilder();
StringBuilder inertValueBuilder = new StringBuilder(); public Insert set(String column, Object value) {
if (inertFieldBuilder.length() > 0) inertFieldBuilder.append(" , ");
inertFieldBuilder.append(column);
if (inertValueBuilder.length() > 0) inertValueBuilder.append(" , ");
inertValueBuilder.append(" ");
inertValueBuilder.append(value(value));
inertValueBuilder.append(" ");
return this;
} public String toString() {
if (inertFieldBuilder.length() > 0 && inertValueBuilder.length() > 0) {
sqlBuilder.append(" ( ");
sqlBuilder.append(inertFieldBuilder.toString());
sqlBuilder.append(" ) ");
sqlBuilder.append(" VALUES( ");
sqlBuilder.append(inertValueBuilder.toString());
sqlBuilder.append(" ) ");
}
return sqlBuilder.toString();
}
} class Update {
StringBuilder sqlBuilder = new StringBuilder();
StringBuilder updateBuilder = new StringBuilder(); public Update set(String column, Object value) {
if (updateBuilder.length() > 0) updateBuilder.append(" , ");
updateBuilder.append(" ");
updateBuilder.append(column);
updateBuilder.append(" = ");
updateBuilder.append(value(value));
updateBuilder.append(" ");
return this;
} public String toString() {
if (updateBuilder.length() > 0) {
sqlBuilder.append(updateBuilder.toString());
}
return sqlBuilder.toString();
}
} class Query {
StringBuilder whereBuilder = new StringBuilder();
StringBuilder sqlBuilder = new StringBuilder(); public Query eq(String column, Object value) {
if (ObjectUtils.isEmpty(value)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append(" ");
whereBuilder.append(column);
whereBuilder.append(" = ");
whereBuilder.append(value(value));
whereBuilder.append(" ");
return this;
} public Query or(String column, Object value) {
if (ObjectUtils.isEmpty(value)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" OR ");
whereBuilder.append(" ");
whereBuilder.append(column);
whereBuilder.append(" = ");
whereBuilder.append(value(value));
whereBuilder.append(" ");
return this;
} public Query like(String column, String value) {
if (ObjectUtils.isEmpty(value)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append(" ");
whereBuilder.append(column);
whereBuilder.append(" LIKE '%");
whereBuilder.append(value);
whereBuilder.append("%' ");
return this;
} public Query in(String column, Object... values) {
if (ObjectUtils.isEmpty(values)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append(" ");
whereBuilder.append(column);
whereBuilder.append(" IN( ");
int i;
i = 0;
for (Object value : values) {
if (i > 0) whereBuilder.append(" , ");
i++;
whereBuilder.append(value(value));
}
whereBuilder.append(" )");
return this;
} public Query noIn(String column, Object... values) {
if (ObjectUtils.isEmpty(values)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append(" ");
whereBuilder.append(column);
whereBuilder.append(" NOT IN( ");
int i;
i = 0;
for (Object value : values) {
if (i > 0) whereBuilder.append(" , ");
i++;
whereBuilder.append(value(value));
}
whereBuilder.append(" )");
return this;
} public Query isNull(String column) {
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append(" ( LENGTH( ");
whereBuilder.append(column);
whereBuilder.append(" ) <=0 OR IS NULL ) ");
return this;
} public Query notNull(String column) {
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append(" ( LENGTH( ");
whereBuilder.append(column);
whereBuilder.append(" ) >0 OR IS NOT NULL ) ");
return this;
} public Query sql(Object sql) {
if (ObjectUtils.isEmpty(sql)) return this;
whereBuilder.append(sql.toString());
return this;
} public Query and(String whereSql) {
if (ObjectUtils.isEmpty(whereSql)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" AND ");
whereBuilder.append("( ");
whereBuilder.append(whereSql);
whereBuilder.append(" )");
return this;
} public Query or(String whereSql) {
if (ObjectUtils.isEmpty(whereSql)) return this;
if (whereBuilder.length() > 0) whereBuilder.append(" OR ");
whereBuilder.append("( ");
whereBuilder.append(whereSql);
whereBuilder.append(" )");
return this;
} public String toString() {
if (whereBuilder.length() > 0) {
sqlBuilder.append(whereBuilder.toString());
}
return sqlBuilder.toString();
} }
}

作为参数通过mapper传入XML作为【条件|行为】使用:

//  name = "张三"
query().eq("name","张三").toString();
// name = "张三"
update().set("name","张三").toString();
// (name) values("张三")
insert().set("name","张三").toString();

写一个简单的SQL生成工具的更多相关文章

  1. DAY5 php + mysql 写一个简单的sql注入平台

    php mysql 在浏览器输入用户名,去数据库查询.查到则显示在浏览器,查不到则显示空. sql 里面三个字段 id username password create table t1 (id in ...

  2. 原生js 基于canvas写一个简单的前端 截图工具

    先看效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  3. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  4. SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

    原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章 ...

  5. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  6. 手把手教你从零写一个简单的 VUE

    本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...

  7. 手把手教你从零写一个简单的 VUE--模板篇

    教程目录1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 Hello,我又回来了,上一次的文章教会了大家如何书写一个简单 VUE,里面实现了VUE 的数据驱动视图 ...

  8. [Winform]一个简单的账户管理工具

    最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...

  9. linux设备驱动第三篇:如何写一个简单的字符设备驱动?

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  10. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

随机推荐

  1. shell判断字符串结尾

    下面围绕"判断字符串是否以.txt结尾"展开.转变一下也同样适用于"判断字符串是否以.txt开头". 通用的方法 # 方法一.使用grep命令 #!/bin/s ...

  2. Socket、Http、WebSocket?强大的Netty几行语句就帮你实现!

    一.概述 Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 相比 ...

  3. Qt音视频开发30-qmedia内核qt4方案phonon播放(支持视频流)

    一.前言 在Qt4中如果需要播放视频,一般用phonon多媒体框架,这应该就是Qt5/Qt6中多媒体框架的前身(查阅qmultimedia模块的相关代码可以发现架构几乎雷同,除了部分命名变了以外),p ...

  4. Vue3使用Vuex 教程(这才是真正的小白教程!)

    我的项目是vue3+element-plus 我是个菜鸡,我不懂前端.想做一个tags的导航标签页.但是点击标签页之后页面仍然是会重新请求.感觉这不就跟没做一样吗? 遂百度GPT,第一种方式采用的就是 ...

  5. 海量用户IM聊天室的架构设计与实践

    本文由网易云信资深服务端开发工程师曹佳俊分享,本文收录时有内容修订和重新排版. 1.引言 聊天室是一类非常重要的 IM 业务形态,不同于单聊和群聊,聊天室是一种大规模的实时消息分发系统.聊天室有多种技 ...

  6. [AI] 基于大模型的AI搜索引擎

    概述:基于大模型的AI搜索引擎 ∈ 大模型智能体应用 AI搜索引擎的架构与组成 用户层:用户输入问题/关键词 Agent层: 用户的输入(当前和历史) + 问题提问模板 => 标准的问题 ... ...

  7. Canal同步MySQL增量数据

    引言 在现在的系统开发中,为了提高查询效率 , 以及搜索的精准度, 会大量的使用 redis .memcache 等 nosql 系统的数据库 , 以及 solr . elasticsearch 类似 ...

  8. 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始

    前言 为什么我会想着制作一个智能桌面机器人呢?自问自答一下,看过我之前文章的小伙伴应该都知道我之前有为稚晖君开源的ElectronBot桌面机器人开发过一个桌面上位机软件叫电子脑壳,由于Electro ...

  9. 引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常 解决办法

    出现题目的异常,多是引用第三方控件引起的. 在NEW时,需要初始化该对象. AxESACTIVEXLib.AxESActiveX ax = new AxESACTIVEXLib.AxESActiveX ...

  10. Linux 服务器防火墙开放端口命令(iptables、firewalld和ufw)

    本文主要介绍Linux中,Centos.Ubuntu和Debian开放防火墙端口的命令(iptables.firewalld和ufw)方法. 1.Centos中开放端口 1.systemctl sta ...