Code Monkey home page Code Monkey logo

sagframe / sagacity-sqltoy Goto Github PK

View Code? Open in Web Editor NEW
1.1K 53.0 176.0 462.88 MB

Java真正智慧的ORM框架,融合JPA功能和最佳的sql编写及查询模式、独创的缓存翻译、最优化的分页、并提供无限层级分组汇总、同比环比、行列转换、树形排序汇总、sql自适配不同数据库、分库分表、多租户、数据加解密、脱敏以及面向复杂业务和大规模数据分析等痛点、难点问题项目实践经验分享的一站式解决方案!

License: Apache License 2.0

Batchfile 0.02% Java 99.98%
sqltoy sqltoy-orm sagacity-sqltoy sql orm sqltoy-sql sql-orm sagacity-orm sagacity

sagacity-sqltoy's People

Contributors

chenrenfei avatar jobell84 avatar jobmission avatar joliny avatar wsxe9988 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sagacity-sqltoy's Issues

参考 jfinal Db + Record模式

jfinal Db + Record 模式独步天下,如果针对大量数据表进行简单操作,弄出来一大堆bo vo service的确费时费力,没啥价值。数据结构增加字段后,还得一通更改代码。可否吸取一下这方面的优势,继续简化sql层之上的操作,提供更为便捷的使用方法。比如对于查询而言,以前使用spring jdbc template ,给sql 返回List(Map)其实也很香,简单的场景,后台代码量可以降解到只有三个文件,1个controller,1个后台访问类,1个XML(项目所有sql),最多加个拦截器。个人也向往极简程序,希望作者可以再进行优化。
感谢。

Sent with GitHawk

是否提供AOP接口方式调用SQL?

目前基于sql的id进行入参查询,导致对编码非常不友好,目前使用过程中主要有以下问题:

  • 代码中存在大量字符串入参,为了防止写错还会定义大量的字符串常量。
  • 目前入参也是以Map和数组为主,导致入参过于随意,无法通过IDE限制入参,有些隐藏问题容易在运行阶段暴露出来。

我们是否应该考虑基于AOP的接口查询?当然在sqltoy-quickstart也说明了一部分,但是我觉得AOP调用还是很有必要的。

目前个人认为有以下优势:

  1. 非常友好且明确的查询定义,service中直接通过接口就能知道能有哪些查询,而不是去看sql.xml
// 同时支持了返回泛型对象,sqlToyLazyDao则不支持
Map<String,Object> findById(Long id);
  1. 和*.sql.xml可以有较强的关联性

SqlToyLazyDao.findBySql 参数问题

方法 SqlToyLazyDao.findBySql 的参数为什么使用 T, 而不是 Class ?
如下:

public <T extends Serializable> List<T> SqlToyLazyDao.findBySql(final String sqlOrNamedSql, final T entity);
public <T extends Serializable> List<T> SqlToyLazyDao.findBySql(final String sqlOrNamedSql, final Class<T> entity);

疑问!

开源的代码与在实际项目中用的代码完全一致吗?

有1对n关联查询的结果映射相关的文档吗?

查了一圈没找到.

顺便问下为什么生成的vo既然不允许修改 sqltoy 生成vo分成2部分:AbstractVO 和 VO,AbstractVO 不允许手工改动保持跟数据库一致,
那么为什么不使用apt来生成呢? 这样既避免了繁琐的配置,又能防止不小心手工改动了.

如何方便的操作多个数据库

如题举个例子,主表在mysql,另一张超大子表在clickhouse,一个查询逻辑要先查主表后,再用主表的每个ID去统计子表,最后拼接成一个list。能否在一个配置中完成类似的操作?
感谢!

Sent with GitHawk

quickVO如果不想生成文档注释,请问需要怎么配置

<api-doc>
	<imports value="io.swagger.v3.oas.annotations.media.Schema" />
	<doc-class-template>
	<![CDATA[@Schema(name="${className}",description="${tableRemark!""}")]]>
	</doc-class-template>
	<doc-field-template>
	<![CDATA[@Schema(name="${fieldName}",description="${colRemark!""}",nullable=${nullable})]]>
	</doc-field-template>
</api-doc>

注释掉好像还是会生成

sql multi colunms and dynamic prameters combination translation mapping to an specific value

Version:4.13.1 or earlier
Now due to the mechanism of the sql translation mapping with sql data cache,we can only translate an specicic column to a value instead of Left join sql or writing java codes with same purpose,But there are some scenarios that the current mechanism can't work with.
For in some multi-language scenarios,or in the composite keys/composite columns ,several columns or several dynamic parameters or all the columns and parameters combiation can only mapping to an specific translation value,this orm-framework can't work with it well.
In my opnion,we can wite the sql template just like ,
Select (column1 column2 .... :param1 :param2 ...) columnName instead of Select colunm1 columnName ,
which indicates that the combination of multi colunm or java parameter with : is the final key which can be used to map to the final translation values as before.
That is my suggestion,you can follow this idea and add it to the orm-framework as you like,wharever.

oracle 11g数据库QuickVOStart.start()生成pojo代码时,没有生成数据库字段

在DBHelper类的getTableColumnMeta(final String tableName)方法中找到
// oracle 数据库
if (dbType == DBType.ORACLE || dbType == DBType.ORACLE11) {
StringBuilder queryStr = new StringBuilder();
queryStr.append("SELECT t1.*,t2.DATA_DEFAULT FROM (SELECT COLUMN_NAME,COMMENTS");
queryStr.append(" FROM user_col_comments");
queryStr.append(" WHERE table_name =?) t1");
queryStr.append(" LEFT JOIN(SELECT COLUMN_NAME,DATA_DEFAULT");
queryStr.append(" FROM user_tab_cols");
queryStr.append(" WHERE table_name =?) t2");
queryStr.append(" on t1.COLUMN_NAME=t2.COLUMN_NAME");
pst = conn.prepareStatement(queryStr.toString());
pst.setString(1, tableName);
pst.setString(2, tableName);
rs = pst.executeQuery();
filedsComments = (HashMap) DBUtil.preparedStatementProcess(null, pst, rs,
new PreparedStatementResultHandler() {
public void execute(Object obj, PreparedStatement pst, ResultSet rs) throws SQLException {
HashMap filedHash = new HashMap();
while (rs.next()) {
TableColumnMeta colMeta = new TableColumnMeta();
colMeta.setColName(rs.getString("COLUMN_NAME"));
colMeta.setColRemark(rs.getString("COMMENTS"));
colMeta.setColDefault(StringUtil.trim(rs.getString("DATA_DEFAULT")));
filedHash.put(rs.getString("COLUMN_NAME"), colMeta);
}
this.setResult(filedHash);
}
});
}

不知道为什么这里就只取了COLUMN_NAME、COMMENTS、DATA_DEFAULT三列,没有取
DATA_TYPE。
感觉不合理呀!

因此,我得到的pojo代码如下:

/**
*@generated by sagacity-quickvo 4.18
*/
package com.zy.sqltoy.quickstart.entity.base;

import java.io.Serializable;
import java.util.List;
import org.sagacity.sqltoy.config.annotation.Entity;
import java.util.ArrayList;
import org.sagacity.sqltoy.callback.SelectFields;
import org.sagacity.sqltoy.config.annotation.Id;
import org.sagacity.sqltoy.config.annotation.Column;

/**

  • @project netbanksys

  • @Version 2021.03.08

  • Table: NETBANK_BANK_ACCT
    */
    @entity(tableName="NETBANK_BANK_ACCT")
    public abstract class AbstractBankAcct implements Serializable {

    /**
    *
    */
    private static final long serialVersionUID = 998747744939255351L;

    /** default constructor */
    public AbstractBankAcct() {
    }

    /**

    • @todo vo columns to String
      */
      @OverRide
      public String toString() {
      StringBuilder columnsBuffer=new StringBuilder();
      return columnsBuffer.toString();
      }

    /**

    • @todo create entityQuery fields
      */
      public static SelectFieldsImpl select() {
      return new SelectFieldsImpl();
      }

    public static class SelectFieldsImpl extends SelectFields {
    private List fields = new ArrayList();

     @Override
     public String[] getSelectFields() {
     	String[] result = new String[fields.size()];
     	fields.toArray(result);
     	return result;
     }
    

    }
    }

/**
*@generated by sagacity-quickvo 4.18
*/
package com.zy.sqltoy.quickstart.entity;

import org.sagacity.sqltoy.config.annotation.SqlToyEntity;
import com.zy.sqltoy.quickstart.entity.base.AbstractBankAcct;

/**

  • @project netbanksys

  • @author wentao

  • @Version 2021.03.08

  • Table: NETBANK_BANK_ACCT
    /
    @SqlToyEntity
    public class BankAcct extends AbstractBankAcct {
    /
    *
    *
    */
    private static final long serialVersionUID = 8399355890314952708L;

    /** default constructor */
    public BankAcct() {
    super();
    }

    /---begin-constructor-area---don't-update-this-area--/
    /---end-constructor-area---don't-update-this-area--/

    /**

    • @todo vo columns to String
      */
      @OverRide
      public String toString() {
      return super.toString();
      }

    /*

    • (non-Javadoc)
    • @see java.lang.Object#clone()
      */
      @OverRide
      public BankAcct clone() {
      try {
      return (BankAcct) super.clone();
      } catch (CloneNotSupportedException e) {
      e.printStackTrace();
      }
      return null;
      }

}

这。。。。怎么用呢?呜呜呜……

save方法报错

数据库使用的是postgresql
主键使用bigserial 使用sequence来自增

create table t_label
(
    id   bigserial
        primary key,
    name varchar not null
);
<primary-key>
    <table name="t_\w+|r_\w+" strategy="sequence" sequence="t_\w+_id_seq"/>
</primary-key>
@Id(strategy="identity")
@Column(name="id",comment="",length=19L,defaultValue="t_label_id_seq",type=java.sql.Types.BIGINT,nullable=false,autoIncrement=true)
protected BigInteger id;
@Column(name="name",comment="",length=2147483647L,type=java.sql.Types.VARCHAR,nullable=false)
protected String name;
@Test
void contextLoads() {
    Label label = new Label();
    label.setName("test");
    sqlToyLazyDao.save(label);
}

image

VO生成问题

image
image
如上图所示, 如果comment里面带有双引号, 则生成的VO里面引号内容不对

2个建议:SQL打印和IDE支持改善

SQL打印

项目支持SQL打印,但是打印方式显得有些“鸡肋”,原始的语句和sql参数是分别显示出来的。
为什么不拼接好之后再打印了?如果开发者需要在数据库里面重现这个SQL,当参数多的时候,这个参数替换起来狠不友好。

IDE支持

当前的IDE的插件功能只有一个关联方法的和XML的功能。是否考虑继续完善了。

  • #[]语法支持,在我这里,IDE其实在提示错误,如下图所示。
  • 结合Intellij 完成 SQL中字段的智能提示。
    image

优化代码

1.优化代码,将可替换的多重if-else判断 替换为switch case,效率会有所提升
2.用阿里规约扫码代码,把最高级别的问题尽量消除

是否支持一个片段多句sql,带有事务的情况

不想写复杂的dao,想通过一个sql片段,一步到位,比如
id1
sql1 update....
sql2 delete.....
sql3 update.....
调用id1的脚本后,传入相关对象,如果都正确则返回,如果一个错误全回滚。目前只考虑同一个数据库的情况,多库事务相对麻烦,可以后期考虑。
您看看,目前软件是否能够解决这个问题。
谢谢。

Sent with GitHawk

建议增加数据更新时乐观锁支持

场景:在更新数据之前用户已经获取到了完整的数据,修改之后完之后提交;在执行数据更新时避免数据覆盖
解决方案:在数据对象中增加version属性支持,数据执行更新时和数据库存量数据版本进行比较如果更新失败则抛数据异常已被XX更新,如果成功则值累加
示例:
实体标记属性
image
实际执行SQL:
update user set version=verison+1, remark='测试' where id='1' and version='0'

希望quickvo.xml的primary-key主键配置sequence策略时,能支持正则表达式

今天终于说服团队使用sqltoy来开发了,哈哈……
想要的效果:
<primary-key> <!--oracle数据库,我们的表都是netbank开头--> <!--然后各个表的序列是SEQ开头--> <!--例如,表名:NETBANK_USER,则他的主键序列是SEQ_USER--> <table name="^NETBANK_\w+" strategy="sequence" sequence="SEQ_\w"/> </primary-key>

关于生成工具和 setid问题

版本:4.10.5
生成工具默认把bigint(20) 给了 Types.Integer, 使用的雪花算法自动设置,会出现转换错误.

然后就是 id 字段 的set方法不允许 public Long setId(Long id)这样的链式形式, 否则会提醒找不到setid 这个方法.

load方法时,如果有mysql关键字则报语法错误

MySQLSyntaxErrorException: You have an error in your SQL syntax;
比如:select desc from test where id = ? 通过load方法自动生成的sql语句,此desc为mysql数据库关键字。
正确语句:select desc from test where id = ?
建议将所有生成的sql语句查询字段都加上``,以防止关键字问题

oracle方言问题

报错内容: java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
生成的语法: select id,subject_name from base_course offset 0 rows fetch next 20 rows only
db配置和debug输出如下
微信截图_20230109171112

SqlToyLazyDao接口中的load方法日志打印两遍

您好。我使用SqlToyLazyDao接口中的load方法,根据主键进行查询,日志打印了两遍,如下图,请问是执行了两遍sql还单纯的日志打印了两遍。我自己查看过源码,没看出是什么问题,想请问一下您。
image

如何支持mongo

如何支撑mongo,请给出几个常用的实例。
再多问下,mongo如果两个集合关联咋搞?能否也给个例子。
感谢!

Sent with GitHawk

SQL不正确的解析

使用sqltoy-quickstart项目测试
测试方法com.sqltoy.quickstart.dao.StaffInfoDao#findStaff
// 单表查询一般适用于接口内部查询
String sql = "#[staffName like :staffName]#[and createTime>=:beginDate]#[and createTime<=:endDate]";
修改为
String sql = "#[staffName = ']' OR staffName like :staffName]#[and createTime>=:beginDate]#[and createTime<=:endDate]";
运行测试后报错:java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
sqltoy将sql语义中字符串内的“]”做为“#["的配对解析了
猜测其他方法也有类似的问题如 @if(:staffName = ')')等

starrocks

能提供一个链接starrocks,对CRUD

增加一个数据库兼容性的测试模式

在产品开发阶段,一次测试就能够测试产品跨数据库的兼容性,避免一个一个测试不同数据库的麻烦。在该模式下,假设正常配置的是Oracle数据库,任何的增啥改查操作与正常模式没任何区别。但是,它同时又能生成MySQL数据库对应的查询语句并且同时投放到MySQL数据库上执行,这额外的操作当且仅当做数据库的兼容性测试,能够输出日志即可,其结果不影响原来的业务流程。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.