迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:spring-data-ebean开源软件地址:https://gitee.com/hexagonframework/spring-data-ebean开源软件介绍:spring-data-ebean
[QQ群: 635113788]
Spring Data项目的主要目标是使构建使用DDD仓储接口与实现的Spring应用程序变得更加容易。此模块是基于Ebean ORM(轻量级JPA)的仓储层实现。通过使用此模块,你可以在基于Ebean ORM下使用Spring Data模式带来的便利性。如果你还没有接触过Spring Data或Ebean ORM,建议先了解下该项目。 支持的一些特性
实现的场景
为什么选择Ebean ORM基于JPA注解的轻量级ORM实现,支持Mybatis不支持的实体关联,但相比Hibernate/JPA具有Mybatis的查询灵活性,支持查询partial objects。对于实现领域模型仓储接口的聚合根实体保存(保存聚合根实体同时保存聚合根上的关联实体、值对象)和partial objects等技术要求,Ebean都非常适用。 我选择关系型数据持久化框架的基本原则:
框架优缺点比较Hibernate/JPA
JDBC Template
jOOQ
MyBatis
EBean
快速开始建立maven项目,建议使用spring boot和spring-data-ebean-spring-boot建立web项目 实例:spring-boot-data-ebean-samples 1、创建一个表格实体类或SQL实体类或DTO类: 表格实体: @Entity@Getter@Setterpublic class User { @Id @GeneratedValue private Integer id; private String firstname; private String lastname; @Column(nullable = false, unique = true) private String emailAddress;} SQL实体: Sql实体: @Entity@Sql@Getter@Setterpublic class UserInfo { private String firstName; private String lastName; private String emailAddress;} POJO DTO: @Getter@Setterpublic class UserDTO { private String firstName; private String lastName; private String emailAddress;} 2、创建一个仓储接口 public interface UserRepository extends EbeanRepository<User, Long> { @Query("where emailAddress = :emailAddress order by id desc") User findUserByEmailAddressEqualsOql(@Param("emailAddress") String emailAddress); /** * select fetch query细粒度控制查询字段 */ @Query("select (firstname,lastname,address) fetch manager (lastname) where lastname = :lastname order by id desc") List<User> findByLastnameOql(@Param("lastname") String lastname); @Query(nativeQuery = true, value = "select * from user where email_address = :emailAddress order by id desc") User findUserByEmailAddressEquals(@Param("emailAddress") String emailAddress); @Query(nativeQuery = true, value = "select * from user where lastname = :lastname order by id desc") List<User> findUsersByLastnameEquals(@Param("lastname") String lastname); @Query(nativeQuery = true, value = "update user set email_address = :newEmail where email_address = :oldEmail") @Modifying int changeUserEmailAddress(@Param("oldEmail") String oldEmail, @Param("newEmail") String newEmail); @Query("delete from user where emailAddress = :emailAddress") @Modifying int deleteUserByEmailAddressOql(@Param("emailAddress") String emailAddress); @Query(nativeQuery = true, value = "delete from user where email_address = :emailAddress") @Modifying int deleteUserByEmailAddress(@Param("emailAddress") String emailAddress); /** * 命名ORM/SQL查询 */ @Query(name = "withManagerById") List<User> findByLastnameNamedOql(@Param("lastname") String lastname); List<User> findAllByEmailAddressAndLastname(@Param("emailAddress") String emailAddress, @Param("lastname") String lastname);} 3、 对于使用到的命名sql查询、命名orm查询,编写XML文件: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><ebean xmlns="http://ebean-orm.github.io/xml/ns/ebean"> <entity class="org.springframework.data.ebean.sample.domain.User"> <named-query name="withManagerById"> <query> select (firstname,lastname,address) fetch manager (lastname) where lastname = :lastname order by id desc </query> </named-query> <raw-sql name="byEmailAddressEquals"> <query> select * from user where email_address = :emailAddress order by id desc </query> </raw-sql> </entity> <entity class="org.springframework.data.ebean.sample.domain.UserInfo"> <raw-sql name="userInfo"> <query> select first_name, last_name, email_address from user </query> </raw-sql> <raw-sql name="userInfoByEmail"> <query> select first_name, last_name, email_address from user where email_address = :emailAddress order by id desc </query> </raw-sql> </entity></ebean> 4、 编写你的使用代码:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = SampleConfig.class)public class UserRepositoryIntegrationTests { @Autowired UserRepository repository; @Test public void sampleTestCase() { User user = new User("Xuegui", "Yuan", "[email protected]"); user.setAge(29); user = repository.save(user); List<User> result1 = (List<User>) repository.findAll(); result1.forEach(it -> System.out.println(it)); assertEquals(1, result1.size()); assertEquals("Yuan", result1.get(0).getLastname()); assertThat(result1, hasItem(user)); List<User> result2 = repository.findByLastnameOql("Yuan"); assertEquals(1, result2.size()); assertEquals("Yuan", result2.get(0).getLastname()); assertThat(result2, hasItem(user)); List<User> result3 = repository.findUsersByLastnameEquals("Yuan"); assertEquals(1, result3.size()); assertEquals("Yuan", result3.get(0).getLastname()); User result4 = repository.findUserByEmailAddressEqualsOql("[email protected]"); assertEquals("[email protected]", result4.getEmailAddress()); User result5 = repository.findUserByEmailAddressEquals("[email protected]"); assertEquals("[email protected]", result5.getEmailAddress()); int result6 = repository.changeUserEmailAddress("[email protected]", "[email protected]"); assertEquals(1, result6); List<User> result7 = repository.findByLastnameOql("Yuan"); assertEquals("[email protected]", result7.get(0).getEmailAddress()); int result8 = repository.deleteUserByEmailAddress("[email protected]"); assertEquals(1, result8); User result9 = repository.findUserByEmailAddressEquals("[email protected]"); assertNull(result9); user = new User("Xuegui", "Yuan", "[email protected]"); user.setAge(29); user = repository.save(user); User result10 = repository.findUserByEmailAddressEquals("[email protected]"); assertNotNull(result10); int result11 = repository.deleteUserByEmailAddressOql("[email protected]"); assertEquals(1, result11); User result12 = repository.findUserByEmailAddressEquals("[email protected]"); assertNull(result12); } @Test public void testFindByExample() { User u = new User(); u.setEmailAddress("YUANXUEGUI"); List<User> result1 = repository.findAll(Example.of(u, ExampleMatcher.matchingAll() .withIgnoreCase(true) .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING))); assertEquals(1, result1.size()); assertEquals("Yuan", result1.get(0).getLastname()); assertThat(result1, hasItem(user)); List<User> result2 = repository.findAll(Example.of(u, ExampleMatcher.matchingAll() .withIgnoreCase(false) .withStringMatcher(ExampleMatcher.StringMatcher.EXACT))); assertEquals(0, result2.size()); }} 查询对象 @Data@IncludeFields("emailAddress,fullName(lastName,firstName),age")public class UserQuery { @ExprParam(expr = ExprType.CONTAINS) private String emailAddress; @ExprParam(name = "age", expr = ExprType.GE) private int ageStart; @ExprParam(name = "age", expr = ExprType.LE) private int ageEnd;}
package org.springframework.data.ebean.querychannel;import io.ebean.Query;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.ebean.sample.config.SampleConfig;import org.springframework.data.ebean.sample.domain.User;import org.springframework.data.ebean.sample.domain.UserInfo;import org.springframework.data.ebean.sample.domain.UserRepository;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.HashMap;import java.util.Map;import static org.junit.Assert.assertEquals;/** * @author Xuegui Yuan */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = SampleConfig.class)public class EbeanQueryChannelServiceIntegrationTests { // Test fixture User user; @Autowired private EbeanQueryChannelService ebeanQueryChannelService; @Autowired private UserRepository repository; @Before public void initUser() { repository.deleteAll(); user = new User("QueryChannel", "Test", "[email protected]"); user.setAge(29); user = repository.save(user); } @Test public void createSqlQueryMappingColumns() { String sql1 = "select first_name, last_name, email_address from user where last_name= :lastName"; String sql2 = "select first_name as firstName, last_name as lastName, email_address as emailAddress from user where last_name= :lastName"; Map<String, String> columnsMapping = new HashMap<>(); columnsMapping.put("first_name", "firstName"); columnsMapping.put("last_name", "lastName"); Query<UserInfo> query1 = ebeanQueryChannelService.createSqlQuery(UserInfo.class, sql1); Query<UserInfo> query2 = ebeanQueryChannelService.createSqlQuery(UserInfo.class, sql2); Query<UserInfo> query3 = ebeanQueryChannelService.createSqlQueryMappingColumns(UserInfo.class, sql1, columnsMapping); query1.setParameter("lastName", "Test"); query2.setParameter("lastName", "Test"); query3.setParameter("lastName", "Test"); UserInfo userInfo1 = query1.findOne(); UserInfo userInfo2 = query2.findOne(); UserInfo userInfo3 = query3.findOne(); assertEquals("QueryChannel", userInfo1.getFirstName()); assertEquals("[email protected]", userInfo1.getEmailAddress()); assertEquals("QueryChannel", userInfo2.getFirstName()); assertEquals("[email protected]", userInfo2.getEmailAddress()); assertEquals("QueryChannel", userInfo3.getFirstName()); assertEquals("[email protected]", userInfo3.getEmailAddress()); } @Test public void createNamedQuery() { UserInfo userInfo = ebeanQueryChannelService.createNamedQuery(UserInfo.class, "userInfoByEmail").setParameter("emailAddress", "[email protected]").findOne(); assertEquals("QueryChannel", userInfo.getFirstName()); assertEquals("[email protected]", userInfo.getEmailAddress()); } @Test public void createNamedQueryWhere() { UserInfo userInfo = ebeanQueryChannelService.createNamedQuery(UserInfo.class, "userInfo").where() .eq("emailAddress", "[email protected]").findOne(); assertEquals("QueryChannel", userInfo.getFirstName()); assertEquals("[email protected]", userInfo.getEmailAddress()); } @Test public void createDtoQuery() { String sql = "select first_name, last_name, email_address from user where email_address = :emailAddress"; UserDTO userDTO = ebeanQueryChannelService.createDtoQuery(UserDTO.class, sql) .setParameter("emailAddress", "[email protected]") .findOne(); assertEquals("QueryChannel", userDTO.getFirstName()); assertEquals("[email protected]", userDTO.getEmailAddress()); } @Test public void query_queryObject() { UserQuery userQuery = new UserQuery(); userQuery.setEmailAddress("[email protected]"); userQuery.setAgeStart(1); userQuery.setAgeEnd(30); UserDTO user = queryChannel.createQuery(User.class, userQuery) .asDto(UserDTO.class) .setRelaxedMode() .findOne(); assertEquals("[email protected]", user.getEmailAddress()); } @Test public void applyQueryObject() { UserQuery userQuery = new UserQuery(); userQuery.setEmailAddress("[email protected]"); userQuery.setAgeStart(1); userQuery.setAgeEnd(30); UserInfo userInfo = EbeanQueryChannelService.applyWhere(queryChannel.createNamedQuery(UserInfo.class, "userInfo").where(), userQuery).findOne(); assertEquals("QueryChannel", userInfo.getFirstName()); assertEquals("[email protected]", userInfo.getEmailAddress()); }} ![]() |
请发表评论