同一套代碼適配多種數據庫解決方案
概要
通常在Java Web開發初期,技術選型搭框架時,往往都針對選定好的一個庫類型進行開發,比如oracle、sqlserver、mysql等,傳統的mybatis都有固化的sql,如果要換個庫,不同庫類型的語法不同,就要重新適配修改sql,因此,持久層框架可以選用Hibernate,結合spring-data-jpa,或Mybatis-plus,方便了CRUD的操作,無需配置xml寫sql,在DAO層繼承類,實現操作方法。當然,對于復雜的子查詢再關聯,也都有相應處理方法,也都可以寫原生sql。
整體架構流程
spring+springMVC+hibernate+spring-data-jpa
開源的基礎數據平臺就是這個結構
或springboot+hibernate+spring-data-jpa
或springboot+mybatis-plus
開源的Jeecg就是這個結構
技術名詞解釋
- spring-data-jpa
是Spring提供的一個用于簡化數據訪問層的框架。它是基于JPA規范實現的,并在Hibernate之上提供了更高層次的抽象,使得開發者可以更加方便地進行數據庫操作。
- Mybatis-plus
簡稱MP,是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變,為簡化開發、提高效率而生。它繼承了MyBatis的所有特性并擁有MyBatis的所有解決方案。
技術細節
- spring-data-jpa使用
// User.java (使用JPA注解的實體類)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
// ...
}
// DAO層 UserRepository.java (繼承JpaRepository)
public interface UserRepository extends JpaRepository<User, Long> {
// 可以自定義查詢方法,例如:
User findByUsername(String username);
}
// UserService.java (使用Spring Data JPA的Service層)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
public User getUserByUsername(String username) {
return userRepository.findByUsername(username);
}
}
- Mybatis-plus使用
// User.java (實體類)
@Data
@TableName("users")
public class User {
private Long id;
private String username;
// ...
}
// DAO層 UserMapper.java (繼承BaseMapper)
public interface UserMapper extends BaseMapper<User> {
// 可以自定義方法,如果需要的話
}
// UserService.java (使用MyBatis-plus的Service層)
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
小結
JPA更適合事務性系統,MyBatisPlus更適合做分析型系統。
附:
JPA支持接口規范方法名查詢,一般查詢方法以 find、findBy、read、readBy、get、getBy為前綴,JPA在進行方法解析的時候會把前綴取掉,然后對剩下部分進行解析。
各實體的屬性均可拼接作為方法名,比如實體有code,name 兩個屬性,查詢的方法就是
findByCodeAndName(code,name)
浙公網安備 33010602011771號