Skip to content

10、如何高效地编写后端MVC代码

Bee edited this page Jun 30, 2020 · 1 revision
  1. Dao要做什么工作

DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口。一般我们将访问数据库相关的功能放在Dao中。用Java语言,可以使用JDBC访问数据库,使用java.sql和javax.sql里的包,直接编码,但这样效率不高。所以现在软件工程师们一般都使用ORM工具,如Hibernate,Mybatis,还有在互联网高速发展背景下出现的Bee.

  Hibernate,Mybatis一般都需要写Javabean,还有xml匹配文件或将注解写在Javabean。而Bee只需要纯的Javabean,甚至Javabean里都可以没有get,set方法。

 完成了与表相关的Javabean等,就是实现SQL相关的功能了。Mybatis 需要写比较多SQL语句,即使只是查单个表的信息;而Hibernate则用面向对象的方式写SQL时不够灵活。Bee是一个开箱即用的ORM框架,这些工作已由Bee的Suid,SuidRich等接口负责,程序员何需去费心这些。

  Suid suid = BeeFactory.getHoneyFactory().getSuid();
  Orders orders1 = new Orders();
  orders1.setName("Bee");
  List<Orders> list1 = suid.select(orders1); //select

看以上的程序段,就4条语句,就可以将订单表的相关信息,通过List返回了。有两个语句,还是实体相关的。下面,就让我们一起来看下,如何自动生成实体Javabean。

  1. 自动生成Javabean

public class GenBeanExam { public static void main(String[] args) { try{ String dbName=HoneyConfig.getHoneyConfig().getDbName(); // driverName,url,username,password config in bee.properties.

  GenConfig config = new GenConfig();
  config.setDbName(dbName);
  config.setGenToString(true);//生成toString方法
  config.setGenSerializable(true);

// 更改成本地的具体路径 change to your real path config.setBaseDir("D:\xxx\yyy\bee-exam\src\main\java\"); config.setPackagePath("org.teasoft.exam.bee.osql.entity");

  GenBean genBean = new GenBean(config);
  genBean.genSomeBeanFile("Orders");

// genBean.genSomeBeanFile("Orders,user"); //同时生成多个表

  } catch (BeeException e) {
     e.printStackTrace();
  }

} } 配置了数据库的driverName,url,username,password等信息,就可以生成DB表对应的Javabean了。GenBean还提供了可以一下就生成所有的表Javabean,是不是开发效率很高呀。

  1. 自动生成基于Spring的Rest代码(后端MVC代码)

    以下是一个查询历史订单信息的服务,是前后端分离的,后端利用Spring的RestController注解,返回Json格式。更为重要的是,这个类是自动生成的,而且操作别的表的数据,也是可以自动生成的,是不是开发效率很高呀。

/*

  • Copyright 2016-2020 the original author.All rights reserved.
  • Kingstar(aiteasoft@163.com)
  • The license,see the LICENSE file. */

package com.automvc.enet.order.rest;

import java.util.List;

import org.teasoft.bee.osql.BeeSQLException; import org.teasoft.bee.osql.FunctionType; import org.teasoft.bee.osql.service.ObjSQLRichService; import org.teasoft.bee.osql.service.ObjSQLService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;

import com.automvc.enet.order.entity.Orderhistory; import com.automvc.common.jquery.Result;

/**

  • @author AiTeaSoft.com
  • @since 1.0
  • Create on 2019-05-23 23:03:21 */ @RestController @RequestMapping("/orderhistory") public class OrderhistoryRest { @Autowired ObjSQLService objSQLService;

@Autowired ObjSQLRichService objSQLRichService;

@RequestMapping("/list") public Result list(Orderhistory orderhistory, @RequestParam(value = "page", defaultValue = "1", required = false) int page, @RequestParam(value = "rows", defaultValue = "20", required = false) int rows) {
Result result =new Result(); try{ String count=objSQLRichService.selectWithFun(orderhistory,FunctionType.COUNT,"*"); List list=objSQLRichService.select(orderhistory, (page-1)*rows, rows); result.setRows(list); int total=count==null?0:Integer.parseInt(count); result.setTotal(total); } catch (BeeSQLException e) { System.err.println(e.getMessage()); result.setErrorMsg(e.getMessage()); }

 return result;

}

@RequestMapping("/add") public Result insert(Orderhistory orderhistory){

Result  result =new Result();
try{
  int num=objSQLService.insert(orderhistory);
  result.setTotal(num);
  if(num<=0) result.setErrorMsg("insert failed!");
} catch (BeeSQLException e) {
  result.setErrorMsg(e.getMessage());
}
return result;

}

@RequestMapping("/edit") public Result update(Orderhistory orderhistory){ Result result =new Result(); try{ int num=objSQLService.update(orderhistory); result.setTotal(num); if(num<=0) result.setErrorMsg("update failed!"); } catch (BeeSQLException e) { result.setErrorMsg(e.getMessage()); } return result; }

@RequestMapping("/del") public Result delete(String ids) { Result result = new Result(); try { int num=objSQLRichService.deleteById(Orderhistory.class, ids); result.setTotal(num); if (num <= 0) result.setErrorMsg("delete failed!"); } catch (BeeSQLException e) { result.setErrorMsg(e.getMessage()); } return result; } }

现在我们就来看下,这个类的代码,是如何生成的。

import org.teasoft.honey.osql.autogen.GenFiles; /**

  • @author Kingstar
  • @since 1.7.2 */ public class GenFilesExam {

public static void main(String[] args) {

Map<String, String> map = new HashMap<>();
map.put("entityName1", "Orderhistory");
map.put("entityName", "orderhistory");
map.put("packageName", "com.automvc.enet.order.rest");
String basePath = "D:\\xxx\\yyy\\bee-exam\\src\\main\\java\\org\\teasoft\\exam\\bee\\osql\\autogen\\";

String templatePath = basePath + "OrderhistoryRest.java.template";
String targetFilePath = basePath + "OrderhistoryRest.java";
GenFiles.genFile(templatePath, map, targetFilePath);

System.out.println("finished!");

}

}

是不是很简单,几行代码,就可以源源不断的生成类似的代码了。后端MVC代码就应该这样用Bee的工具开发出来。

更多例子,请访问:https://gitee.com/automvc/bee-exam

或: https://github.com/automvc/bee-exam

Bee简单易用:单表操作、多表关联操作,可以不用写sql,极少语句就可以完成SQL操作;10分钟即可学会使用。

Bee功能强大:复杂查询也支持向对象方式,分页查询性能更高,一级缓存即可支持个性化优化。高级需求,还可以方便自定义SQL语句。