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

        <!-- 导入SpringDataJPA的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 连接数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>

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

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test_db
spring.datasource.username=root
spring.datasource.password=123 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true spring.http.multipart.maxFileSize=1024Mb
spring.http.multipart.maxRequestSize=1034Mb

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

package cn.yitiantian.test.model;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; @DynamicUpdate
@DynamicInsert
@Entity
@Table(name = "user")
public class user {
@Id
@GeneratedValue
@Column(name = "id")
Integer id; @Column(name = "name")
String name; @Column(name = "caption")
Integer captionId; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getCaptionId() {
return captionId;
} public void setCaptionId(Integer captionId) {
this.captionId = captionId;
}
}

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

基本查询

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

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

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

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

自定义SQL查询

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

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

public interface EmpRepository extends JpaRepository<Emp, Integer>,JpaSpecificationExecutor<Emp>{

	//查询name(驼峰式名称)
public List<Emp> findByName(String name);
public List<Emp> findByNameAndGender(String name,String gender);
public List<Emp> findByTelephoneLike(String telphone); @Query("from Emp where name = ?")
public List<Emp> queryName(String name); @Query(value="select * from t_emp where name = ?",nativeQuery=true)
public List<Emp> queryName2(String name); @Query("update Emp set address = ? where id = ?")
@Modifying // 进行修改操作
public void updateAddressById(String address,Integer id);
}

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

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

public interface MergedVersionRepositoryExtend {
public List<MergedVersion> findVersionByTableId();
}

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

public interface MergedVersionRepository extends MergedVersionRepositoryExtend {

}

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

@Repository
public class MergedVersionRepositoryImpl implements MergedVersionRepositoryExtend { @Autowired
private JdbcTemplate jdbcTemplate; @Override
public List<MergedVersion> findVersionByTableId() {
String sql = "SELECT DISTINCT\n" +
"\tversionT.version AS version,\n" +
"\ttableT.id AS id,\n" +
"\ttableT.`name` AS name\n" +
"FROM\n" +
"\tu_showinfo_table AS tableT\n" +
"LEFT OUTER JOIN u_showinfo_detail_table AS detailT ON detailT.table_id=tableT.id\n" +
"LEFT OUTER JOIN u_showinfo_property AS propertyT ON propertyT.detail_table_id=detailT.id\n" +
"LEFT OUTER JOIN u_showinfo_version AS versionT ON versionT.property_id=propertyT.id\n" +
"ORDER BY\n" +
"\tversionT.version"; List<MergedVersion> versionList = jdbcTemplate.query(sql, new MergedVersionMapper());
return versionList; }
}

  第四步,定义模型

public class MergedVersion {
private int tableId;
private String tableName;
private String version; public int getTableId() {
return tableId;
} public void setTableId(int tableId) {
this.tableId = tableId;
} public String getTableName() {
return tableName;
} public void setTableName(String tableName) {
this.tableName = tableName;
} public String getVersion() {
return version;
} public void setVersion(String version) {
this.version = version;
}
}

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

public class MergedVersionMapper implements RowMapper<MergedVersion> {

    @Override
public MergedVersion mapRow(ResultSet rs, int rowNum) throws SQLException {
MergedVersion mergedVersion = new MergedVersion(); mergedVersion.setTableId(rs.getInt("id"));
mergedVersion.setTableName(rs.getString("name"));
mergedVersion.setVersion(rs.getString("version")); return mergedVersion;
}
}

  

复杂查询

  排序

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

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

class UserComparator implements Comparator {

    @Override
public int compare(Object o1, Object o2) {
User prop1 = (User)o1;
User prop2 = (User)o2; return prop1.getId().compareTo(prop2.getId());
}
}

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

                UserComparator comparator = new UserComparator();
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. linux ipvsadm安装

    cd /usr/src/ wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24-6.src.rpmrpm -i ...

  2. Visual Studio - 创建和使用动态库

    一.VS2013 创建动态库 1.1 新建项目 1.2.在Win32应用程序向导对话框上勾选“DLL”和“空项目”复选框,点完成 1.3 .添加对应的.C文件和.h文件 1.4 在.h文件中添加如下代 ...

  3. C语言基础(20)-文件操作(fopen,getc,fclose)

    一.文件操作 读文件的顺序: 1.先打开文件 2.读写文件 3.关闭文件 1.1 fopen FILE *fopen( const char *path, const char *mode ); 函数 ...

  4. Python内置函数之filter()

    filter(function,iterable)用来过滤可迭代对象 如果提供过滤条件的函数为None,则可迭代对象中为False的元素将被过滤掉. 例如: >>> a = [,,F ...

  5. Dig HOWTO 中文手册--dig命令使用大全

    Dig HOWTO 中文手册--dig命令使用大全 DNS -- 本人翻译的dig howto手册. 译者序: 可以这样说,翻译本篇文档的过程就是我重新学习DNS的过程,dig命令可以帮助我们学习DN ...

  6. centos7+nginx部署asp.net core mvc网站

    1. 安装 .net core 可参见官网安装教程. 选择Linux发行版本为Centos/Oracle 添加dotnet的yum仓库配置 $ sudo rpm -Uvh https://packag ...

  7. js使用正则表达式验证身份证格式

    function checkIdentity(identity){ var reg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/; i ...

  8. SVN常见问题(转)

    svn常见问题,报错,命令及我的总结 (2013-07-19 18:07:27) 转载▼     我自己犯过的一个错误是:/svn/MyERP_core_Main/!svn/act/b8bd621b- ...

  9. 不再为无限级树结构烦恼,且看此篇s

    很久都没有写点什么出来分享了,最近在做多级树的时候,发现来来回回写过很多遍,于是封装成用户控件,以方便日后重复使用. 首先上效果: 我们看到以上2种效果,都是支持任意级的,这里源码中使用的是递归,以便 ...

  10. NTP协议

    NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步.NTP基于UDP报文进行传输,使用的UDP端口 ...