一篇搞定spring Jpa操作数据库

  开始之前你必须在项目配置好数据库,本文使用的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

  

原文地址:https://www.cnblogs.com/xinsiwei18/p/9154858.html

时间: 2024-08-25 16:00:32

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

一篇搞定SQLAlchemy--关系对象映射

要使用SQLAlchemy,必须先下载这个模块 pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->Project Interpreter-->右上+-->搜索你要安装的模块 源码安装,源码下载地址:https://www.oschina.net/news/84998/sqlalchemy-1-1-10 开始操作前,你必须清楚SQLAlchemy实现操作数据库的原理,SQLAlchemy本身是无法

中阶 d03.5 (正篇)完整的Dao 操作数据库

1.目录结构: util---JDBCUtil.java(工具包,整合建立链接和释放资源的方法) dao---UserDao.java(接口,定义方法) impl---UserDaoImpl.java(实现方法) test---TestUserDaoImpl.java(单元测试,测试 执行具体增删改查的方法) 2. 代码说明: util包和之前一样没变化 Dao模式其实就是使用接口和实现来操作数据库 test 里面也不用写具体的方法,直接调用方法 3. ##Statement安全问题 1). S

使用spring boot中的JPA操作数据库

前言 Spring boot中的JPA 使用的同学都会感觉到他的强大,简直就是神器一般,通俗的说,根本不需要你写sql,这就帮你节省了很多时间,那么下面我们来一起来体验下这款神器吧. 一.在pom中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </depen

一篇搞定SQL语句

首先,你要知道SQL语句是常见数据库的查询语言,在关系型数据库里,表间关系有三种,通俗说就是爱情,亲情,友情,其中爱情在道德上说的是一对一,亲情就想到父母,你只有一个父亲或一个母亲,而一个当爹的就有可能有多个孩子,这就是一对多,而友情,你有多个朋友,你的某个朋友也有包括你在内的多个朋友,这就是多对多 其次,两张怎么建立上述的表间关系呢,比如一对多或多对多,有一种神奇的东西叫做外键,就一张表的列值在另外一张表的列有所对应,一对多就是一个外键,多对多就两个外键 最后,什么关系,什么操作,直接见实例就

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

看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名,并且与Java完全同步,这是我的第二篇博客,若有什么不足之处还请大家指教. 基础知识 什么是RSA? 答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding? 答:padding即填充方式,由于RSA加密算法中要加密的明文是要比模数小的,padding就是通过一些填充

spring jdbctemplate操作数据库

  <!-- Spring jdbcTemplate -->     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" abstract="false"           lazy-init="false" autowire="default" >           <pro

一篇搞定Vuex

1.简介 首先,你必须明显明白vuex到底是干啥的,主要解决开发中的哪些问题? Vuex是一个专门为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式变化 说白了,就是:提供了那么一个公共存储的地方,存放各个组件的数据,组件访问数据和操作数据访问这个地方即可 所以,Vuex主要解决是组件间数据传递问题,尤其是嵌套组件,项目一大时,父子组件间的数据传递就非常麻烦了,而Vuex则提供了一种集中管理组件数据的方案,当然小型项目就没

Java并发:一篇搞定线程池

原文地址:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0 本文是在原文的基础+理解,想要系统学习,请看原文地址. 线程池介绍 1.1 线程池的概念 线程池(thread pool): 一种线程使用模式.线程的创建销毁是十分消耗资源的(线程创建消耗内存.线程上下文切换从消耗CPU资源).使用线程池可以更加充分的协调应用CPU.内存.网络.I/O等系统资源.在程序启动首先创建线程,在程序启动后可以将

11张流程图帮你搞定 Spring Bean 生命周期

在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图只画出了大概的流程,具体的可以深入代码 一.获取Bea 第一阶段获取Bean 这里的流程图的入口在 AbstractBeanFactory类的 doGetBean方法,这里可以配合前面的 getBean方法分析文章进行阅读.主要流程就是 1.先处理Bean 的名称,因为如果以“&”开头的Bean名称