# dream-orm
**Repository Path**: wangfeiok/dream-orm
## Basic Information
- **Project Name**: dream-orm
- **Description**: 一个优雅、无依赖、高性能的orm框架
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://dream-orm.com
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 11
- **Created**: 2024-03-14
- **Last Updated**: 2024-03-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# dream-orm: 一个优雅、无依赖、高性能的orm框架
# dream-orm介绍
dream-orm是一个自主研发类似mybatis的持久层框架。
轻便,它非常轻量,不依赖第三方jar包 灵巧,拥有极高的性能与灵活性,在满足类Mybatis框架功能上,它还首创SQL方言翻译,
通过SQL方言转换技术(几乎无性能损耗)只要你会MySQL的SQL写法,那么你可以无缝移植到非MySQL数据库。
极速开发,内置的QueryDef不仅帮助开发者极大减少SQL编写的工作同时,减少出错的可能性,而且基本上支持MySQL所有函数,支持常见的SQL语句改写成java链式形式。
dream-orm不仅能够极大的提高开发效率与开发体验,让开发者有更多的时间专注于自己的事,而且还能根据业务进行函数化封装。
## 特性
**跨平台**:mysql语法无缝移植到非MySQL数据库,首创SQL方言翻译
**轻量级**:零依赖且每个模块经过深度调优,性能天花板
**灵活**:接口代替参数实现功能开关,给予更大的开放空间
**函数化**:接口代替参数实现功能开关,给予更大的开放空间
**包罗万象**:持续开发不同形式的接口调用形式,链式\链式强化操作、mapper操作、模板操作等,满足不同人的使用习惯
**更上一层楼**:基于表做缓存隔离,任意查询皆会缓存且任意操作只会清空与操作有关表的缓存
# 快速开始
在开始之前,我们假定您已经:
- 熟悉Java环境配置及其开发
- 熟悉关系型数据库,比如 MySQL
- 熟悉Spring Boot及相关框架
- 熟悉Java构建工具,比如 Maven
## Hello World
**第一步:创建数据库表**
```sql
CREATE TABLE account
(
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
tenant_id INT(11) NULL COMMENT '租户',
dept_id int(11) NULL COMMENT '所在部门',
del_flag int(11) NULL COMMENT '删除标志',
PRIMARY KEY (id)
);
```
**第二步:创建springboot项目,并添加maven依赖**
```xml
com.dream-orm
dream-orm-spring-boot-starter
${dream-orm.version}
```
**第三步:配置table扫描和mapper扫描**
```java
@FlexAPT
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
/**
* 配置SQL输出
*
* @return
*/
@Bean
public Listener[] listeners() {
return new Listener[]{new DebugListener()};
}
/**
* 配置扫描的table和mapper路径
*
* @return
*/
@Bean
public ConfigurationBean configurationBean() {
String packageName = this.getClass().getPackage().getName();
List pathList=Arrays.asList(packageName);
ConfigurationBean configurationBean = new ConfigurationBean(pathList, pathList);
return configurationBean;
}
}
```
**第四步:编写Table实体类**
```java
@Table("account")
public class Account {
@Id
@Column("id")
private Integer id;
@Column(value = "name")
private String name;
@Column("age")
private Integer age;
@Column("email")
private String email;
@Column("tenant_id")
private Integer tenantId;
@Column("dept_id")
private Integer deptId;
@Column("del_flag")
private Integer delFlag;
}
```
**第五步:编写View实体类**
不同于Table实体类,Table实体类等价于数据库表所有字段,而View实体类是指数据库表部分字段,因为一些业务场景,仅仅需要业务部分字段就够啦
```java
@View(Account.class)
public class AccountView {
private Integer id;
private String name;
private Integer age;
private String email;
}
```
**第六步:添加测试类,进行功能测试**
**模板查询**
TemplateMapper在springboot项目里使用@Autowired,solon使用@Inject注解即可自动装配
```java
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloWorldApplication.class)
public class HelloWorldTemplateTest {
@Autowired
private TemplateMapper templateMapper;
/**
* 测试主键查询
*/
@Test
public void testSelectById() {
AccountView accountView = templateMapper.selectById(AccountView.class, 1);
System.out.println("查询结果:"+accountView);
}
}
```
**控制台输出**
```tex
方法:com.dream.helloworld.HelloWorldTest.testSelectById
语句:SELECT account.id,account.name,account.age,account.email FROM account WHERE account.id=?
参数:[1]
用时:30ms
查询结果:AccountView{id=1, name='Jone', age=18, email='test1'}
```
**链式查询**
```java
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloWorldApplication.class)
public class HelloWorldFlexTest {
@Autowired
private FlexMapper flexMapper;
/**
* 测试主键查询
*/
@Test
public void testSelectById() {
Query query = select(account.accountView).from(account).where(account.id.eq(1));
AccountView accountView = flexMapper.selectOne(query, AccountView.class);
System.out.println("查询结果:" + accountView);
}
}
```
```tex
方法:null
语句:SELECT `account`.`id`,`account`.`name`,`account`.`age`,`account`.`email` FROM `account` WHERE `account`.`id`=?
参数:[1]
用时:36ms
查询结果:AccountView{id=1, name='Jone', age=18, email='test1'}
```
**链式强化查询**
```java
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloWorldApplication.class)
public class HelloWorldFlexChainTest {
@Autowired
private FlexChainMapper flexChainMapper;
/**
* 测试主键查询
*/
@Test
public void testSelectById() {
AccountView accountView = flexChainMapper
.select(account.accountView)
.from(account)
.where(account.id.eq(1))
.one(AccountView.class);
System.out.println("查询结果:" + accountView);
}
}
```
```tex
方法:null
语句:SELECT `account`.`id`,`account`.`name`,`account`.`age`,`account`.`email` FROM `account` WHERE `account`.`id`=?
参数:[1]
用时:126ms
查询结果:AccountView{id=1, name='Jone', age=18, email='test1'}
```
以上的 [示列](https://gitee.com/moxiaoai/dream-orm/tree/master/dream-orm-hello-world) 中, `ACCOUNT` 为 dream-orm通过 APT 自动生成,只需通过静态导入即可,无需手动编码。更多查看 APT文档。当然除了以上写法外,也支持mapper接口写法,这里不举例展示,具体详情以及更多写法请点击[示列](https://gitee.com/moxiaoai/dream-orm/tree/master/dream-orm-hello-world) 查看