java持久層框架有哪些?
java持久層框架,網(wǎng)上隨便搜了搜,就有Hibernate、MyBatis、Spring Data、TopLink等,而我最常用的就是MyBatis,Hibernate也使用過(guò)一段時(shí)間,很意外沒(méi)有搜到 iBatis ,因?yàn)槲覀儾糠志S護(hù)應(yīng)用的持久層框架還處于 iBatis 的情況。當(dāng)然,由于安全因素,直接拼 SQL 的使用最原始的 JdbcTemplate 的應(yīng)用是沒(méi)有的。持久層框架,也稱 ORM 框架,對(duì)象關(guān)系映射(ORM,Object Relational Mapping)是一種功能,用于通過(guò)將對(duì)象狀態(tài)映射到數(shù)據(jù)庫(kù)列來(lái)開(kāi)發(fā)和維護(hù)對(duì)象和關(guān)系數(shù)據(jù)庫(kù)之間的關(guān)系。它能夠輕松處理(或執(zhí)行)各種數(shù)據(jù)庫(kù)操作,如插入,更新,刪除等。
最常用的就是 Mybatis ,MyBatis 可以通過(guò)簡(jiǎn)單的 XML 或注解來(lái)配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄。在 spring boot + gradle 的技術(shù)體系下使用 Mybatis 的的依賴示例如下:
dependencies {
compile "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0"
compile "mysql:mysql-connector-java:5.1.43"
}
# yml 配置文件,
server:
spring:
#數(shù)據(jù)庫(kù)連接配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false
username: root
password: 123456
filters: stat
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#mybatis的相關(guān)配置
mybatis:
#mapper配置文件
type-aliases-package: com.wei.you.comb.entity
mapper-locations: classpath*:/mappings/*.xml,classpath*:/mappings/**/*.xml
#開(kāi)啟駝峰命名
configuration:
map-underscore-to-camel-case: true
用過(guò)一段時(shí)間依賴 Hibernate 的 Spring Data JPA,對(duì)其影響最深的是 對(duì)象間的關(guān)聯(lián)關(guān)系,各種聯(lián)合主鍵和外鍵注解,對(duì)使用者解決相關(guān)問(wèn)題的能力有一定的要求,其大致有3種使用方法。
1.查詢創(chuàng)建Query Creation。Spring Data Jpa通過(guò)解析方法名創(chuàng)建查詢,框架在進(jìn)行方法名解析時(shí),會(huì)先把方法名多余的前綴find…By, read…By, query…By, count…By以及get…By截取掉,然后對(duì)剩下部分進(jìn)行解析,第一個(gè)By會(huì)被用作分隔符來(lái)指示實(shí)際查詢條件的開(kāi)始。 如:
User findByUsername(String username);
List<User> findByUsernameIgnoreCase(String username);
List<User> findByUsernameLike(String username);
該方法上還支持原生查詢Native Queries
@Query(value = "select * from tb_user u where u.email = ?1", nativeQuery = true)
User queryByEmail(String email);
@Query(value = "select * from tb_user u where u.email = :email", nativeQuery = true)
User queryByEmail(@Param("email") String email);
2.hql查詢方式。
Session session=HibernateUtil.getCurrentSession();
Transaction tx=session.beginTransaction();
//hql簡(jiǎn)單查詢 注意 hql中不支持 直接使用*號(hào) 但在聚合函數(shù)中 比如 count(*) 可以
List<Customer> list = session.createQuery("from Customer").list();
tx.commit();
3.Criteria查詢方式
Session session=HibernateUtil.getCurrentSession();
Transaction tx=session.beginTransaction();
//簡(jiǎn)單查詢
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
以上幾種,在不同的業(yè)務(wù)需求中都有相應(yīng)的使用場(chǎng)景,但整體感覺(jué)其學(xué)習(xí)成本較高,執(zhí)行效率不高,也可能是學(xué)的不夠深入吧。
最后,借用網(wǎng)上找到的一種觀點(diǎn)來(lái)結(jié)尾,也是我比較認(rèn)同的:對(duì)這個(gè)東東不用糾結(jié),團(tuán)隊(duì)用啥你用啥就得了,出問(wèn)題有同事協(xié)助解決,如果和團(tuán)隊(duì)的技術(shù)棧不一致,出問(wèn)題就只能自己補(bǔ)坑,花費(fèi)大量的時(shí)間還不一定有結(jié)果。
作者:夕陽(yáng)雨晴,歡迎關(guān)注我的頭條號(hào):偶爾美文,主流Java,為你講述不一樣的碼農(nóng)生活。