# ObjectiveSql
**Repository Path**: icekok/ObjectiveSql
## Basic Information
- **Project Name**: ObjectiveSql
- **Description**: ObjectiveSQL(简称: objsql,中文译为: 对象化SQL或者面向对象SQL)是一种ORM 技术在Java 中的应用,其主要思想为ActiveRecord
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://www.oschina.net/p/objectivesql
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 11
- **Created**: 2020-11-29
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
ObjectiveSQL is an ORM framework in Java based on ActiveRecord pattern, which encourages rapid development and clean, codes with the least, and convention over configuration.
### Features
- Dynamic code generation with [JSR 269](https://jcp.org/en/jsr/detail?id=269) for Java API of database access
- Full Java API of database access without coding
- Dynamically SQL programming with Java syntax, and very similar to SQL syntax
### Installation
#### IntelliJ IDEA plugin installation
Installation step: `Preferences/Settings -> Plugins -> Search with "ObjectiveSql" in market -> Install`
#### Maven dependencies installation
```xml
com.github.braisdom
objective-sql
1.3.9
```
```xml
com.github.braisdom
objsql-springboot
1.0.1
```
### Examples
ObjectiveSQL provides full example for various databases below, You can open it directly with IntelliJ IDEA as a standalone project. In fact, they are not just examples, but also unit tests of ObjectiveSQL in various databases.
[MySQL](https://github.com/braisdom/ObjectiveSql/tree/master/examples/mysql), [Oracle](https://github.com/braisdom/ObjectiveSql/tree/master/examples/oracle), [MS SQL Server](https://github.com/braisdom/ObjectiveSql/tree/master/examples/sqlserver), [SQLite](https://github.com/braisdom/ObjectiveSql/tree/master/examples/sqlite), [PostgreSQL](https://github.com/braisdom/ObjectiveSql/tree/master/examples/postgres), [Spring Boot](https://github.com/braisdom/ObjectiveSql/tree/master/examples/springboot-sample)
### Simple SQL programming without coding
```java
// You only define a domain model and fill related properties
@DomainModel
public class Member {
private String no;
@Queryable
private String name;
private Integer gender;
private String mobile;
private String otherInfo;
@Relation(relationType = RelationType.HAS_MANY)
private List orders;
}
```
```java
// You will get behaviors of query, update and delete without coding.
Member.countAll();
Member.count("id > ?", 1);
Member.queryByPrimaryKey(1);
Member.queryFirst("id = ?", 1);
Member.query("id > ?", 1);
Member.queryAll();
Member[] members = new Member[]{newMember1, newMember2, newMember3};
Member.create(newMember1);
Member.create(members);
Member.update(1L, newMember);
Member.destroy(1L);
Member.execute(String.format("DELETE FROM %s WHERE name = 'Mary'", Member.TABLE_NAME));
...
```
```java
// Querying objects with convenient methods, and it will carry the related objects
Member.queryAll(Member.HAS_MANY_ORDERS);
Member.queryByPrimary(1, Member.HAS_MANY_ORDERS);
Member.queryByName("demo", Member.HAS_MANY_ORDERS);
...
```
### Complex SQL programming
```java
// SQL programming with Java syntax without losing the features of SQL syntax
Order.Table orderTable = Order.asTable();
Select select = new Select();
select.project(sum(orderTable.amount) / sum(orderTable.quantity) * 100)
.from(orderTable)
.where(orderTable.quantity > 30 &&
orderTable.salesAt.between($("2020-10-10 00:00:00"), $("2020-10-30 23:59:59")))
.groupBy(orderTable.productId);
```
```sql
-- SQL syntax is the same as Java syntax
SELECT ((((SUM(`T0`.`amount` ) / SUM(`T0`.`quantity` ) )) * 100))
FROM `orders` AS `T0`
WHERE ((`T0`.`quantity` > 30) AND
`T0`.`sales_at` BETWEEN '2020-10-10 00:00:00' AND '2020-10-30 23:59:59')
GROUP BY `T0`.`product_id`
```
See more:
- [Count order by distinct member, and summary amount and quantity of order](https://github.com/braisdom/ObjectiveSql/blob/master/examples/springboot-sample/src/main/java/com/github/braisdom/objsql/sample/model/Member.java#L41)
- [Calculate LPLY(Same Period Last Year) and LP(Last Period) of products sales for a while](https://github.com/braisdom/ObjectiveSql/blob/master/examples/springboot-sample/src/main/java/com/github/braisdom/objsql/sample/model/Product.java#L45)