【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 ...
随机推荐
- Kettle调优教程(推荐收藏)
1.调整JVM大小 linux文件路径:data-integration/spoon.sh windows路径: -Xms1024m:设置JVM初始内存为1024m.此值可以设置与-Xmx相同,以避免 ...
- vm ware 虚拟WIN10 时,chrome ,cent browser 显示异常,花屏
类似: 解决方法: 在VM WARE 显卡设置中关闭"加速3D图形". -
- MySql 中 select 使用
MySql select 多种查询方式 前言 在数据库使用过程中,使用最多的场景就是查询数据,所以今天我们总结一下常用用的查询 简单查询 带条件查询 多条件查询 输出指定字段查询 分组查询 查询结果排 ...
- c++ 线程使用
C++中的线程可以通过标准库提供的thread类实现.该类提供了创建和管理线程的方法和函数. 创建线程的方法: #include <thread> ... // 创建一个线程,其执行函数为 ...
- uni-app apple store 上传新版本审核被拒绝 Guideline 5.1.1
- Legal - Privacy - Data Collection and Storage We noticed that your app requests the user's consent ...
- 【题解】CatOJ C0458C 滑动窗口定期重构
标题 trick 的名字我也不知道是什么,就这样吧. 首先有显然的 dp 式子:\(f(i)=\min \{f(j) \times \max\{a_{j+1},\dots,a_i\}\}\).考虑怎么 ...
- 初识python day1记录
程序语言中的分类 在程序中有分为高级语言Java python go与低级语言C 汇编,每种语言都有自己的规则,但是最终目的都是给计算机识别的,所以他的底层肯定是一些二进制010101,像java/p ...
- python json反序列化为对象
在Python中,将JSON数据反序列化为对象通常意味着将JSON格式的字符串转换为一个Python的数据结构(如列表.字典)或者一个自定义的类实例.虽然Python的标准库json模块不提供直接将J ...
- 视觉语言跨模态特征语义相似度计算改进--表征空间维度语义依赖感知聚合算法 ACM MM
论文链接:Unlocking the Power of Cross-Dimensional Semantic Dependency for Image-Text Matching (ACM MM23) ...
- Django部署在CENTOS7上
项目结构 /data/playback_project/├── PlayBack└── script /data/playback_project/PlayBack├── app01├── db.sq ...