Mybatis的学习1
ORM
关系数据库需要按对象来处理,出现ORM设置,列对应类的属性,行对应对应类的实例,也就是每一行对应一个新的实例,对应类是需要实现序列化(implements Serializable - import java.io.Serializable),这些对应类称为持久化对象,是数据层DAO,Domain,向下直接对应数据库,向上接服务层,它们的属性是对应数据库的列,方法是对数据库的操作,比如,先设定一个公共基类,可以完成,一般表的createby,createddate,modifiedby,modifieddate这4个常用字段的添加,最好将分页属性也放进去,再将这些对应类建立,这些对应类应该是继承基类,并且,对应数据表的(可以是单表结构,单表查询结果,多表查询结果,查询结果添加自定义字段的,查询结果进行转换过的等等 - 引申为po,dto),对这些类的方法中实现具体操作(可以建立接口( interface IBasicService<T> ->CURD同find、getAll,getCount。。。 )同DAOImpl这样的实现类 (
引申扩展服务层(serice类,封装业务流程)一般流程:
1.Interface:
public interface ICustomerService {
定义各种方法,只是定义,实现可以交代其他人来写了。。。
PageInfo<CustomerContactVo> queryCustomerContactList(CustomerContactVo contactVo) throws Exception;
}
2.service:
实现接口,实现接口中定义的方法,对数据层进行调用:
public class CustomerServiceImpl implements ICustomerService{
private static final Logger logger = LoggerFactory.getLogger(CustomerServiceImpl.class);
...
//对DAO进行调用,其中interface ICustomerDao -> CustomerDaoImpl implements ICustomerDao {}
@Resource
private ICustomerDao customerDao; //下面方法没有用到,只是举个DAO层例子,这个DAO接口实现的方法将对数据库进行操作,对业务需求进行实现,引申为服务层用DAO接口方式同数据层解耦(业务层不依赖持久层),这个接口可以选择任何数据库来实现,高层不依赖低层(依赖倒转原则),依赖抽象,面对接口编程。
...
@Override
public PageInfo<CustomerContactVo> queryCustomerContactList(CustomerContactVo contactVo) throws Exception {
PageHelper.startPage(contactVo.getPage(), contactVo.getRows());
PageInfo<CustomerContactVo> customerContact = null;
try {
if (!StringUtils.isBlank(contactVo.getApplicationQuery())) {
UserInfo userInfo = (UserInfo) Core.cache().get(contactVo.getToken());
if (null != userInfo) {
contactVo.setCreatedBy(userInfo.getId());
}
}
customerContact = new PageInfo<CustomerContactVo>(customerDao.queryCustomerContactById(contactVo));
} catch (Exception e) {
// DAO exception 处理
}
return customerContact;
}
}
3.api (servlet/controller/action):
@Controller
@RequestMapping(value = "/customer")
@Api(value = "/customer")
public class CustomerApi extends BasicApi<Object> {
@Reference(timeout = 100000)
private ICustomerService customerService; //同上面服务实现DAO接口实现一样,这里是表示层对服务接口的调用,让表示层不依赖于业务层
@RequestMapping(value = "/queryCustomerContactList", method = RequestMethod.POST)
public @ResponseBody Object queryCustomerContactList(CustomerContactVo contactVo, HttpServletRequest request)
throws JsonProcessingException {
if (ObjectUtils.isEmpty(contactVo)) {
throw new Exception("E04", "", null);
}
Object object = sendDataTablePageAjaxData(customerService.queryCustomerContactList(contactVo));
return object;
}
}
4.Html
Html,css,javascript,Jquery,bootstrap,vue,ios,android...
->XML JSON
->HTTP AJAX
->HTTP
)来做,也可以不用,如果考虑多个数据库切换最好做,比如:mssqlImpl implements IBasicService()):
public class BasicDomain implements Serializable {
private static final long serialVersionUID = 6686489176603998566L;
/**
* 前台传入参数:当前页
*/
private int page = 1;
/**
* 前台传入参数:每页页数
*/
private int rows = 10;
/**
* 前台传入参数:排序字段
*/
private String sidx;
/**
* 前台传入参数:排序类型
*/
private String sord;
/**
* 数据库分页参数:当前页
*/
private int start;
/**
* 数据库分页参数:每页页数
*/
private int limit = 10;
/**
* 创建时间
*/
private Date createdDate;
/**
* 创建人
*/
private String createdBy;
/**
* 修改时间
*/
private Date modifiedDate;
/**
* 修改人
*/
private String modifiedBy;
。。。
getter/setter
。。。
}
//PO
public class Customer extends BasicDomain {
/**
*
*/
private static final long serialVersionUID = 1L;
private String customerID;
private Long accountID;// 客户ID
private String name;// 名称
private String number;// 编号
。。。
//非实体关联关系属性,仅供方便传参
private CustomerExt customerExt;
private CustomerBankInfo customerBankInfo;
//可以List VO ,VO是业务层的数据传递,也是前端显示数据,比如,DTO(DTO类封装业务实体对象)是0同1,那么VO是男同女,view同model要避免强耦合,
private List<CustomerAddressVO> customerAddressList;
public CustomerBankInfo getCustomerBankInfo() {
return customerBankInfo;
}
public List<CustomerAddressVO> getCustomerAddressList() {
return customerAddressList;
}
public void setCustomerBankInfo(CustomerBankInfo customerBankInfo) {
this.customerBankInfo = customerBankInfo;
}
public void setCustomerAddressList(List<CustomerAddressVO> customerAddressList) {
this.customerAddressList = customerAddressList;
}
。。。
}
一般带上下面3个:
@Override
public int hashCode() {
@Override
public boolean equals(Object obj) {
@Override
public String toString() {