Spring Data开发手册|手把手教你简化持久层开发工作

网友投稿 472 2023-04-10

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Spring Data开发手册|手把手教你简化持久层开发工作

Spring Data,是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特殊特性。

它是对于数据访问技术,关系数据库和非关系数据库,map-reduce框架和基于云的数据服务变得容易。Spring Data是一个总括项目,其中包含很多特定于数据库相关的子项目。

首先,先带大家看一下本篇文章的大致介绍。

没目录怎么知道这篇到底有多少干货呢?

Spring Data是什么Spring Data能干什么Spring Data的第一个HelloWorld程序通过名字来确定方法通过注解的形式来实现查询写本地的SQL查询增删改的玩法使用框架中提供的增删改查的方法分页和排序JpaRepository的使用

是不是很清晰呢,现在开始进入正文,一个一个来:

Spring Data是什么

我们传统的开发中,我们的整个DAO层的代码上都是相对来说,都是比较复杂的,在这种情况下,Spring团队就考虑到一个问题,能不能开发一个框架,这个框架能够最大限度的减少DAO层的开发呢?

Spring Data就是为了简化DAO层操作的一个框架

传统的增删改查在我们的Spring Data中已经实现了,也就是说大部分的DAO层操作部分不用写了,仅仅只是需要编写复杂的业务的调用就可以啦

Spring Data能干什么

主要用途:

传统的增删改查排序分页排序后分页

Spring Data的第一个HelloWorld程序(JPA、Hibernate、Spring、SpringMVC、Spring Data)

导包

编写配置文件

编写实体类和映射

@Entity @Table(name="t_user") public class User {   @Id  @GeneratedValue(strategy=GenerationType.IDENTITY)  private int userId;    private String userName;    private String password; }

编写Repository类

public interface UserRepository extends Repository{  /**   * 这个的意思是通过id找用户   * @Title: getByUserId      * @Description: TODO   * @param: @param userId   * @param: @return         * @return: User         * @throws   */  public User getByUserId(int userId); }

测试

ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/bean-base.xml");   //获取DAO的对象   UserRepository userRepository=applicationContext.getBean(UserRepository.class);  User users=userRepository.findByUserId(1); }

通过名字来确定方法

代码演示:

举例如下:

public interface UserRepository extends Repository{  /**   * 这个的意思是通过id找用户   * @Title: getByUserId      * @Description: TODO   * @param: @param userId   * @param: @return         * @return: User         * @throws   */  public User getByUserId(int userId);    /**   * 记住查询的开头只能是  get 或者  find 开头   By:通过什么查询   * @Title: findByUserId      * @Description: TODO   * @param: @param userId   * @param: @return         * @return: User         * @throws   */  public User findByUserId(int userId);    /**   * 通过用户名的模糊查询   * @Title: findByUserNameLike      * @Description: TODO   * @param: @param userName   * @param: @return         * @return: List         * @throws   */  public List findByUserNameLike(String userName);    /**   * 通过用户名和密码的Like来进行查询   * @Title: findByUserNameLikeAndPasswordLike      * @Description: TODO   * @param: @param userName   * @param: @return         * @return: List         * @throws   */  public List findByUserNameLikeAndPasswordLike(String userName,String password);  /**   * 用户名和密码like 然后id小于一个范围   * @Title: findByUserNameLikeAndPasswordLikeAndUserIdLessThan      * @Description: TODO   * @param: @param userName   * @param: @param password   * @param: @param userId   * @param: @return         * @return: List         * @throws   */  public List findByUserNameLikeAndPasswordLikeAndUserIdLessThan(String userName,String password,int userId); }

注意:一般情况下不会通过名字直接来写相应的方法,因为如果条件过多那么这个时候我们就存在名字特别长的问题

通过注解的模式来实现查询

代码演示:

举例如下:

/**     * 查询所有  没有条件直接查询     * @Title: findUserAll        * @Description: TODO     * @param: @return           * @return: List           * @throws     */ @Query("from User") public List findUserAll();  /**  * 通过id来查找数据     参数直接拼接到后面  * @Title: findUserById     * @Description: TODO  * @param: @param userId  * @param: @return        * @return: List        * @throws  */ @Query("from User u  where u.userId<3") public List findUserById(); /**  * 通过id查询存在占位符的情况  * @Title: findUserById1     * @Description: TODO  * @param: @param userId  * @param: @return        * @return: List        * @throws  */ @Query("from User u  where u.userId findUserById1(int userId);  /**  * 多条件的查询  可以指定当前的参数映射的这个位置  * @Title: getUserByNameAndId     * @Description: TODO  * @param: @param userName  * @param: @param userId  * @param: @return        * @return: User        * @throws  */ @Query("from User u where u.userId=?2 and u.userName=?1") public User getUserByNameAndId(String userName,int userId);  /**  * 模糊查询的时候动态拼接上  %的问题  * @Title: findUserByLike1     * @Description: TODO  * @param: @param userName  * @param: @return        * @return: List        * @throws  */ @Query("from User u where u.userName like concat ('%',?,'%')") public List findUserByLike1(String userName);

写本地的SQL 查询

代码演示:

举例如下:

/**  * 通过  * @Title: findUserAll11     * @Description: TODO  * @param: @return        * @return: List        * @throws  */ @Query(nativeQuery=true,value="select * from t_user") public List findUserAll11();

增删改的玩法

代码演示:

添加业务逻辑 增加事务环境:

@Service @Transactional                  //提供一个事务的环境 public class UserService {    @Autowired  private UserRepository userRepository=null;    /**   * 数据的更新   * @Title: update      * @Description: TODO   * @param: @param userName   * @param: @param password   * @param: @param userId         * @return: void         * @throws   */  public void update(String userName,String password,int userId){   userRepository.update(userName, password, userId);  }      public void delete(int userId){   userRepository.delete(userId);  }    public void insert(String userName,String password){   userRepository.insert(userName, password);  }  }

编写repository的对象:

public interface UserRepository extends Repository{  /**   * 实现增删改的方法   * @Title: add      * @Description: TODO   * @param: @param userName   * @param: @param password         * @return: void         * @throws   */  @Modifying    //这个注解的作用表示的是更新数据  @Query("update User u set u.userName=?,u.password=? where u.userId=?")  public void update(String userName,String password,int userId);    /**   * 更新数据   * @Title: delete      * @Description: TODO   * @param: @param userId         * @return: void         * @throws   */  @Modifying    //这个注解的作用表示的是更新数据  @Query("delete User u where u.userId=?")  public void delete(int userId);  /**   * 添加数据   * @Title: insert      * @Description: TODO   * @param: @param userName   * @param: @param password         * @return: void         * @throws   */  @Modifying    //这个注解的作用表示的是更新数据  @Query(nativeQuery=true,value="insert into t_user(userName,password) values(?,?)")  public void insert(String userName,String password);   }

测试:

@Test public void testHelloWorld() throws Exception {    ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/bean-base.xml");  //获取DAO的对象  UserService userService=applicationContext.getBean(UserService.class);   userService.insert("小羽","做程序的");

使用框架中提供的增删改查的方法

代码演示:

提供的是Repository:

public interface UserRepository extends CrudRepository{

分页和排序

代码演示:

提供的Repository:

public interface UserRepository extends PagingAndSortingRepository{

测试:

public class Test001 {   @Test public void testPaging() throws Exception {  ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/bean-base.xml");  //获取DAO的对象  UserRepository userRepository=applicationContext.getBean(UserRepository.class); /**  * 第一个参数:当前的页的页数是多少  页数是从0开始的   第二页:2-1  * 第二个参数:表示的是每一页条目数  */  Page pages=userRepository.findAll(new PageRequest(2-1,2));   System.out.println("查询到的数据:"+pages.getContent());  System.out.println("数据的条目数:"+pages.getSize());  System.out.println("页数:"+pages.getNumber());  System.out.println("数据条目的总数:"+pages.getTotalElements());  System.out.println("一共的页数:"+pages.getTotalPages());  System.out.println("排序的规则:"+pages.getSort());  }  /**  * 排序  * @Title: testSort     * @Description: TODO  * @param: @throws Exception        * @return: void        * @throws  */ @Test public void testSort() throws Exception {  ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/bean-base.xml");  //获取DAO的对象  UserRepository userRepository=applicationContext.getBean(UserRepository.class);  /**   * 排序   * 第一个参数:升序或者降序  Direction.ASC/DESC   * 第二个参数: 排序的这个列   */  List users=(List) userRepository.findAll(new Sort(Direction.DESC,"userId"));    System.out.println(users); }  /**  * 排序后分页  * @Title: testSortAndPaging     * @Description: TODO  * @param: @throws Exception        * @return: void        * @throws  */ @Test public void testSortAndPaging() throws Exception {  ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/bean-base.xml");  //获取DAO的对象  UserRepository userRepository=applicationContext.getBean(UserRepository.class);    Page pages=userRepository.findAll(new PageRequest(2-1,2,new Sort(Direction.DESC,"userId")));    System.out.println(pages.getContent()); }

JpaRepository的使用

代码演示:

提供的repository:

public interface UserRepository extends JpaRepository{

测试:

public class Test001 {  @Test  public void testPaging() throws Exception {   ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/bean-base.xml");   //获取DAO的对象   UserRepository userRepository=applicationContext.getBean(UserRepository.class);      //  long count=userRepository.count();    //  User user=userRepository.findOne(15); //  user.setUserName("小羽");      //保存或者更新数据 //  userRepository.saveAndFlush(user);        List users=userRepository.findAll();      //批处理   userRepository.deleteInBatch(users);       //System.out.println("统计:"+count);  } }

结语

Spring Data是我们开发中离不开的经常用到的技术,其涉及的技术和知识面其实远不止上面列出的这些。

后续浅羽会继续更新关于Spring Data的开发知识,只希望能对大家有所帮助,谢谢大家的支持!

上一篇:软件测试中的压力测试(软件压力测试的目的)
下一篇:如何用NTS保证NTP的安全
相关文章

 发表评论

暂时没有评论,来抢沙发吧~