概述
使用MyBatis 已经很长时间了,越来越返现MyBatis 真的是一个非常好用的框架。
工作这些年,使用过 Hibernate spring-valuelist MyBatis 这三个市面上主流的框架,也是用过国内的一些产品,记得四川成都那边好像有一个团队也开发了一个框架,看过,但是没有真正的在实际项目中使用过,好像在国内的反响还不错。
Hibernate
首先说说我最早使用,曾经也是我十分热爱的框架 Hibernate :
首先说这个框架的主旨思想是要从层程序员的脑子中把表这一概念去除,脑子中只保留对象的概念。到现在我还一直认为这是一个非常先进的理念,这样有一个非常明显的好处,就是可以让写代码想说话一样流畅,因为所有的业务逻辑都通过写代码的方式实现,然后写程序就像学了一门外语,只要你把这门外语学会了,那简直就是行云流水一般的顺畅。但是,凡事都怕但是,但是就是她的思想太先进了,实际上到目前为止,与数据的交互一直是一个瓶颈,无论怎么做都不能实现几乎无延迟的数据检索,Hibernate 要做到好用就必须与数据产生大量的交互,截止到现在我们在数据存储和检索方面还做不到接近于无感知,而且可以断定在将来相当长的一段时间内也不太可能做得到。要解决这一问题就必须使用手写SQL 一旦使用手写SQL,这就已经不是 Hibernate的优势了,Hibernate 手写SQL时还是相当的繁琐的,尤其是在调试别人写过的代码时,由于是在java 文件中进行的SQL拼接,导致了会出现很对的字符串拼接,使用QBC语言进行编写的代码转化成数据库可使用的SQL 更是一件非常麻烦的额事,这对开发人员来说是很不友好的事情。
valuelist
valuelist ,这个框架可能对很多人来说比较陌生,先来看一段 他的代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ":/spring-beans.dtd">
<beans>
<bean id="agentValueListHandler" singleton="true" class="net.mlw.vlh.DefaultValueListHandlerImpl">
<property name="config.adapters">
<map>
<entry key="switchConfigInfoQuery">
<bean parent="defConfig">
<property name="defaultNumberPerPage">
<value>100</value>
</property>
<property name="sql">
<value>
<![CDATA[
select
cpi.id as id,
cpi.key as key,
cpi.name as name,
cpi.status as status,
cpi.create_time as createtime,
cpi.update_time as updatetime
from switch_config_info cpi
where 1=1
/~key: and cpi.key = '[key]'~/
/~name: and cpi.name like '%[name]%'~/
/~status: and cpi.status = '[status]'~/
/~createTimeStart: and cpi.create_time >= to_date('[createTimeStart] 00:00:00','yyyy-mm-dd hh24:mi:ss') ~/
/~createTimeEnd: and cpi.create_time <= to_date('[createTimeEnd] 23:59:59','yyyy-mm-dd hh24:mi:ss') ~/
/~updateTimeStart: and cpi.update_time >= to_date('[updateTimeStart] 00:00:00','yyyy-mm-dd hh24:mi:ss') ~/
/~updateTimeEnd: and cpi.update_time <= to_date('[updateTimeEnd] 23:59:59','yyyy-mm-dd hh24:mi:ss') ~/
]]>
</value>
</property>
</bean>
</entry>
</map>
</property>
</bean>
</beans>
其中每一个 bean 都会对应一个处理类,处理对应区域内的SQL, 每一个SQL都是一个entry, entry的上层是一个map, 就是把一堆SQL放到一个Map 中, 然后通过一个handle 处理这些SQL。
下面这段代码展示了 valuelist 在 strut2中的使用
public String agentDPhoneNoAndEmailFormat() {
net.mlw.vlh.DefaultListBackedValueList valueResult = (net.mlw.vlh.DefaultListBackedValueList) getHttpRequest().getAttribute("agentDetail");
List list = valueResult.getList();
List listNewResult=new ArrayList<>();
Authorization auth = (Authorization) getSession().getAttribute(Constant.SESSION_AUTH);
if(list.size()!=0){
if(null!=auth) {
Map element =null;
for (int i = 0; i < list.size(); i++) {
element = (Map)list.get(i);
if(element!=null) {
String telephone = (String)element.get("telephone");
String support_linkphone = (String)element.get("support_linkphone");
String phoneNo = (String)element.get("phone_no");
String risk_linkphone = (String)element.get("risk_linkphone");
String email = (String)element.get("email");
element=PhoneNoAndEmailaddrFormatUtil.phoneNoReplace(telephone, element, "telephone");
element=PhoneNoAndEmailaddrFormatUtil.phoneNoReplace(support_linkphone, element, "support_linkphone");
element=PhoneNoAndEmailaddrFormatUtil.phoneNoReplace(phoneNo, element, "phone_no");
element=PhoneNoAndEmailaddrFormatUtil.phoneNoReplace(risk_linkphone, element, "risk_linkphone");
element=PhoneNoAndEmailaddrFormatUtil.emailAddrReplace(email, element, "email");
}
listNewResult.add(element);
}
}
}
return SUCCESS;
}
从代码中可以看出,valuelist 是将返回记录解析成Map对象存储在一个list中,如果需要返回自己声明的实体格式需要自己进行手动转换,当然在不需要解析成自定义bean的情况下可直接将返回值推送给前段即可,DefaultListBackedValueList 同时还会包含一些分页相关的信息。
MyBatis