【ActiveJdbc】03
一、查询API
简单条件筛选:
List<Person> list = Person.where("name = 'John'")
动态参数条件:
List<Person> list = Person.where("name = ?", "John");
处理大型结果集:
在之前的所有结果中,整个结果集都被加载到内存中。
这种方法在结果相对较小的情况下很好,但对于非常大的数据集可能会成为性能瓶颈。
下面的方法有点让人想起 SAX 方法,从数据库中读取超大数据集,对于找到的每一条记录,它都会产生一个回调。
在该回调中,您可以执行对应用程序有意义的任何操作。
这种方法的优点是不需要分配大量内存。
这通常是批处理的首选方法。将此视为来自数据库的数据流。
Person.find("name='John'", new ModelListener<Person>() {
public void onModel(Person person) {
System.out.println("Found person: " + person);
}
});
只查找一条记录
使用findFirst方法可以只找到一条记录。
顾名思义,即使查询可以产生多条记录,也只会返回第一条记录。
Person person = Person.findFirst("id = 2");
//parametrized:
person = Person.findFirst("id = ?", 2);
...
查询所有记录
这是一个方法或从表中返回所有记录,请小心使用,因为这会将它们全部加载到内存中(当您开始处理结果时,而不是在调用此方法时)
List<Person> list = Person.findAll();
for(Person p: list){ //<==== this line of code will initiate the actual query to DB
System.out.println(p);
}
Active的记录插入
有许多(更简洁的)模型创建方法,这是最简单和不言自明的:
这个记录插入之后,是会返回主键ID的,可以留作联调的操作业务
Person p = new Person();
p.set("first_name", "Marilyn");
p.set("last_name", "Monroe");
p.set("dob", "1935-12-06");
p.saveIt(); System.out.println(p.getId());// <== this will print an ID assigned by DB.
查询该表总记录数:
long personCount = Person.count();
待条件总记录:
计算一些记录同样容易,您所要做的就是提供标准。
long johnCount = Person.count("name = ? ", "John");
原始SQL
如果查询真的很复杂,你总是可以像这样使用原始 SQL:
作者没有提供太多的条件封装,一般写业务都是使用这个方法
高度自定义,还是写原始SQL实现数据层
List<Book> books = Book.findBySQL("select books.*, address from books, libraries where books.lib_id = libraries.id order by address");
二、分页&排序
1、限制结果
在取景器
的方法,如find(),findAll()和where()返回的一个实例LazyList。
这个类有一个方法叫做limit(int). 当您的程序开始时,它将限制结果集中的许多结果:
List<Person> people = People.findAll().limit(20);
2、偏移量
获得第一页后,您可能想要获得下一页。
这是通过 offset 方法完成的,在同一个LazyList类中找到,如下所示:
List<Person> people = People.findAll().limit(40).offset(20);
3、排序
通常,您会在一个语句中限制、抵消和排序结果:
List<Person> people = People.findAll().limit(40).offset(20).orderBy("age asc");
有时这种编程风格被称为Fluent Interfaces并归功于 Martin Fowler。这种 API 风格简洁、易读且不言自明。
4、翻页
尽管limit,offset和orderBy它们本身都是非常简单和强大的方法,
但 ActiveJDBC 还提供了一个方便的类,称为Paginator专为 Web 应用程序设计的:
Paginator p = new Paginator(Page.class, 10, "description like ?", "%Java%").orderBy("created_at desc");
List<Page> items = p.getPage(1);
List<Page> items = p.getPage(2);
此类的实例是轻量级的,通常附加到会话中。可以查询当前显示的页面:
int currentPage = paginator.getCurrentPage();
对于这样的页数:
int pageCount = paginator.pageCount();
在 Web 应用程序的上下文中使用这个类可以很容易地通过结果集构建分页。
三、常用范围
很多时候,开发人员对同一个表使用相同的过滤器来按一列或多列对记录进行分类,例如获取营销部门的成员:
如果你发现自己一遍又一遍地做同样的事情,你可以把它抽象成一个范围:
public class Employee extends Model {
static {
addScope("marketing", "department = 'marketing'");
}
}
之后,只需指出您需要的范围:
List<Employee> marketers = Employee.scope("marketing").all();
组合范围
您可以在同一请求中组合多个范围。如果您在模型上定义了多个范围:
public class Employee extends Model {
static {
addScope("marketing", "department = 'marketing'");
addScope("active", "active = 1");
}
}
然后你可以组合这些范围:
List<Employee> activeMarketers = Employee.scopes("marketing", "active").all();
追加条件:
可以where()像往常一样使用该方法进一步过滤:
List<Employee> activeMarketers = Employee.scopes("marketing", "active").where("position_level = ?", level).orderBy("created_at desc");
所有正常的机制和行为仍然存在。
范围允许抽象出平凡的请求并使代码更具可读性。
四、为字段自动赋值
ActiveJdbc会自动为这两个字段进行自动赋值:
created_at & updated_at

五、批量操作:
全表更新:
Person.updateAll("last_name = ?", "Smith");
条件更新:
Person.update("name = ?, last_name = ?", "name like ?", "Steve", "Johnson", "%J%");
表记录全删:
Person.deleteAll();
条件删除:
Person.delete("age > ?", "10");
六、执行策略(惰性 & 激进)
作者对执行策略默认是使用惰性的
惰性的意思就是,只有我们调用结果集的内容的时候,才会真的去访问数据库查询
List<User> users = User.findAll(); // or User.where(".. query here");
for(User u: users){
System.out.println(u);
}
上面这段案例,第一段查询所有给users
这个时候users是空的,因为users没有用来做任何事情
到下面执行Foreach的时候,users调用了,这才触发惰性加载,activeJdbc采取访问数据库拿数据过来
如果要保证集合中有数据,也就是必须让activeJdbc去访问数据库,把数据带过来
作者的建议是必须调用结果
文档后面是对关联关系的执行策略描述,工作方面反而不设置这种关联关系,需要维护成本
七、类型转换&值转换:
查看类型?
Person p = Person.findAll().get(0);
System.out.println("DOB type: " + p.get("dob").getClass());
一般返回的是Object,项目里面是手动强转或者toString
设置日期格式化转换:
日期转换器
日期转换器可以在格式化字符串和 java.sql.Date 之间进行转换。这是一个将日期转换器注册到dob
属性的示例:
public class Person extends Model {
static {
dateFormat("MM/dd/yyyy", "dob");
}
}
以及如何使用它们:
Person p = new Person(); // will convert String to java.sql.Date
p.setDate("dob", "06/23/1912");
// will convert Date to String, if dob value in model is of type Date
String str = p.getString("dob"); // will convert Date to String
p.setString("dob", new Date());
// will convert String to java.sql.Date, if dob value in model is of type String
Date date = p.getDate("dob");
时间戳转换:
时间戳转换器与日期转换器相同,但可以在 java.sql.Timestamp 之间进行转换。下面是一个声明的例子:
public class Message extends Model {
static{
timestampFormat("yyyy.MM.dd G 'at' HH:mm:ss z", "send_time");
}
}
空白到零转换器
空白到空转换器将任何java.lang.String空值或仅包含空格的值转换为空值。
它适用于任何 getter 或 setter。这是一个将其注册到两个属性的示例:
public class Person extends Model {
static {
blankToNull("name", "last_name");
}
}
零到零转换器
零到空转换器用作空白到空转换器,但将java.lang.Number等于零的值转换为空。以下是声明示例:
public class Salary extends Model {
static {
zeroToNull("bonus");
}
}
八、JSON化
https://javalite.io/generation_of_json
转XML处理上次WSDL弄过类似的,之后就没写过了
转JSON用的场景就很多了,前后端交互,JsonDoc类型存储
https://javalite.io/json
【ActiveJdbc】03的更多相关文章
- 【C】 03 - 数据类型
程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据.C语言根据需要,抽象出了一些基本数据类型和衍生数据类型.这些可以满足大部分需求,更复杂的抽象数据类型亦可通过它们来 ...
- 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】
本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 【SpringCloud】03.微服务的设计原则
微服务的设计原则: 一.AKF拆分原则 业界对于可扩展的系统架构设计有一个朴素的理念:通过加机器就可以解决容量和可用性问题(如果一台不行就两台). Y轴(功能)--关注应用中功能划分,基于不同的业务拆 ...
- 【SpringBoot】03.SpringBoot整合Servlet的两种方式
SpringBoot整合Servlet的两种方式: 1. 通过注解扫描完成Servlet组件注册 新建Servlet类继承HttpServlet 重写超类doGet方法 在该类使用注解@WebServ ...
- 【scikit-learn】06:make_blobs聚类数据生成器
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kevinelstri/article/ ...
- 【T-SQL基础】03.子查询
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 ...
- (转)【Android测试工具】03. ApkTool在Mac上的安装和使用(2.0版本)
http://blog.csdn.net/wirelessqa/article/details/8997168 http://code.google.com/p/android-apktool/dow ...
- 【WCF--初入江湖】03 配置服务
03 配置服务 数据库 生成数据库脚本: CREATE DATABASE [EmployeeDb]; CREATE TABLE [dbo].[T_Employee]( [Id] [,) NOT NUL ...
- 【T-SQL进阶】03.执行计划之旅-1
到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. T- ...
- 【SQL进阶】03.执行计划之旅1 - 初探
听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...
随机推荐
- 震惊!docker镜像还有这些知识,你都知道吗?----镜像(一)
镜像操作命令表格 docker image 子命令 docker子命令 功能 docker image build docker build 从Dockerfile开始构建镜像 docker imag ...
- 剑指Offer-52.正则表达式匹配(C++/Java)
题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- INFINI Labs 产品更新 | Easysearch 新增跨集群复制 (CCR)、支持快照生命周期管理 (SLM) 功能等
INFINI Labs 产品重量级更新!!!本次更新了很多亮点功能,如 Easysearch 新增跨集群复制 (CCR).支持快照生命周期管理 (SLM) 功能等:支持多集群.跨版本的搜索基础设施统一 ...
- Kubernetes OOM 和 CPU Throttling 问题
介绍 使用 Kubernetes 时,内存不足(OOM)错误和 CPU 限制(Throttling)是云应用程序中资源处理的主要难题.为什么呢? 云应用程序中的 CPU 和内存要求变得越来越重要,因为 ...
- PasteSpider的集群组件PasteCluster(让你的项目快速支持集群模式)的思路及实现(含源码)
PasteSpider是什么? 一款使用.net编写的开源的Linux容器部署助手,支持一键发布,平滑升级,自动伸缩, Key-Value配置,项目网关,环境隔离,运行报表,差量升级,私有仓库,集群部 ...
- rest接口list参数接收
list<String> post传参 ["1112","2222","3332"]list<Object> pos ...
- 解析Html Canvas的卓越性能与高效渲染策略
一.什么是Canvas 想必学习前端的同学们对Canvas 都不陌生,它是 HTML5 新增的"画布"元素,可以使用JavaScript来绘制图形. Canvas元素是在HTML5 ...
- Java实现管线拓扑关系连通性分析
管线拓扑关系的连通性分析通常涉及图论(Graph Theory)中的概念,特别是无向图(Undirected Graph)的遍历算法,如深度优先搜索(DFS, Depth-First Search)或 ...
- Gerrit 大量代码提交流程优化
# Gerrit 大量代码提交流程优化 背景 本文适用于 提交大量初始代码 的场景(仓库版本的早期). 有时候提交大量代码到Gerrit的时候会提示: $ git push Counting obje ...
- 3568F-三屏同显、异显方案演示