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();
到此这篇关于mybatis编写一个简单的sql生成工具的文章就介绍到这了,更多相关mybatis sql生成内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论