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 的风格也更容易编写和阅读。

Solon 3.0 新特性:SqlUtils的更多相关文章

  1. 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?

    来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...

  2. Java基础和JDK5.0新特性

    Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...

  3. Visual Studio 2015速递(1)——C#6.0新特性怎么用

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  4. atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性

    atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性   1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...

  5. 背水一战 Windows 10 (1) - C# 6.0 新特性

    [源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...

  6. C# 7.0 新特性2: 本地方法

    本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  7. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  8. C# 7.0 新特性3: 模式匹配

    本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...

  9. C# 7.0 新特性4: 返回引用

    本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  10. C#发展历程以及C#6.0新特性

    一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...

随机推荐

  1. Jmeter参数化2-读取文件

    如果你想要jmeter批量生成 指定 的参数值数据,可以使用导入文件参数化方法来实现 下面讲述两种jmeter读取文件参数值方法:"CSV 数据文件设置"."函数助手&q ...

  2. 【Mybatis】05 官方文档指北阅读 vol3 配置 其二

    对象工厂(objectFactory)[省略,入门阶段实在不懂] 插件(plugins)[省略,入门阶段实在不懂] 环境配置(environments) MyBatis 可以配置成适应多种环境,这种机 ...

  3. 【RabbitMQ】13 消息补偿 & 幂等保障

    https://www.bilibili.com/video/BV15k4y1k7Ep?p=34 我靠,幂等保障就是乐观锁控制啊 https://www.bilibili.com/video/BV15 ...

  4. 电视家APP会员退款了 —— 网络电视APP的合规性处理

    今天打开家里网络电视的时候突然发现"电视家APP"居然无法使用了,随后发现账户关联的银行卡收到退款了,于是好奇的研究了一下这个事情. 由于家里是在农村,闭路电视的图像效果很差,估计 ...

  5. 元学习:元学习的始祖论文——《On the Optimization of a Synaptic Learning Rule》

    ============================================= 这个论文保持着上世纪人工智能论文的特点,与其说是计算机类论文更不如说是偏生物科学方面的论文,这也可能是因为当 ...

  6. 部署CPU与GPU通用的tensorflow:Anaconda环境

      本文介绍在Anaconda环境中,下载并配置Python中机器学习.深度学习常用的新版tensorflow库的方法.   在之前的两篇文章Python TensorFlow深度学习回归代码:DNN ...

  7. 数据结构 分块 & 莫队

    分块 一种优化暴力的思想. 通常是将原数据划分成适当块(一般为 \(\sqrt{n}\)),对每块数据进行预处理,进而达到比暴力更优的时间复杂度. 划分 确定块长后,一般需要开两个数组存储每一块的右边 ...

  8. 推荐5款免费、开箱即用的Vue后台管理系统模板

    前言 在现今的软件开发领域,Vue凭借其高效.灵活和易于上手的特性,成为了前端开发的热门选择.对于需要快速搭建企业级后台管理系统的开发者而言,使用现成的Vue后台管理系统模板无疑是一个明智之举.本文大 ...

  9. python的命名风格(下划线篇)

    一个下划线开头的代表模块私有 用from xxx import * 时python会自动屏蔽带下划线的东西,想要取消屏蔽可以用__all__方法,但不建议(不符合规范) 两个下划线开头的代表类私有

  10. vue echarts map 中国地图显示不出来

    测试区忽然无法显示中国地图,所以对比了一下测试区与开发环境中echarts版本的区别 测试区echarts版本为 5.4.2 开发环境为5.0.2 所以将package.json中的 "ec ...