日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Hibernate VS Mybatis 的SQL不灵活通病如何解决?

發(fā)布時間:2025/3/16 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);//調用minidao方法插入employeeDao.insert(employee); } }

技術交流

  • 源碼下載: https://github.com/zhangdaiscott/MiniDao
  • 論 壇:?www.jeecg.org
  • 郵 箱:?jeecg@sina.com
  • QQ交流群:325978980、143858350

總結

以上是生活随笔為你收集整理的Hibernate VS Mybatis 的SQL不灵活通病如何解决?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。