首页 > 数据库 >Solon 3.0 新特性:SqlUtils

Solon 3.0 新特性:SqlUtils

时间:2024-10-10 19:00:53浏览次数:1  
标签:sqlUtils group builder public SQLException 3.0 Solon SqlUtils id

Solon 3.0 引入了新的 SqlUtils 用于数据库基础操作,SqlUtils 是对 JDBC 较为原始的封装,采用了 Utils API 的风格,极为反普归真。 特性有:

  • 支持事务管理
  • 支持多数据源
  • 支持流式输出
  • 支持批量执行
  • 支持存储过程

一、概述

SqlUtils 是一个轻量的数据库操作框架,采用 Utils API 风格,简单灵活,易于阅读和维护,支持编写复杂的SQL。对于不适合使用复杂的 ORM 框架,或者需要编写复杂的 SQL 的场景,可以使用 SqlUtils 来操作数据库。

二、引入 SqlUtils

  • gradle 依赖
implementation 'org.noear:solon-data-sqlutils'
  • maven 依赖
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-data-sqlutils</artifactId>
</dependency>

三、配置数据源

配置数据源(具体参考:《数据源的配置与构建》

solon.dataSources:
  rock!:
    class: "com.zaxxer.hikari.HikariDataSource"
    jdbcUrl: jdbc:mysql://localhost:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
    driverClassName: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

之后就可以按数据源名注入 SqlUtils 了(带 ! 结尾的数据源名,为默认)

@Component
public class DemoService {
    @Inject //默认数据源名
    SqlUtils sqlUtils;
}

四、查询操作

查数量:

public Long findCount() throws SQLException {
    return sqlUtils.selectValue("select count(*) from appx where app_id = ?", id);
}

按照主键查数据:

public Appx findDataById(Integer id) throws SQLException {
    return sqlUtils.selectRow("select * from appx where app_id = ?", id)
                   .toBean(Appx.class);
}

按照自定义查询条件查数据:

public List<Appx> findDataByGroup(Integer group_id) throws SQLException {
    return sqlUtils.selectRowList("select * from appx where group_id = ?", group_id)
                   .toBeanList(Appx.class);
}

以上几种查询方式,查询条件中的变量使用的是占位符(SqlUtils 只支持占位符),也比较简单。复杂的查询怎么办?比如管理后台的条件统计,可以先使用构建器:

public List<Appx> findDataStat(int group_id, String channel, int scale) throws SQLException {
    SqlBuilder builder = new SqlBuilder();
    builder.append("select group_id, sum(amount) amount from appx ")
           .append("where group_id = ? group by group_id", group_id);

    builder.appendIf(channel != null, " and title channel ?", channel + "%");

    if(scale > 10){
        builder.append(" and scale = ?", scale);
    }

    return sqlUtils.selectRowList(builder.getSql(), builder.getArgs())
                   .toBeanList(Appx.class);
}

管理后台常见的分页查询:

public void findDataPage(int group_id, String channel) throws SQLException {
    SqlBuilder builder = new SqlBuilder()
      .append(" from appx  where group_id = ?", group_id)
      .appendIf(channel != null, " and title channel ?", channel + "%");
    
    //备份
    builder.backup();
    builder.insert("select *");
    builder.append(" limit ?,?", 10,10); //分页获取列表
    
    //查询列表
    List<Appx> list = sqlUtils.selectRowList(builder.getSql(), builder.getArgs())
                              .toBeanList(Appx.class);
    
    //回滚(可以复用备份前的代码构建)
    builder.restore();
    builder.insert("select count(*)");
    
    //查询总数
    Long total = sqlUtils.selectValue(builder.getSql(), builder.getArgs());
}

五、流式查询操作

支持 fetchSize 参数

public void findDataAll(Integer group_id) throws SQLException {
    try (RowIterator iterator = sqlUtils.selectRowIterator("select * from appx where group_id = ?", 100, group_id)) {
        while (iterator.hasNext()){
            Appx app = iterator.next().toBean(Appx.class);
            //....
        }
    }
}

六、插入操作

单条插入:

public void addData(int id) throws SQLException {
    return sqlUtils.insert("insert appx(app_id) values(?)", id); 
}

单条插入并返回Key:

public void addData(int id) throws SQLException {
    return sqlUtils.insertReturnKey("insert appx(app_id) values(?)", id); 
}

批量插入:

public void addDataBatch() throws SQLException {
    List<Object[]> argsList = new ArrayList<>();
    argsList.add(new Object[]{1});
    argsList.add(new Object[]{2});
    argsList.add(new Object[]{3});
    argsList.add(new Object[]{4});
    argsList.add(new Object[]{5});
    
    sqlUtils.executeBatch("insert appx(app_id) values(?)", argsList);
}

六、执行操作(更新或删除)

支持事务控制

@Tran
public void delData(int id) throws SQLException {
    sqlUtils.execute("delete from appx where app_id=?", id); 
}

@Tran
public void updateData(int id) throws SQLException {
    sqlUtils.execute("update appx set group_id=?  where app_id=?", 2, id); 
}

七、存储过程操作

查询操作

public Appx findDataById(int id) throws SQLException {
    return sqlUtils.selectRow("{call findDataById(?)}", id).toBean(Appx.class);
}

删除操作

public int findDataById(int id) throws SQLException {
    return sqlUtils.execute("{call delDataById(?)}", id);
}

八、总结

通过上述的示例,可以看到基本的数据库操作都可以用 SqlUtils 实现,避免了复杂的ORM框架的使用,切操作要比ORM框架简单灵活的多。Utils API 的风格也更容易编写和阅读。

标签:sqlUtils,group,builder,public,SQLException,3.0,Solon,SqlUtils,id
From: https://www.cnblogs.com/noear/p/18456939

相关文章

  • USB3.0 枚举过程
    USB3.0枚举是指主机和设备之间通过USB协议进行初始化和通信配置的过程。在USB3.0中,枚举过程的主要步骤包括电气连接建立、链路训练(LTSSM)、设备描述符读取等。以下是USB3.0枚举的详细过程:1设备连接与电源管理当USB设备插入USB3.0端口时,以下步骤会开始:供电:主机通过VBUS线为......
  • Facefusion3.0一键整合包,轻松三步实现换脸,不限电脑配置
    FaceFusion3.0,是由Roop项目的核心开发者独立发布的一款功能强大的人脸转换和增强工具。全新的FaceFusion3.0版本,除了支持AI视频/图片换脸、直播换脸、数字人外,还新增了表情修复、年龄修改等功能,效果更自然、逼真。具备高度真实感、快速运行等特点,能短时间内,生成逼真的换脸视......
  • QC2.0 3.0 4.0 的区别
    一、简介QC,即QuickCharge,是美国高通公司专为配备Qualcomm骁龙处理器的终端而研发的快速充电技术。截至目前,Qualcomm已经发布了四代快速充电技术,分别为QuickCharge1.0,QuickCharge2.0,QuickCharge3.0和QuickCharge4.0。以下图表为大家列出三个版本的快充所能支持的电压,最......
  • 《如 何 速 通 一 套 题》13.0
    邮寄开场秒掉A。B不会做,写了70。-----1h-----然后看C。C瞪了114514眼看不出来,然后再瞪了1919810眼,终于看出来了。-----3h-----然后就不会了,D啥都想不出来。最后100+70+100+0=270。A喷泉弱智题。直接计算\(C\)至\(AB\)的距离\(-r\)和\(A,B\)至......
  • PotPlayer(免费媒体播放器) v1.7.22233.0 多语便携版
    概述PotPlayer是一款由韩国企业Daum开发的免费媒体播放器,它提供了丰富的功能和特点,使其成为许多用户的首选播放器。 软件功能支持多种音视频格式:PotPlayer支持大多数常见的音视频格式,包括MP4、AVI、MKV、MOV、FLV、MP3、WAV等。高质量的音视频播放:PotPlayer采用了先进的解码......
  • Knots_3D 9.3.0 一款教你绑绳结的手机应用
    Knots3D(3D绳结)是一款教你绑绳结的手机应用,可以掌握一些必备的绳结系法,拥有120+个3D效果的绳结,教你系上、解开,户外爱好者必备。Knots3D已经被全世界的园艺师、渔民、消防员、登山者、军人和童子军使用,它将迅速教会你如何捆绑最困难的绳结。系上、解开,并用你的手指......
  • 解决MacOS 13.0.1 苹果M1芯片 导入pyaudio报错的问题
    【问题】如果正常按照网上的教程,在terminal先使用brew安装portaudio(brewinstallportaudio),再使用pip在conda环境里安装pyaudio(pipinstallpyaudio),然后python直接导入pyaudio(importpyaudio)会报错如下:【分析】可知报错来自于portaudio动态库。网上搜索解决方案,除了重装、重启......
  • Steam++工具箱 Watt Toolkit v3.0.0-rc11 中文绿色版
    获取地址:https://pan.quark.cn/s/afd88fd92762介绍Steam++是一个包含多种Steam工具功能的工具箱,Steam++可在所有支持的Windows、macOS、iOS和Android版本上使用,同步令牌、账号信息。软件截图软件特点加速访问该功能能够使Steam社区、Github、谷歌验证码等国内......
  • Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进
    作者:席翁Nacos社区刚刚迎来了Star突破30000的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助!Nacos /nɑ:kəʊs/是Dynamic Namingand Configuration Service的首字母简称,定位于一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。......
  • SHAutoClick V3.0.3 无影手自动点击
    前言这个软件至少已有14年历史,起初名为AutoClick,主要用于关闭烦人的弹窗警告、广告,或者持续翻页等。后来因需要调用一个软件批量转换图书格式,就开发了通用的调用第三方软件进行批量操作的功能,这也是本软件最大的特色。因重名软件太多,故更名为SHAutoClick(无影手自动点击),属于标准四......