知识点:

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. Linux系统安装python3.8与卸载教程

    ln -sf /usr/local/python311/bin/python3.11 /usr/local/bin/python3ln -sf /usr/local/python311/bin/pyd ...

  2. Qt编写视频监控显示安卓版

    一.前言 之前就对代码的兼容性做了很好的处理,所以只要开发环境正常,基本的在其他系统比如手机端或者嵌入式linux上重新编译代码即可,最大的难点变成了如何交叉编译对应系统的ffmpeg库,这个在网上有 ...

  3. Qt编写地图综合应用51-离线瓦片地图下载

    一.前言 写这个离线地图下载器的初衷,就是为了方便自己的几个需要离线地图的程序,客户需求,既然地图程序已经可以支持离线地图,那如何获取到这些离线瓦片地图文件是个关键,而且这是这个功能的关键,拿到这些一 ...

  4. EPPlus使用方法---Excel处理我觉得超级好用

    目前只是用到导出Excel功能,导出大规模数据量速度也很快,而且比较容易操作(最起码导出是,暂时没有用到处理已存在的excel功能,有人说NPOI也好用,试了一下,最起码导出这个不如EPPlus    ...

  5. [云研发]腾讯云cloudstudio使用教程-记录1

    cloudstudio 在vscode中新建终端,使用nvidia-smi查看显卡与gpu情况,可知当前使用的显卡是T4的,显存有15G

  6. [转载]「服务」WCF中NetNamedPipeBinding的应用实例

    「服务」WCF中NetNamedPipeBinding的应用实例 WCF中有很多种绑定,根据官方的说法,NetNamedPipeBinding是适用于同一台主机中不同进程之间的通信的. 今天终于实现了 ...

  7. .net core 用 identitymodel 请求token。

    identitymodel  也有在Nuget里搜索和安装. identitymodel 扩展了HttpClient的一些方法用于token请求. 例如:client.RequestTokenAsyn ...

  8. CAS实现原理

    一.什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令. 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新 ...

  9. Tomcat 连接池介绍

    Tomcat 连接池是从 Tomcat 7 开始重新编写的高并发连接池,用以取代以前 Tomcat 中使用的 DBCP 1 连接池,它可以配置在 Tomcat 中使用,也可以单独使用.本文主要介绍 T ...

  10. ABC243

    ABC224 D 题目大意 有一个九个点的无向图棋盘,上面有八个棋子,一次操作能将一个棋子沿边移到空点上,问将每个棋子移到与它编号相同的点最少几步. 解题思路 考虑使用 BFS. 用 string 存 ...