1. Spring Data JPA是什么

它是Spring基于ORM框架、JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展。学习并使用Spring Data JPA可以极大提高开发效率。

2. Spring Data JPA 有什么

主要看看Spring Data JPA 提供的编程接口

  • Repository:最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描时自动识别。
  • CrudRepository: Repository的子接口,提供CRUD的功能。
  • PagingAndSortingRepository: CrudRepository的子接口, 添加分页排序。
  • JpaRepository: PagingAndSortingRepository的子接口,增加批量操作等。
  • JpaSpecificationExecutor: 用来做复杂查询的接口。

接口继承关系图

    

3. 利用Spring Data JPA建立简单的用户管理项目

3.1 搭建项目

3.1.1 数据库建表

    

3.1.2 用户管理工程包结构

  • com.zang.usermanage.repository (存放自定义的数据操作接口)
  • com.zang.usermanage.model(存放实体模型)
  • com.zang.usermanage.service(存放服务层的接口和实现)
  • com.zang.usermanage.controller (如果是MVC项目可建立此包,存放控制器)
  • com.zang.usermanage.exception(存放异常类)
  • com.zang.usermanage.test(存放测试类)

    

3.1.3 所有需要的jar包

  • Spring 基础jar包(版本:4.1.5)
  • Spring Data Commons jar包(版本:1.9.2)
  • Spring Data JPA jar包(版本:1.7.2)
  • Hibernate 相关 jar包(版本:4.2.0)
  • MySQL数据库连接包 (版本:5.1.21)
  • 日志相关jar包
  • 其它jar包

3.1.4 配置与编码

创建配置

配置文件一:applicationContext.xml(Spring上下文)

  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  4. xmlns:jee="http://www.springframework.org/schema/jee"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  10. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
  11. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
  12. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  13. http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
  14. default-lazy-init="true">
  15.  
  16. <!--第一步-->
  17. <!--定义服务层代码存放的包扫描路径-->
  18. <context:component-scan base-package="com.zang.usermanage.service" />
  19.  
  20. <!--第二步-->
  21. <!--定义实体的工厂bean-->
  22. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  23. <property name="persistenceUnitName" value="userPU" />
  24. <property name="persistenceXmlLocation" value="classpath:persistence.xml"></property>
  25. </bean>
  26.  
  27. <!--第三步-->
  28. <!--定义事务管理器-->
  29. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  30. <property name="entityManagerFactory" ref="entityManagerFactory"/>
  31. </bean>
  32.  
  33. <!--第四步-->
  34. <!--定义repository接口的存放目录-->
  35. <!--定义接口实现的后缀,通常用Impl-->
  36. <!--定义实体工厂的引用-->
  37. <!--定义事务管理器的引用-->
  38. <jpa:repositories base-package="com.zang.usermanage.repository"
  39. repository-impl-postfix="Impl"
  40. entity-manager-factory-ref="entityManagerFactory"
  41. transaction-manager-ref="transactionManager"/>
  42.  
  43. <!--第五步-->
  44. <!--声明采用注解的方式申明事务-->
  45. <tx:annotation-driven transaction-manager="transactionManager"/>
  46.  
  47. </beans>

配置文件二:persistence.xml(管理持久化)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
  3. <persistence-unit name="userPU" transaction-type="RESOURCE_LOCAL">
  4. <!--jpa的提供者-->
  5. <provider>org.hibernate.ejb.HibernatePersistence</provider>
  6. <properties>
  7. <!--声明数据库连接的驱动-->
  8. <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
  9. <!--jdbc数据库的连接地址-->
  10. <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/user_manage"/>
  11. <property name="hibernate.connection.username" value="root"/>
  12. <property name="hibernate.connection.password" value="123"/>
  13. <!--配置方言-->
  14. <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
  15. <!--激活查询日志功能-->
  16. <property name="hibernate.show_sql" value="true"/>
  17. <!--优雅地输出Sql-->
  18. <property name="hibernate.format_sql" value="true"/>
  19. <!--添加一条解释型标注-->
  20. <property name="hibernate.use_sql_comments" value="false"/>
  21. <!--配置如何根据java模型生成数据库表结构,常用update,validate-->
  22. <property name="hibernate.hbm2ddl.auto" value="update"/>
  23. </properties>
  24. </persistence-unit>
  25. </persistence>

创建类文件并编码

User.java(用户实体类),UserRepository.java(用户的数据接口,继承JpaRepository接口), UserService.java(用户服务接口),UserServiceImpl.java(接口实现), UserNotFound.java(异常类,在查询实体未找到时抛出)

 类之间关系

    

User.java(用户实体类)

  1. package com.zang.usermanage.model;
  2.  
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.Id;
  6. import javax.persistence.Table;
  7.  
  8. /*
  9. 实体中常用的注解:
  10. @Entity :声明这个类是一个实体类
  11. @Table:指定映射到数据库的表格
  12. @Id :映射到数据库表的主键属性,一个实体只能有一个属性被映射为主键
  13. @GeneratedValue:主键的生成策略
  14. */
  15. @Entity
  16. @Table(name="user")
  17. public class User {
  18.  
  19. @Id
  20. @GeneratedValue
  21. private Integer id;
  22. private String name;
  23. private String address;
  24. private String phone;
  25.  
  26. public Integer getId() {
  27. return id;
  28. }
  29. public void setId(Integer id) {
  30. this.id = id;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public String getAddress() {
  39. return address;
  40. }
  41. public void setAddress(String address) {
  42. this.address = address;
  43. }
  44. public String getPhone() {
  45. return phone;
  46. }
  47. public void setPhone(String phone) {
  48. this.phone = phone;
  49. }
  50.  
  51. }

UserRepository.java(用户的数据接口)

  1. package com.zang.usermanage.repository;
  2. import org.springframework.data.jpa.repository.JpaRepository;
  3. import com.zang.usermanage.model.User;
  4.  
  5. public interface UserRepository extends JpaRepository<User,Integer> {
  6.  
  7. }

3.2 实现简单的增、删、改、查

JpaRepository接口方法:

  • delete删除或批量删除
  • findAll查找所有
  • findOne查找单个
  • save保存单个或批量保存
  • saveAndFlush保存并刷新到数据库

接口源码如下:(实现类为org.springframework.data.jpa.repository.support.SimpleJpaRepository.class)

  1. package org.springframework.data.jpa.repository;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5. import org.springframework.data.domain.Sort;
  6. import org.springframework.data.repository.NoRepositoryBean;
  7. import org.springframework.data.repository.PagingAndSortingRepository;
  8.  
  9. @NoRepositoryBean
  10. public abstract interface JpaRepository<T, ID extends Serializable>
  11. extends PagingAndSortingRepository<T, ID>
  12. {
  13. public abstract List<T> findAll();
  14.  
  15. public abstract List<T> findAll(Sort paramSort);
  16.  
  17. public abstract List<T> findAll(Iterable<ID> paramIterable);
  18.  
  19. public abstract <S extends T> List<S> save(Iterable<S> paramIterable);
  20.  
  21. public abstract void flush();
  22.  
  23. public abstract <S extends T> S saveAndFlush(S paramS);
  24.  
  25. public abstract void deleteInBatch(Iterable<T> paramIterable);
  26.  
  27. public abstract void deleteAllInBatch();
  28.  
  29. public abstract T getOne(ID paramID);
  30. }

3.2.1 编码实现

UserService.java(用户服务接口)

  1. package com.zang.usermanage.service;
  2.  
  3. import java.util.List;import com.zang.usermanage.exception.UserNotFound;
  4. import com.zang.usermanage.model.User;
  5.  
  6. public interface UserService {
  7. //添加用户
  8. public void addUser(User user);
  9. //修改用户
  10. public User updateUser(User user) throws UserNotFound;
  11. //删除用户,根据用户编号删除
  12. public User deleteUser(int id) throws UserNotFound;
  13. //查询单个用户
  14. public User getUser(int id);
  15. //查询所有用户
  16. public List<User> getUsers();
  17. }

UserServiceImpl.java(接口实现)

  1. package com.zang.usermanage.service;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;
  7.  
  8. import com.zang.usermanage.exception.UserNotFound;
  9. import com.zang.usermanage.model.User;
  10. import com.zang.usermanage.repository.UserRepository;
  11.  
  12. @Service("userService")
  13. public class UserServiceImpl implements UserService {
  14.  
  15. //自动装配
  16. @Autowired
  17. private UserRepository userRepository;
  18.  
  19. //增加用户调用save方法
  20. @Override
  21. public void addUser(User user) {
  22. userRepository.save(user);
  23. }
  24.  
  25. //更新用户先进行非空判断,再对新用户各个属性进行非空判断并赋值,最后调用save方法
  26. //自定义异常类 UserNotFound
  27. @Override
  28. public User updateUser(User user) throws UserNotFound {
  29. User userUpdate = userRepository.findOne(user.getId());
  30. if (userUpdate==null)
  31. throw new UserNotFound();
  32. if (user.getName()!=null)
  33. userUpdate.setName(user.getName());
  34. if (user.getAddress()!=null)
  35. userUpdate.setAddress(user.getAddress());
  36. if (user.getPhone()!=null)
  37. userUpdate.setPhone(user.getPhone());
  38. userRepository.save(userUpdate);
  39. return userUpdate;
  40. }
  41.  
  42. //删除用户先进行非空判断,最后调用delete方法
  43. @Override
  44. public User deleteUser(int id) throws UserNotFound {
  45. User userDelete = userRepository.findOne(id);
  46. if (userDelete==null)
  47. throw new UserNotFound();
  48. userRepository.delete(userDelete);
  49. return userDelete;
  50. }
  51.  
  52. //查询单个,调用findOne方法
  53. @Override
  54. public User getUser(int id) {
  55.  
  56. return userRepository.findOne(id);
  57. }
  58.  
  59. //查询所有,调用findAll方法
  60. @Override
  61. public List<User> getUsers() {
  62.  
  63. return userRepository.findAll();
  64. }
  65.  
  66. }

3.2.2 测试

Client.java(测试类)

  1. package com.zang.usermanage.test;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import org.springframework.data.domain.Page;
  8.  
  9. import com.zang.usermanage.exception.UserNotFound;
  10. import com.zang.usermanage.model.User;
  11. import com.zang.usermanage.service.UserService;
  12.  
  13. public class Client {
  14.  
  15. public static void printUser(User user){
  16. StringBuilder sb = new StringBuilder();
  17. sb.append("id="+user.getId());
  18. sb.append("name="+user.getName());
  19. sb.append("address="+user.getAddress());
  20. sb.append("phone="+user.getPhone());
  21. System.out.println(sb.toString());
  22. }
  23.  
  24. public static void testList(UserService userService){
  25. List<User> users = userService.getUsers();
  26. if (users!=null){
  27. for (int i=0; i<users.size();i++){
  28. printUser(users.get(i));
  29. }
  30. }
  31. }
  32. public static void testUpate(UserService userService) throws UserNotFound{
  33. User user = new User();
  34. user.setId(1);
  35. user.setAddress("北京路121号");
  36. userService.updateUser(user);
  37. testList(userService);
  38. }
  39.  
  40. public static void testAdd(UserService userService){
  41. User user = new User();
  42. user.setAddress("天河路120号");
  43. user.setName("小徐");
  44. user.setPhone("130000000");
  45. userService.addUser(user);
  46. testList(userService);
  47. }
  48.  
  49. public static void testDelete(UserService userService) throws UserNotFound{
  50. userService.deleteUser(7);
  51. testList(userService);
  52. }
  53.  
  54. public static void main(String[] arg) throws UserNotFound{
  55.  
  56. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  57. UserService userService = (UserService) ac.getBean("userService");
  58. //testList(userService);
  59. testUpate(userService);
  60. //testAdd(userService);
  61. //testDelete(userService);
  62. }
  63. }

3.3 实现复杂查询

3.3.1 基于方法名解析的概念

JpaRepository支持接口规范方法名查询。意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现

例如:findByName这个方法表示从数据库中查询Name这个属性等于XXX的所有记录,类似于SQL语句:select * from xxTable where name=xxx这种形式

这段话有两个重点:

  • 方法名需要在接口中设定
  • 必须符合一定的命名规范

3.3.2 方法名构造方法

find+全局修饰+By+实体的属性名称+限定词+连接词+ ...(其它实体属性)+OrderBy+排序属性+排序方向 例如:findDistinctByFirstNameIgnoreCaseAndLastNameOrderByAgeDesc(String firstName,String lastName){......}

其中:Distinct是全局修饰(非必须),FirstName和LastName是实体的属性名,And是连接词,IgnoreCase是限定词,Age是排序属性,Desc是排序方向,限定词和连接词统称为“关键词”。

3.3.3 目前支持的关键词

常用词如下:

  • 全局修饰:Distinct,Top,First
  • 关键词:IsNull,IsNotNull,Like,NotLike,Containing,In,NotIn,IgnoreCase,Between,Equals,LessThan,GreaterThan,After,Before...
  • 排序方向:Asc,Desc
  • 连接词:And,Or

更多关键词请查看官方在线文档: https://docs.spring.io/spring-data/jpa/docs/2.0.4.RELEASE/reference/html/

3.3.4 嵌套实体方法命名规则

构词法:主实体中子实体的名称+ _ +子实体的属性名称

例如:List<Person> findByAddress_ZipCode(ZipCode zipCode) 表示查询所有 Address(地址)的zipCode(邮编)为指定值的所有Person(人员)

3.3.5 代码展示条件查询、分页、排序

UserRepository接口定义查询方法

  1. package com.zang.usermanage.repository;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.data.domain.Sort;
  6. import org.springframework.data.domain.Page;
  7. import org.springframework.data.domain.Pageable;
  8. import org.springframework.data.jpa.repository.JpaRepository;
  9.  
  10. import com.zang.usermanage.model.User;
  11.  
  12. public interface UserRepository extends JpaRepository<User,Integer> {
  13.  
  14. //查询需求: 从数据库中查询电话号码(phone)以指定字符串开始(例如:136)的,并且地址(address)中包含指定字符串(例如:路)的记录 提取前两条,降序排列
  15. //select * from user where phone like '136%' and address like '%路%' order by phone desc limit 0,2
  16. List<User> findTop2ByPhoneStartingWithAndAddressContainingOrderByPhoneDesc(String phone,String address);
  17. List<User> findTop2ByPhoneStartingWithAndAddressContaining(String phone,String address,Sort sort);
  18.  
  19. //分页要用到Pageable接口
  20. Page<User> findByPhoneStartingWithAndAddressContaining(String phone,String address,Pageable pageable);
  21.  
  22. }

UserService.java

  1. package com.zang.usermanage.service;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.data.domain.Page;
  6.  
  7. import com.zang.usermanage.exception.UserNotFound;
  8. import com.zang.usermanage.model.User;
  9.  
  10. public interface UserService {
  11.  
  12. //不分页带条件查询
  13. public List<User> getUsersByConditionNoPage(String phone,String address);
  14.  
  15. //带分页条件查询(需要得到用户列表并且得到分页信息)
  16. public Page<User> getUsersByConditionWithPage(String phone,String address,Integer page,Integer pageSize);
  17. //带分页条件查询(得到用户列表)
  18. //public List<User> getUsersByCondition(String phone,String address,Integer page,Integer pageSize);
  19. }

UserServiceImpl.java

  1. package com.zang.usermanage.service;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.domain.Page;
  8. import org.springframework.data.domain.PageRequest;
  9. import org.springframework.data.domain.Sort;
  10. import org.springframework.data.domain.Sort.Direction;
  11. import org.springframework.data.domain.Sort.Order;
  12. import org.springframework.stereotype.Service;
  13.  
  14. import com.zang.usermanage.exception.UserNotFound;
  15. import com.zang.usermanage.model.User;
  16. import com.zang.usermanage.repository.UserRepository;
  17.  
  18. @Service("userService")
  19. public class UserServiceImpl implements UserService {
  20.  
  21. //自动装配
  22. @Autowired
  23. private UserRepository userRepository;
  24.  
  25. @Override
  26. public Page<User> getUsersByConditionWithPage(String phone,String address,Integer page,Integer pageSize) {
  27.  
  28. //不排序
  29. Page<User> userPage = userRepository.findByPhoneStartingWithAndAddressContaining(phone,address,new PageRequest(page, pageSize));
  30.  
  31. //排序(三种方法)
  32.  
  33. //第一种排序方式
  34. //Page<User> userPage = userRepository.findByPhoneStartingWithAndAddressContaining(phone,address,new PageRequest(page, pageSize,new Sort(Direction.ASC,"name","phone")));
  35.  
  36. //第二种排序方式
  37. //Order order = new Order(Direction.ASC,"phone");
  38. //Page<User> userPage = userRepository.findByPhoneStartingWithAndAddressContaining(phone,address,new PageRequest(page, pageSize,new Sort(order));
  39.  
  40. //第三种排序方式
  41. //List<Order> orders = new ArrayList<Order>();
  42. //orders.add(new Order(Direction.DESC,"name"));
  43. //orders.add(new Order(Direction.ASC,"phone"));
  44. //Page<User> userPage = userRepository.findByPhoneStartingWithAndAddressContaining(phone,address,new PageRequest(page, pageSize,new Sort(orders));
  45.  
  46. return userPage;
  47.  
  48. }
  49.  
  50. /**
  51. * 不分页
  52. */
  53. @Override
  54. public List<User> getUsersByConditionNoPage(String phone,String address) {
  55.  
  56. return userRepository.findTop2ByPhoneStartingWithAndAddressContainingOrderByPhoneDesc(phone, address);
  57.  
  58. //return userRepository.findTop2ByPhoneStartingWithAndAddressContaining(phone, address, new Sort(Direction.ASC,"phone"));
  59.  
  60. //Order order = new Order(Direction.ASC,"phone");
  61. //return userRepository.findTop2ByPhoneStartingWithAndAddressContaining(phone, address, new Sort(order));
  62.  
  63. //List<Order> orders = new ArrayList<Order>();
  64. //orders.add(new Order(Direction.DESC,"name"));
  65. //orders.add(new Order(Direction.ASC,"phone"));
  66. //return userRepository.findTop2ByPhoneStartingWithAndAddressContaining(phone, address, new Sort(orders);
  67.  
  68. }
  69.  
  70. }

Client.java(测试类)

  1. package com.zang.usermanage.test;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import org.springframework.data.domain.Page;
  8.  
  9. import com.zang.usermanage.exception.UserNotFound;
  10. import com.zang.usermanage.model.User;
  11. import com.zang.usermanage.service.UserService;
  12.  
  13. public class Client {
  14.  
  15. public static void printUser(User user){
  16. StringBuilder sb = new StringBuilder();
  17. sb.append("id="+user.getId());
  18. sb.append("name="+user.getName());
  19. sb.append("address="+user.getAddress());
  20. sb.append("phone="+user.getPhone());
  21. System.out.println(sb.toString());
  22.  
  23. }
  24.  
  25. /**
  26. * 打印分页信息
  27. * @param pageInfo
  28. */
  29. public static <T> void printPageInfo(Page<T> pageInfo){
  30. StringBuilder sb = new StringBuilder();
  31. sb.append("当前是第几页="+pageInfo.getNumber()).append("\n");
  32. sb.append("当前页查得的记录数="+pageInfo.getNumberOfElements()).append("\n");
  33. sb.append("每页需要查询的条数="+pageInfo.getSize()).append("\n");
  34. sb.append("总共符合条件的记录数="+pageInfo.getTotalElements()).append("\n");
  35. sb.append("总共的页数是="+pageInfo.getTotalPages()).append("\n");
  36. System.out.println(sb.toString());
  37. }
  38.  
  39. /**
  40. * 不分页查询
  41. * @param userService
  42. */
  43. public static void testListByConditonNoPage(UserService userService){
  44.  
  45. List<User> users = userService.getUsersByConditionNoPage("136","路");
  46.  
  47. if (users!=null){
  48. for (int i=0; i<users.size();i++){
  49. printUser(users.get(i));
  50. }
  51. }
  52. }
  53.  
  54. /**
  55. * 分页查询
  56. * @param userService
  57. */
  58. public static void testListByConditonWithPage(UserService userService){
  59.  
  60. //传入条件和分页信息
  61. Page<User> userPage = userService.getUsersByConditionWithPage("136","路",0,2);
  62. //打印分页信息
  63. printPageInfo(userPage);
  64.  
  65. List<User> users = userPage.getContent();
  66.  
  67. if (users!=null){
  68. for (int i=0; i<users.size();i++){
  69. printUser(users.get(i));
  70. }
  71. }
  72. }
  73.  
  74. public static void main(String[] arg) throws UserNotFound{
  75.  
  76. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  77. UserService userService = (UserService) ac.getBean("userService");
  78.  
  79. //testListByConditonNoPage(userService);
  80. testListByConditonWithPage(userService);
  81. }
  82. }

效果:

Spring Data JPA入门的更多相关文章

  1. spring data jpa入门学习

    本文主要介绍下spring data jpa,主要聊聊为何要使用它进行开发以及它的基本使用.本文主要是入门介绍,并在最后会留下完整的demo供读者进行下载,从而了解并且开始使用spring data ...

  2. Spring Data Jpa 入门学习

    本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...

  3. Spring Data JPA入门及深入

    一:Spring Data JPA简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问 ...

  4. Spring Data JPA 入门Demo

    什么是JPA呢? 其实JPA可以说是一种规范,是java5.0之后提出来的用于持久化的一套规范:它不是任何一种ORM框架,在我看来,是现有ORM框架在这个规范下去实现持久层. 它的出现是为了简化现有的 ...

  5. Spring Data JPA 入门篇

    Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...

  6. Spring Data Jpa --- 入门

    一.概述 Spring Data是Spring下的一个子项目,用于简化数据库访问,并支持云服务的开源框架.Spring Data支持NoSQL和 关系数据存储,其主要目标是使得数据库的访问变得方便快捷 ...

  7. 【ORM框架】Spring Data JPA(一)-- 入门

    本文参考:spring Data JPA入门   [原创]纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...

  8. 深入浅出学Spring Data JPA

    第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...

  9. Spring Data JPA 教程(翻译)

    写那些数据挖掘之类的博文 写的比较累了,现在翻译一下关于spring data jpa的文章,觉得轻松多了. 翻译正文: 你有木有注意到,使用Java持久化的API的数据访问代码包含了很多不必要的模式 ...

随机推荐

  1. CF932 E. Team Work 结题报告

    CF932 E. Team Work 题意 求 \[ \sum_{i=0}^n\binom{n}{i}i^k \] 其中\(n\le 10^9,k\le 5000\),对\(mod=998244353 ...

  2. 解决远程连接MongoDB出现错误

    前言:最近准备学习下MongoDB,安装什么的都已经弄完了,想远程连接来管理MongoDB,用的软件是robo 3t 第一次连的时候就出错误了 大概意思是连接失败,解决如下 第一步,首先检查你的服务器 ...

  3. 为什么会有这么多python?其实python并不是编程语言!

    Python是出类拔萃的 然而,这是一句非常模棱两可的话.这里的"Python"到底指的是什么? 是Python的抽象接口吗?是Python的通用实现CPython吗(不要把CPy ...

  4. Pandas系列(十三)-其他常用功能

    一.统计数据频率 1. values_counts pd.value_counts(df.column_name) df.column_name.value_counts() Series.value ...

  5. crontab 误删恢复

    某台服务器某账号的 crontab 任务被清空,原因不明.同时,该服务器上的 crontab 任务备份未开启.故思考如何恢复 crontab 任务. 经查,CentOS 系统的 crontab 任务的 ...

  6. ruby 对象转换哈希(Hash)

    通过 ActiveRecord 从数据库的某张数据表(table)中获取的对象如何转换成为 Hash orders_table 是一张订单信息表,对应的 model 为 Orders @order = ...

  7. SpringBoot系列: 单元测试2

    之前发了SpringBoot 单元测试的博客, https://www.cnblogs.com/harrychinese/p/springboot_unittesting.html , 内容较少, 现 ...

  8. 最大熵模型和EM算法

    一.极大似然已经发生的事件是独立重复事件,符合同一分布已经发生的时间是可能性(似然)的事件利用这两个假设,已经发生时间的联合密度值就最大,所以就可以求出总体分布f中参数θ 用极大似然进行机器学习有监督 ...

  9. 高性能JS(读书札记)

    第一章:加载和执行 1.1脚本位置 将js脚本放在body底部 1.2组织脚本 文件合并,减少http请求(打包工具) 1.3无阻塞的脚本 js倾向于阻止浏览器的某些处理过程,如http请求和用户界面 ...

  10. java获取当前运行的方法名称

    // 这种方式获取的话,数组的第一个元素是当前运行方法的名称,第二个元素是调用当前方法的方法名称 StackTraceElement[] stackTrace = new Exception().ge ...