Hibernate VS Mybatis 的SQL不灵活通病如何解决?
生活随笔
收集整理的這篇文章主要介紹了
Hibernate VS Mybatis 的SQL不灵活通病如何解决?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
JAVA開發(fā)者目前主流的持久層是Mybatis和Hibernate。Mybatis靈活好控制,優(yōu)化SQL更方便,一般互聯(lián)網(wǎng)項目用的比較多;Hibernate更智能,基于單表和復雜關系表的SQL可以自動生成,開發(fā)效率更高,但是針對復雜SQL,hibernate能力不足,存在性能不足和不夠靈活的問題。?
? ? ? 這個時候大家就想到集成mybatis,但是一個項目既用hibernate又用mybatis,顯得很重,事務也不好控制。大家常規(guī)的做法是采用springjdbc來實現(xiàn)原生SQL編寫,但是也存在一個問題,SQL無法分離也沒有邏輯標簽能力。
? ? ?為了解決這個問題,Jeecg針對springjdbc+freemaker做了封裝,出了這么一個輕量級持久層,可以讓Hiberate擁有mybatis一樣SQL靈活能力,同時支持事務統(tǒng)一管理和SQL標簽能力。
? ? ??
MiniDao 簡介及特征
MiniDao 是一款輕量級JAVA持久層框架,基于 SpringJdbc + freemarker 實現(xiàn),具備Mybatis一樣的SQL分離和邏輯標簽能力。Minidao產(chǎn)生的初衷是為了解決Hibernate項目,在復雜SQL具備Mybatis一樣的靈活能力,同時支持事務同步。
具有以下特征:
- O/R mapping不用設置xml,零配置便于維護
- 不需要了解JDBC的知識
- SQL語句和java代碼的分離
- 只需接口定義,無需接口實現(xiàn)
- SQL支持腳本語言(強大腳本語言,freemarker語法)
- 支持與hibernate輕量級無縫集成
- 支持自動事務處理和手動事務處理
- 性能優(yōu)于Mybatis
- SQL標簽采用Freemarker的基本語法
接口定義[EmployeeDao.java]
@MiniDao public interface EmployeeDao {@Arguments({ "employee"})@Sql("select * from employee")List<Map<String,Object>> getAll(Employee employee);@Sql("select * from employee where id = :id")Employee get(@Param("id") String id);@Sql("select * from employee where empno = :empno and name = :name")Map getMap(@Param("empno")String empno,@Param("name")String name);@Sql("SELECT count(*) FROM employee")Integer getCount();int update(@Param("employee") Employee employee);void insert(@Param("employee") Employee employee);@ResultType(Employee.class)public MiniDaoPage<Employee> getAll(@Param("employee") Employee employee,@Param("page") int page,@Param("rows") int rows);}
SQL文件[EmployeeDao_getAllEmployees.sql]
SELECT * FROM employee where 1=1 <#if employee.age ?exists> and age = :employee.age </#if> <#if employee.name ?exists> and name = :employee.name </#if> <#if employee.empno ?exists> and empno = :employee.empno </#if>###接口和SQL文件對應目錄
MiniDao在spring中配置
<!-- MiniDao動態(tài)代理類 --> <bean id="miniDaoHandler" class="org.jeecgframework.minidao.factory.MiniDaoBeanScannerConfigurer"><!-- 是使用什么字母做關鍵字Map的關鍵字 默認值origin 即和sql保持一致,lower小寫(推薦),upper 大寫 --><property name="keyType" value="lower"></property><!-- 格式化sql --><property name="formatSql" value="false"></property><!-- 輸出sql --><property name="showSql" value="false"></property><!-- 數(shù)據(jù)庫類型 --><property name="dbType" value="mysql"></property><!-- dao地址,配置符合spring方式 --><property name="basePackage" value="examples.dao.*"></property><!-- 使用的注解,默認是Minidao,推薦 Repository--><property name="annotation" value="org.springframework.stereotype.Repository"></property><!-- Minidao攔截器配置 --><property name="emptyInterceptor" ref="minidaoInterceptor"></property> </bean>測試代碼
public class Client { public static void main(String args[]) {BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");EmployeeDao employeeDao = (EmployeeDao) factory.getBean("employeeDao");Employee employee = new Employee();String id = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();employee.setId(id);employee.setEmpno("A001");employee.setSalary(new BigDecimal(5000));employee.setBirthday(new Date());employee.setName("scott");employee.setAge(25);//調(diào)用minidao方法插入employeeDao.insert(employee); } }技術交流
- 源碼下載: https://github.com/zhangdaiscott/MiniDao
- 論 壇:?www.jeecg.org
- 郵 箱:?jeecg@sina.com
- QQ交流群:325978980、143858350
總結
以上是生活随笔為你收集整理的Hibernate VS Mybatis 的SQL不灵活通病如何解决?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 5434(状态压缩+矩阵优化)
- 下一篇: jeecg 服务器 + linux +