【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 ...
随机推荐
- nodejs加jq来实现下载word文档
先看效果 浏览器上: 下载的效果: 第一步是自己先搭建前端页面把自己写的结构数据全部传到后端 下面就是整个的结构 结构分析后端拿到数据后端解析: 第一层菜单层: { role: '分析报告', //顶 ...
- 关于excel表
对excel表的操作主要通过xlwt,xlrd模块. 创建excel表 import xlwtworkbook = xlwt.Workbook(encoding='utf-8') worksheet ...
- wpfui:一个开源免费具有现代化设计趋势的WPF控件库
wpfui介绍 wpfui是一款开源免费(MIT协议)具有现代化设计趋势的WPF界面库.wpfui为wpf的界面开发提供了流畅的体验,提供了一个简单的方法,让使用WPF编写的应用程序跟上现代设计趋势. ...
- 轻松实现H5页面下拉刷新:滑动触发、高度提示与数据刷新全攻略
前段时间在做小程序到H5的迁移,其中小程序中下拉刷新的功能引起了产品的注意.他说到,哎,我们迁移后的H5页面怎么没有下拉刷新,于是乎,我就急忙将这部分的内容给填上. 本来是计划使用成熟的组件库来实现, ...
- 原始指针 [raw pointers]
指针是一个变量,用于存储对象的内存地址. 指针广泛应用于 C 和 C++: 在堆上分配新对象 通过参数将某些函数传递给其他函数 迭代/遍历数组或其他数据结构的元素 int* p = nullptr; ...
- 天翼云安装nexus3.37.1
有点操蛋,官网网络太慢了! 百度了不少网友的内容,综合如下 总体是个皮毛,但已经可以用于开发了! 一.下载和安装 https://download.sonatype.com/nexus/3/nexus ...
- Windows10在WSL中运行GUI应用
0. 首先在WSL装X11相关环境 需要安装x11和桌面环境, 在这里装的是xfce4 sudo apt install x11-apps sudo apt install xfce4 有两种显示 ...
- rar终端常用命令
rar终端常用命令 1. 跳过目录: rar a xxx.rar -x./path_to_dir/ ./xxx/ [注] rar后面的文件夹不需要通配符 2. 加密码 rar a xxx.tar -p ...
- 基于RK3588的NPU案例分享!6T是真的强!
RK3588 NPU简介 作为瑞芯微新一代旗舰工业处理器,RK3588 NPU性能可谓十分强大,6TOPS设计能够实现高效的神经网络推理计算.这使得RK3588在图像识别.语音识别.自然语言处理等人工 ...
- 2024年,AI驱动测试管理工具会有哪些发展前景呢?
随着人工智能技术的日新月异,2024年的测试管理工具将迎来全新的发展机遇.AI赋能将助力测试管理工具实现前所未有的智能化升级,为软件研发团队带来革命性的变革. 一.什么是AI? 人工智能(AI)是一种 ...