开始之前你必须在项目配置好数据库,本文使用的spring boot,相比spring,spring boot省去了很多各种对以来组件复杂的配置,直接在pom配置组件,完后会自动帮我们导入组件

  1. <!-- 导入SpringDataJPA的坐标 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-jpa</artifactId>
  5. </dependency>
  6. <!-- 连接数据库驱动 -->
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. </dependency>
  11. <!-- 连接池 -->
  12. <dependency>
  13. <groupId>com.alibaba</groupId>
  14. <artifactId>druid</artifactId>
  15. <version>1.0.9</version>
  16. </dependency>

  然后在src/main/resources下,新建application.properties文件,用配置连接数据库的参数

  1. spring.datasource.driverClassName=com.mysql.jdbc.Driver
  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test_db
  3. spring.datasource.username=root
  4. spring.datasource.password=123
  5.  
  6. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  7.  
  8. spring.jpa.hibernate.ddl-auto=update
  9. spring.jpa.show-sql=true
  10.  
  11. spring.http.multipart.maxFileSize=1024Mb
  12. spring.http.multipart.maxRequestSize=1034Mb

  另外的,由于jpa操作是模型驱动的,所以需要对操作的表定义模型

  1. package cn.yitiantian.test.model;
  2.  
  3. import org.hibernate.annotations.DynamicInsert;
  4. import org.hibernate.annotations.DynamicUpdate;
  5.  
  6. import javax.persistence.*;
  7.  
  8. @DynamicUpdate
  9. @DynamicInsert
  10. @Entity
  11. @Table(name = "user")
  12. public class user {
  13. @Id
  14. @GeneratedValue
  15. @Column(name = "id")
  16. Integer id;
  17.  
  18. @Column(name = "name")
  19. String name;
  20.  
  21. @Column(name = "caption")
  22. Integer captionId;
  23.  
  24. public Integer getId() {
  25. return id;
  26. }
  27.  
  28. public void setId(Integer id) {
  29. this.id = id;
  30. }
  31.  
  32. public String getName() {
  33. return name;
  34. }
  35.  
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39.  
  40. public Integer getCaptionId() {
  41. return captionId;
  42. }
  43.  
  44. public void setCaptionId(Integer captionId) {
  45. this.captionId = captionId;
  46. }
  47. }

  这样,我们就可以开始操作数据库了

基本查询

  基本查询中分为两种,一种是spring data默认已经实现,一种根据查询的方法来自动解析成SQL

  默认已经实现的方法是一些最基本的增删改查方法,如findAll()、delete(user)

  而自定义简单查询,则是通过关键词和属性组合而成,然后jpa会自动解析成SQL语句执行,如findByCaptionId、findByNameOrderById

  更多基本方法和关键词使用详见 jpa

自定义SQL查询

  除了基本查询,jpa还是支持自定义SQL,只要使用@Query注解,如果涉及到动数据,还要加上Modifying,另外还支持事务操作

  更多基本方法和关键词使用详见 jpa

  1. public interface EmpRepository extends JpaRepository<Emp, Integer>,JpaSpecificationExecutor<Emp>{
  2.  
  3. //查询name(驼峰式名称)
  4. public List<Emp> findByName(String name);
  5. public List<Emp> findByNameAndGender(String name,String gender);
  6. public List<Emp> findByTelephoneLike(String telphone);
  7.  
  8. @Query("from Emp where name = ?")
  9. public List<Emp> queryName(String name);
  10.  
  11. @Query(value="select * from t_emp where name = ?",nativeQuery=true)
  12. public List<Emp> queryName2(String name);
  13.  
  14. @Query("update Emp set address = ? where id = ?")
  15. @Modifying // 进行修改操作
  16. public void updateAddressById(String address,Integer id);
  17. }

  当然,如果你想在执行SQL语句前,就想定义好一个模型来接收查询的数据,你还可以这么做

  第一步,先定义一个数据库操作的扩展类

  1. public interface MergedVersionRepositoryExtend {
  2. public List<MergedVersion> findVersionByTableId();
  3. }

  第二步,再让数据库操作类集成这个扩展类

  1. public interface MergedVersionRepository extends MergedVersionRepositoryExtend {
  2.  
  3. }

  第三步,定义获取数据方法,并封装到模型里

  1. @Repository
  2. public class MergedVersionRepositoryImpl implements MergedVersionRepositoryExtend {
  3.  
  4. @Autowired
  5. private JdbcTemplate jdbcTemplate;
  6.  
  7. @Override
  8. public List<MergedVersion> findVersionByTableId() {
  9. String sql = "SELECT DISTINCT\n" +
  10. "\tversionT.version AS version,\n" +
  11. "\ttableT.id AS id,\n" +
  12. "\ttableT.`name` AS name\n" +
  13. "FROM\n" +
  14. "\tu_showinfo_table AS tableT\n" +
  15. "LEFT OUTER JOIN u_showinfo_detail_table AS detailT ON detailT.table_id=tableT.id\n" +
  16. "LEFT OUTER JOIN u_showinfo_property AS propertyT ON propertyT.detail_table_id=detailT.id\n" +
  17. "LEFT OUTER JOIN u_showinfo_version AS versionT ON versionT.property_id=propertyT.id\n" +
  18. "ORDER BY\n" +
  19. "\tversionT.version";
  20.  
  21. List<MergedVersion> versionList = jdbcTemplate.query(sql, new MergedVersionMapper());
  22. return versionList;
  23.  
  24. }
  25. }

  第四步,定义模型

  1. public class MergedVersion {
  2. private int tableId;
  3. private String tableName;
  4. private String version;
  5.  
  6. public int getTableId() {
  7. return tableId;
  8. }
  9.  
  10. public void setTableId(int tableId) {
  11. this.tableId = tableId;
  12. }
  13.  
  14. public String getTableName() {
  15. return tableName;
  16. }
  17.  
  18. public void setTableName(String tableName) {
  19. this.tableName = tableName;
  20. }
  21.  
  22. public String getVersion() {
  23. return version;
  24. }
  25.  
  26. public void setVersion(String version) {
  27. this.version = version;
  28. }
  29. }

  第五步,定义将查询数据注入模型里的方法

  1. public class MergedVersionMapper implements RowMapper<MergedVersion> {
  2.  
  3. @Override
  4. public MergedVersion mapRow(ResultSet rs, int rowNum) throws SQLException {
  5. MergedVersion mergedVersion = new MergedVersion();
  6.  
  7. mergedVersion.setTableId(rs.getInt("id"));
  8. mergedVersion.setTableName(rs.getString("name"));
  9. mergedVersion.setVersion(rs.getString("version"));
  10.  
  11. return mergedVersion;
  12. }
  13. }

  

复杂查询

  排序

  1. @Override
  2. public List<ShowInfoTable> findAllTable() {
  3. Sort sort = new Sort(Sort.Direction.ASC, "id");
  4. return showInfoTableRepository.findAll(sort);
  5. }

  除了在查询方法里实现排序,对结果集进行排序,可以这么做

  1. class UserComparator implements Comparator {
  2.  
  3. @Override
  4. public int compare(Object o1, Object o2) {
  5. User prop1 = (User)o1;
  6. User prop2 = (User)o2;
  7.  
  8. return prop1.getId().compareTo(prop2.getId());
  9. }
  10. }

  调用(Collections.sort也可以直接支持列表排序)

  1. UserComparator comparator = new UserComparator();
  2. Collections.sort(users, comparator);

  

  分页和限制查询

    更多基本方法和关键词使用详见 jpa

  

一篇搞定spring Jpa操作数据库的更多相关文章

  1. 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  2. 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库

    使用MongoDB+Jpa操作数据库 SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数据 ...

  3. 170622、springboot编程之JPA操作数据库

    JPA操作数据库 什么事JAP?JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.在pom ...

  4. 3步轻松搞定Spring Boot缓存

    作者:谭朝红 前言 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速 ...

  5. 一篇搞定RSA加密与SHA签名|与Java完全同步

    基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...

  6. 一文搞定 Spring Data JPA

    Spring Data JPA 是在 JPA 规范的基础上进行进一步封装的产物,和之前的 JDBC.slf4j 这些一样,只定义了一系列的接口.具体在使用的过程中,一般接入的是 Hibernate 的 ...

  7. 【项目实践】一文带你搞定Spring Security + JWT

    以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...

  8. 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)

    本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...

  9. Spring入门(十五):使用Spring JDBC操作数据库

    在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...

随机推荐

  1. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  2. Jmeter-接口测试(二)

    接口测试我们前面已经讲过,此博不做重复,我们主要讲讲如何利用Jmeter做接口测试及参数化. 一.新建项目 1.运行Jmeter.bat打开Jmeter 2.添加线程组(测试计划->添加-> ...

  3. javascript-ajax之json学习笔记

    ajax什么时候解析json的时候用eval 1.如果是原生js实现的ajax,就需要eval转json对象 如果使用了类似jquery的js插件,里面有些方法是不需要转的,因为jquery已经帮你处 ...

  4. 通过xsd schema结构来验证xml是否合法

    import sys import StringIO import lxml from lxml import etree from StringIO import StringIO # Constr ...

  5. Mac 上的终端神器 iTerm2

    官方下载地址:http://www.iterm2.com/ 主题下载地址:https://github.com/mbadolato/iTerm2-Color-Schemes 第三方教程推荐:http: ...

  6. Spring 新手教程(二) 生命周期和作用域

    以下的知识点是针对使用配置文件讲的(annotation相应标签后面文章会具体阐述) Bean的生命周期: 为什么关心这个问题? 我们使用IOC的目的就是为了让Spring IOC帮我们管理对象.从而 ...

  7. Scrapy系列教程(3)------Spider(爬虫核心,定义链接关系和网页信息抽取)

    Spiders Spider类定义了怎样爬取某个(或某些)站点.包含了爬取的动作(比如:是否跟进链接)以及怎样从网页的内容中提取结构化数据(爬取item). 换句话说.Spider就是您定义爬取的动作 ...

  8. 李洪强漫谈iOS开发[C语言-001]-开发概述

  9. h264 ES流文件通过计算first_mb_in_slice区分帧边界

    本人因为近期在读取h264文件的时候,遇到怎样读取完整一帧数据的问题.通过使用elecard stream analyzer工具,以及结合<新一代视频压缩编码标准--H264/AVC>(第 ...

  10. FreeBSD长模式不兼容

    二进制转换与此平台上的长模式不兼容.此虚拟环境中的长模式将被禁用.因此需要使用长模式的应用程序将无法正常运行.请参见 http://vmware.com/info?id=152 了解更多详细信息. m ...