【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,offsetorderBy它们本身都是非常简单和强大的方法,

但 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

分类: 【Active JDBC】

好文要顶 关注我 收藏该文 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值