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. Python+requests编写接口用例

    1.python编写接口用例需要依赖requests模块,我们先确认本地是否安装了requests模块,没有安装的先进行安装. pycharm工具查看已安装的模块:File->Setting-& ...

  2. 【MySQL】java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

    问题原因参考: http://t.zoukankan.com/zhulei2-p-13451554.html collations 排序规则 Illegal mix 非法混合 SQL报错指出,操作符等 ...

  3. 【Git】01 下载安装(Windows)

    Git 官网地址:[点我访问] https://git-scm.com/ 点击这个电脑自动识别操作系统与系统位数 开始安装 安装的目录不要有中文就行[最好也不要有空格] 算了,直接全选[小孩子才做选择 ...

  4. 推荐一款.NET开源、功能强大的二维码生成类库

    前言 在日常开发需求中,生成二维码以分享文本内容或跳转至指定网站链接等场景是比较常见的.今天大姚给大家分享一款.NET开源(MIT License).免费.简单易用.功能强大的二维码生成类库:QrCo ...

  5. blender-点线面操作

  6. 花店橱窗(线性DP)

    线性DP--花店橱窗 谨以此题解献给线性dp最后一道题 题目大致 Description xq和他的老婆xz最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里.但是他们有很多花瓶,每个花瓶都具有各 ...

  7. 利用XtraBackup对MGR集群进行扩容

    运行了一段时间以后MGR集群,需要扩容节点,这是一个常见的需求.很多时候我们都喜欢用mysqldump工具来进行,因为这个工具有一个很好用的参数叫做master-data以及single-transa ...

  8. redis集群主从之读写分离

    redis集群主从之读写分离 1.集群部署 这里就不详细赘述如何部署主从集群了,一般都是使用slaveOf配置来进行初始化配置. 2.与springboot集成实现读写分离 通过注解实现调用层读写分离 ...

  9. 直接在jsp页面上使用flex标签

    1:去ADOBE下载FLEX的TAGLIB for JSP. http://download.macromedia.com/pub/labs/flex2_tag_library_jsp/flex2_t ...

  10. shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义详解

    一.概述 shell中有两类字符:普通字符.元字符. 1. 普通字符 在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本: 2. 元字符 是Shell的保留字符,在Shell中有着特殊的 ...