# 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 ```