# FastBuilder
**Repository Path**: wangwei123/FastBuilder
## Basic Information
- **Project Name**: FastBuilder
- **Description**: FastBuilder是一个快速开发以及高性能,高扩展性的ORM框架,灵活支持多数据库切换,读写分离,并且上手快,在DAO层开发效率节约50%以上
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 24
- **Forks**: 13
- **Created**: 2014-11-13
- **Last Updated**: 2024-08-21
## Categories & Tags
**Categories**: database-dev
**Tags**: None
## README
FastBuilder是一个快速开发的ORM框架,支持Mysql和Oracle数据库, 在DAO层开发效率节约50%以上
**FastBuilder目前支持的功能如下:**
* 1. CURD, Oracle和Mysql自动分页查询功能
* 2. 集成Spring事务管理
* 3. Model层采用约定高于配置的方式,极大简化开发流程
* 4. **代码生成工具完成,一键生成Model, Service, Controller层代码**
**后续开发计划:**
* 1. 继续优化性能
* 2. 继续追求最简开发模式
* 3. 增加批量新增,批量修改,批量删除等功能(目前不支持,只能循环单条插入等,性能不如批量快)
* 4. 完善并开源系统管理功能,包含用户管理,角色管理,权限管理等基础功能。
代码生成工具下载:http://git.oschina.net/wangwei123/FastBuilderCodeGen
**快速开始:**
* 第一步:在项目中加入FastBuilder源码:
* * 几个包文件,直接copy进项目中即可
* 第二步:在Spring配置文件中配置数据源:
```xml
```
* 主要配置上面两步后,可以进入开发了,本框架依赖Spring框架,所以项目中必须引入spring框架:
**模型类创建:**
* 只需要继承Model父类,在构造函数中设置主键名,表名,字段名即可
```java
//=====================================================================================
//=======================Model Layer===================================================
//=====================================================================================
package com.ch.sys.model;
import com.ch.fastbuilder.model.Model;
public class Employee extends Model {
public static String TABLE = "employee";
public static String ID = "id";
public static String ACCOUNT = "account";
public static String PASSWORD = "password";
public static String NICKNAME = "nickname";
public static String GENDER = "gender";
public static String HEAD_URL = "head_url";
public static String TYPE = "type";
public static String CREATED = "created";
public Employee() {
super.setPrimaryKey(ID);
super.setTableName(TABLE);
//super.setGenerationType(GenerationType.UUID);
super.setGenerationType(GenerationType.IDENTITY);
super.setColumns(ID,ACCOUNT,PASSWORD,NICKNAME,GENDER,HEAD_URL,TYPE,CREATED);
}
public static Employee getByAccountPwd(String account, String password) {
Map params = new HashMap();
params.put("account", account);
params.put("password", SHA1.signature(password));
String sql = "account=:account and password=:password";
Employee employee = Model.Where(sql, params).get(Employee.class);
return employee;
}
}
//=====================================================================================
//=======================Service Layer=================================================
//=====================================================================================
@Service
public class EmployeeService {
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public Employee getByAccountPwd(String account, String password) {
Employee employee = Employee.getByAccountPwd(account, password);
return employee;
}
}
//=====================================================================================
//=======================Controller Layer with Spring MVC==============================
//=====================================================================================
@Controller
@RequestMapping(Constants.REST_WEB_URL)
public class EmployeeController extends BaseController {
@Autowired
EmployeeService employeeService;
@Autowired
RoleService roleService;
/**
* 员工登陆
* @return
*/
@ResponseBody
@RequestMapping(value="/employee/login",method=RequestMethod.POST)
public Response login(@RequestBody Employee model, HttpServletRequest request) {
Response response = Response.newResponse();
String account = model.getString(Employee.ACCOUNT);
String password = model.getString(Employee.PASSWORD);
Employee employee = employeeService.getByAccountPwd(account, password);
if(employee == null) {
return response.ACCOUNT_PASS_ERROR();
}
Role role = roleService.getByEmployeeId(employee.getLong(Employee.ID));
employee.set("role", role);
SessionUtils.set(request, employee);
return response.ok(employee);
}
}
```
**关联查询:**
```java
public class Role extends Model {
/**
*
*/
private static final long serialVersionUID = 1L;
public static String TABLE = "role";
public static String ID = "id";
public static String NAME = "name";
public static String CREATED = "created";
public Role() {
super.setPrimaryKey(ID);
super.setTableName(TABLE);
//super.setGenerationType(GenerationType.UUID);
super.setGenerationType(GenerationType.IDENTITY);
super.setColumns(ID, NAME, CREATED);
}
public static PageResult findByPage(ParamMap params) {
BuilderModel builder = Model.InitParams(params);
PageResult pageResult = builder.findPage(Role.class);
return pageResult;
}
public static Role getByEmployeeId(Long employeeId) {
Map params = new HashMap();
params.put("employee_id", employeeId);
BuilderModel builder = Model.InitParams(params);
builder.select("r.id, r.name, r.created");
builder.from("employee_role emr");
builder.innerJoin("role r on emr.role_id = r.id");
builder.where("emr.employee_id = :employee_id");
Role role = builder.get(Role.class);
return role;
}
}
```
**新增一条数据:**
* 从客户端post过来的数据,Model从request中获取,然后转换为Role对象
* 任何一个继承Model的对象,可以直接调用create进行新增操作
```java
//新增操作
public void add() {
Employee employee = new Employee();
employee.set(Employee.ACCOUNT, "wangwei");
employee.set(Employee.PASSWORD, "111111");
employee.create();
//或者这样执行create方法
Model.Create(employee);
}
```
**修改一条数据:**
* 从客户端post过来的数据,Model从request中获取,然后转换为Role对象
* 任何一个继承Model的对象,可以直接调用update进行新增操作
```java
//修改操作
public void update() {
Employee employee = new Employee();
employee.set(Employee.ID, 1);
employee.set(Employee.ACCOUNT, "LiMing");
employee.set(Employee.PASSWORD, "123456");
employee.update();
//或者这样执行update方法
Model.Update(employee);
}
```
**删除一条数据:**
* 从客户端post过来的数据,Model从request中获取,然后转换为Role对象
* 任何一个继承Model的对象,可以直接调用delete进行新增操作
```java
//删除操作
public void delete() {
Employee employee = new Employee();
employee.set(Employee.ID, 1);
employee.delete();
//或者这样执行delete方法
Model.Delete(employee);
//或者这样执行delete方法
//Model.Delete(id, Employee.class);
Model.Delete(1, Employee.class);
}
```
**事务管理:**
```java
@Service("roleService")
public class RoleService {
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public Response findPage(ParamMap param) {
Response response = Response.newResponse();
PageResult pageResult = Role.findByPage(param);
return response.setPageResults(pageResult);
}
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public Role getByEmployeeId(Long employeeId) {
Role role = Role.getByEmployeeId(employeeId);
return role;
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public Response add(Role role) {
Response response = Response.newResponse();
Timestamp time = new Timestamp(System.currentTimeMillis());
role.set(Role.CREATED, time);
role.create();
return response.OK();
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public Response update(Role role) {
Response response = Response.newResponse();
role.update();
return response.OK();
}
}
```
**单条数据查询:**
```java
package com.ch.sys.service;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.ch.fastbuilder.model.Model;
import com.ch.sys.model.Employee;
import com.ch.sys.utils.SHA1;
@Service
public class EmployeeService {
public Employee getByAccountPwd(String account, String password) {
Map params = new HashMap();
params.put("account", account);
params.put("password", SHA1.signature(password));
String sql = "account=:account and password=:password";
Employee employee = Model.Where(sql, params).get(Employee.class);
return employee;
}
}
```
**分页查询:**
* Model.InitParams(request),只需要客户端传入pageIndex和pageSize,可以自动分页
```java
public static PageResult findByPage(ParamMap params) {
BuilderModel builder = Model.InitParams(params);
PageResult pageResult = builder.findPage(Role.class);
return pageResult;
}
* 或者这样分页查询
List roles = Model.Limit(0, 10).list(Role.class);
* 或者这样分页查询
Map params = new HashMap();
params.put("id", 5);
params.put("date", new Date());
List roles = Model.Where("role_id > :id and created < :date", params).limit(1, 10).list(Role.class);
* 这么写太长了么?可以这么写
BuilderModel builder = Model.Where("role_id > :id and created < :date", params);
List roles = builder.limit(1, 10).list(Role.class);
* 可以自定义查询字段
List roles = Model.Select("id, name, created").limit(1, 10).list(Role.class);
```
**执行SQL语句:**
* 可以执行任何SQL语句
```java
Map params = new HashMap();
params.put("name", "修改名称");
* 修改操作
Model.SQL("update role set name = :name").withParams(params).excute();
* 查询操作
Model.SQL("select * from Role where id > :id").withParams(params).list(Role.class);
* 查询数量,更多操作这里不列出来了,具体看demo
```