可能是比mybatis更好用的数据映射关系框架。
mybatis的xml就是一个模板,通过传递的参数动态生成组合的sql语句。但语法用起来没那么方便,还得去查询使用手册再学习。
假如你视图velocity引擎,那么后面 sql 处理引擎为啥不用这个呢?
虽说现在都前后端分离了,但通过服务器端渲染的页面也不是一无事处,可能有地方需要用到的。如生成页面,生成代码总还需要这个模板引擎,所以我统一使用一种模板引擎,这样可降低学习成本。
dtd可以查看https://raw.githubusercontent.com/netcorner/sqlmapper/master/files/sqlMap.dtd
<sqlMap>标签, root标签,一个 xml配置文件开始节点
<statement>标签,每个声明体开始的标签,需定义id属性,该属性必填且不能在一个页面中重复出现;
statement里面可以多个 crud 操作(事务级),自顶向下执行statement中的语句集,每个crud的语句集id用来返回执行结果,
其中insert,update,delete会返回执行影响的条数
select返回结果集,默认 select 是一条记录集,如要返回多条记录集在 select标签中加入 tolist="true"
<function>共享函数标签,页面中所有标签都可以调用,避免重复代码,innerText 中可以使用 velocity 模板的macro定义函数
以下是crud操作标签
<insert>标签的innerText代表insert sql语句
<update>标签的innerText代表update sql语句
<delete>标签的innerText代表delete sql语句
<select>标签的innerText代表select sql语句
<config>标签的innerText代表config sql语句 执行一下没返回值的配置相关语句
<page>标签里面有<select>筛选字段,<from>来自哪个表格,<where>条件筛选,<order>字段排序,处理需要有分页的读取操作
直接只有一个<page>标签,会自动产生分页
也可以在 page 标签下面有以下标签,但这些标签也不是必须的,不写会自动生成
<select>筛选字段
<from>来自哪个表格
<where>条件筛选
<order>字段排序
具体分页的一些参数可通过com.netcorner.sqlmapper.QueryPage或com.netcorner.sqlmapper.WebQueryPage 传入
<select>标签中的 innerText中可写sql语句返回一个集合的记录集,若可使用<query>标签可支持多个结果集的返回。
以下方式可以获取多集录集,设定好主键(primary)及外键(foreign),可自动归整成一个树状集合
<statement id="select">
<select id="res">
<query id="table" primary="userid">
select userid,username,nickname from user where id=1
</query>
<query id="message" parent="table" foreign="userid">
select messageid,title,userid from user where userid=1
</query>
</select>
</statement>
返回结果集是一个树结构的结果级
如:{userid:1,username:'sjf',nickname:'netcorner',message:[{messageid:1,title:'完善信息',userid:1},
{messageid:2,title:'更新信息',userid:1} ...]}
函数形式是velocity macro(宏)实现页面级共享调用
<function>
##得到最大 id
#macro(getMaxID)
select max(id) id from $table
#end
</function>
<statement id="fundemo1">
<select>
#getMaxID()
</select>
</statement>
<statement id="fundemo2">
<select>
#getMaxID()
</select>
</statement>
以上实现了函数调用功能,可省去重复代码
#Insert() 是表的插入insert语句,空值不会插入
#Update() 是表的更新update语句,空值不会更新
#Delete()是表的删除delete语句
#Where() 是表的条件 where 后面的语句,有值就会产生条件
$table 是表格名
<statement id="mutile1">
<insert>
insert into a(a,b)
values('777','1')
</insert>
<select>
select 1 status
</select>
<insert>
insert into a(a,b)
values('1233333333333333333333333333333333','1')
</insert>
<insert>
insert into a(a,b)
values('777','1')
</insert>
</statement>
以上操作有有一个出错就会回滚
例:
<sqlMap merge="datasource.base">
merge属性用于继承datasource 下面的 base.xml 所有 statement,function
通过以上方式实现跨页面级的代码利用
通过{}形式进行拆分,以下执行了两次 insert 语句
<statement id="mutile1">
<insert>
{insert into a(a,b)
values('777','1')}
{insert into a(a,b)
values('777','1')}
</insert>
</statement>
包含的key是一个字符串,如 datasource.user.add 表示 datasource 数据源的 user 表的 add 声明块
DBTools.getData 获取单条记录,多个声明体中包含insert、update、delete 不是事务级的、不会回滚 DBTools.selectData 获取多条记录,多个声明体中包含insert、update、delete 不是事务级的、不会回滚 DBTools.pageData 获取多条记录,多个声明体中包含insert、update、delete 不是事务级的、不会回滚 DBTools.insertData 插入记录,多个声明体中包含insert、update、delete 是事务级的、会回滚 DBTools.updateData 插入记录,多个声明体中包含insert、update、delete 是事务级的、会回滚 DBTools.deleteData 插入记录,多个声明体中包含insert、update、delete 是事务级的、会回滚 DBTools.execute 执行数据操作,返回声明体的最后一个执行体的状态、记录集或记录,多个声明体中包含insert、update、delete 是事务级的、会回滚 DBTools.executeByMap 执行数据操作,返回声明体的最后一个执行体记录,多个声明体中包含insert、update、delete 是事务级的、会回滚
如:$map.username map是参数对象 username 对象属性
小项目直接去了实体层可能开发会快速简单一点。
用以下语句自动生成实体
SQLMap.genEntities("datasource","com.netcorner.ssx.model.entity",System.getProperty("user.dir")+"/api");
自建实体请继承:com.netcorner.sqlmapper.entity.Entity
@Table注解表示映射哪个库的哪个表如:@Table("datasource.user") 会映射于datasource中的user表
可以在 base.xml 中配置相应 statement,然后业务 xml 继承 base.xml
此时statement语句体可以进行拦截配置。
执行体中设置afterExecId 属性 表示执行体执行完以后,会调用该对应的 statement id="$afterExecId"的声明体,$afterExecId 多个用逗号分开。如果另外文件配置文件,可配置如datasource.user.add 这样可以调用 user 表中的 statement="add"的声明体
执行体中设置beforeExecId 属性 表示执行体执行完以后,会调用该对应的 statement id="$beforeExecId"的声明体,$beforeExecId 多个用逗号分开。如果另外文件配置文件,可配置如datasource.user.add 这样可以调用 user 表中的 statement="add"的声明体
执行体中设置 execAppendSql 属性 表示执行体语句追加语句,可以是宏函数也可以是普通常量
示例:
<statement id="fun2">
<select>
#getTable2('a')
</select>
</statement>
<statement id="AfterExecId">
<select afterExecId="AfterExecId1">
select*from $table where 1=1 and 2=2
</select>
</statement>
<statement id="BeforeExecId">
<select beforeExecId="fun2">
select*from $table where 1=1
</select>
</statement>
<statement id="ExecAppendSql">
<select execAppendSql="#appendFun()">
<query id="aa" primary="indexid">
select *,1 indexid from $table where 1=1
</query>
<query id="bb" parent="aa" primary="indexid" foreign="indexid">
select *,1 indexid from $table where 1=2
</query>
</select>
</statement>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.netcorner</groupId>
<artifactId>sqlmapper</artifactId>
<version>2.7.4</version>
</dependency>
initDatasource();
HashMap<String,Object> params=new HashMap<String,Object>();
params.put("userid",1);
System.out.println(DBTools.getData("datasource.user.hello", params));