jdbc java_jpa使用

jdbc java_jpa使用SpringBoot集成jpa网上有很对jpa的介绍,但是都不是很全,这边根据公司的实际使用情况进行的总结。JPA、Hibernate、Springdatajpa之间的关系主要参考https://my.oschina.net/u/3080373/blog/1828589大家可以读一下这篇文章什么是JPA?全称JavaPersistenceAPI,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。为我们提供了:1)ORM映射元数据:JPA支持XML

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

SpringBoot集成jpa

网上有很对jpa的介绍,但是都不是很全,这边根据公司的实际使用情况进行的总结。

JPA、Hibernate、Spring data jpa之间的关系

主要参考https://my.oschina.net/u/3080373/blog/1828589 大家可以读一下这篇文章

什么是JPA?

全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。

为我们提供了:

1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

如:@Entity、@Table、@Column、@Transient等注解。

2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来

如:entityManager.merge(T t);

3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

如:from Student s where s.name = ?

但是:

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

什么是spring data jpa?

spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。

在这里插入图片描述

Springboot整合SpringData JPA

SpringData简介

在这里插入图片描述

整合SpringData JPA

JPA:ORM(Object Relational Mapping);

1)、编写一个实体类(bean)和数据表进行映射,并且配置好映射关系;

//使用JPA注解配置映射关系
@Entity //告诉JPA这是一个实体类(和数据表映射的类)
@Table(name = "tbl_user") //@Table来指定和哪个数据表对应;如果省略默认表名就是user;
public class User { 
   

    @Id //这是一个主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
    private Integer id;

    @Column(name = "last_name",length = 50) //这是和数据表对应的一个列
    private String lastName;
    @Column //省略默认列名就是属性名
    private String email;

2)、编写一个Dao接口来操作实体类对应的数据表(Repository)

//继承JpaRepository来完成对数据库的操作
public interface UserRepository extends JpaRepository<User,Integer> { 
   
}

3)、基本的配置JpaProperties

spring:  
 jpa:
    hibernate:
# 更新或者创建数据表结构
      ddl-auto: update
# 控制台显示SQL
    show-sql: true

4pom

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

Jpa使用(不需要实现sql语句编写)

JPA注解
在这里插入图片描述
在这里插入图片描述

Jpa关键字
在这里插入图片描述
在这里插入图片描述

自己写sql

下面是一些常用的

@Query(value=” 这里就是查询语句”)

@Query支持hql和原生sql两种方式,默认是hql ,hql就是语句中用的是实体名字和实体属性,原生sql用的表名字和表字段,

Hql

要想查询全部字段可以用 sellect 实体名 这里省略了value ,参数使用了占位置符 ?1 代表第一个参数 ?2代表第二个

public interface UserRepository extends JpaRepository<User, Long> { 
   
 
  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}

//如果是更新或者删除操作,方法上面要加@Modifying 默认开启的事务只是可读的,更新操作加入@Modifying 就会关闭可读
    @Modifying
    @Transactional
    @Query("update CardConfig set cardStatus=?1 where id in ?2")
    void updateCardStatus( Integer status,List<Integer> listIds);

// @Param 代替参数占位符, hql或者sql里就用 :firstname替换 方法里的参数顺序可以打乱
 @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);

//返回字段 组成新的entity返回 类名必须是全写的
@Query(value="select new com.hikvision.metro.modules.repository.entity.CameraIndexs(c.preOneCameraIndexcode, c.preTwoCameraIndexcode, c.backOneCameraIndexcode) from StationDeviceConfig c")
    List<CameraIndexs> getAllCameraIndexs();

原生sql

语句可以直接放到数据库中执行 nativeQuery=true

  
    @Modifying
    @Query(value="select status from t_station_device_config where pre_one_camera_indexcode=?1",nativeQuery = true)
    List<Integer> findStatusByPreOneCameraIndexcode(String index);


    @Query(value="select radar_indexcode from t_station_device_config",nativeQuery = true)
    List<String> getAllRadarIndex();


复杂查询:排序 分页等等

使用JpaSpecificationExecutor 对应的接口继承JpaSpecificationExecutor
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询的时候实现Predicate就行了 函数式接口 lambda表达式实现即可。

多个sort实现

第一种方式:
 Sort sort = new Sort(Sort.Direction.DESC, "preDrawIssue").and(new Sort(Sort.Direction.ASC, "regionCode"));
 Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort);
第二种方式:
       List<Sort.Order> orders=new ArrayList<>();
         orders.add(new Sort.Order(Sort.Direction.DESC,"preDrawIssue"));
         orders.add(new Sort.Order(Sort.Direction.ASC,"regionCode"));
          Sort sort  = Sort.by(orders);
    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort); 

下面的进行特殊条件 分页查询

@Repository
public interface CardConfigRepository extends JpaRepository<CardConfig,Integer>, JpaSpecificationExecutor {
}
 public BaseResult findAll(Pageable pageable, BaseSearch baseSearch) { 
   
        List<CardInfo> passInfoBos = new ArrayList<>();
        BasePage<CardInfo> basePage = new BasePage<>();
        try { 
   
            Specification querySpeci = (root, criteriaQuery, criteriaBuilder) -> { 
   
                List<Predicate> predicates = Lists.newArrayList();
                if (!StringUtils.isEmpty(baseSearch.getPersonName())) { 
   
                    predicates.add(criteriaBuilder
                            .like(root.get("personName"), "%" + baseSearch.getPersonName() + "%"));
                }
                if (!StringUtils.isEmpty(baseSearch.getCardNo())) { 
   
                    predicates.add(criteriaBuilder
                            .like(root.get("cardId"), "%" + baseSearch.getCardNo() + "%"));
                }
                if (baseSearch.getType() != null) { 
   
                    predicates.add(criteriaBuilder
                            .equal(root.get("cardType"), baseSearch.getType()));
                }

                if (baseSearch.getStatus() != null) { 
   
                    predicates.add(criteriaBuilder
                            .equal(root.get("cardStatus"), baseSearch.getStatus()));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            };
			//继承了JpaSpecificationExecutor的才会有这个接口
            Page<CardConfig> page = cardConfigRepository.findAll(querySpeci, pageable);
            if (page != null) { 
   
                for (CardConfig info : page.getContent()) { 
   
                    CardInfo cardInfo = new CardInfo();
                    cardInfo.convertFromCardConfig(info);
                    passInfoBos.add(cardInfo);
                }
                basePage.setList(passInfoBos);
                basePage.setTotal(page.getTotalElements());
                basePage.setTotalPages(page.getTotalPages());
                basePage.setPageSize(page.getSize());
                basePage.setPageNo(page.getNumber() + 1);
                //LOGGER.info("分页查询卡片列表成功");
            } else { 
   
                return BaseResult.fail(CommonErrorCode.SYSTEM_INTERNAL_ERROR.getCode(), CommonErrorCode.SYSTEM_INTERNAL_ERROR.getMsg());
            }
        } catch (BusinessException e) { 
   
            throw e;
        } catch (AuthorizationException e) { 
   
            throw e;
        } catch (Exception e) { 
   
            LOGGER.errorWithErrorCode(ErrorCode.CARD_CONFIG_QUERY_ERROR.getCode(), ErrorCode.CARD_CONFIG_QUERY_ERROR.getChinaMessage(), e);
            throw new MetroBusinessException(ErrorCode.CARD_CONFIG_QUERY_ERROR, e);
        }
        return new BaseResult(0, "0", "成功", basePage);
    }

根据数据库表生成实体类

参照下面的博客 可以实现数据库表 生成对应的实体类 idea

https://blog.csdn.net/qq_34371461/article/details/80571281

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179934.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • M/F(人均gdp突破一万美元)

    https://image.uc.cn/o/wemedia/s/upload/2019/25f12a866b249c70e449416b79f137e1.png;,4,png;3,700x.png最近BTC暴涨的行情相信让很多分析家打脸了,多少阻力位、压力位一分钟破一个,.过去3个月自己亲身经历眼看着比特币从3000-4000左右的价格慢慢爬升,到大概6000左右的时候,很多非常资深的二级市场投…

    2022年4月13日
    102
  • Flutter Mac 安装全教程(Android / iOS)

    Flutter Mac 安装全教程(Android / iOS)本文来自于:https://flutter.io/docs/get-started/install/macos目录下载Flutter设置环境变量Flutter命令安装编辑IDE下载Flutterhttps://flutter.io/docs/development/tools/sdk/archive在这里获取Flutter的安装包,推荐使用stablechanne…

    2022年5月23日
    35
  • linux如何安装docker_deepin安装docker

    linux如何安装docker_deepin安装docker安装前准备Linux系统下,版本需要不小于3.10.x目前docker安装只支持centOS7、centOS6.5也就是说centOS7是需要3.1以上内核centOS7是需要2.6以上内核linux输出命令uname-a这里用的是centOS7、3.1安装docker,大家最好也同步一下centOS7镜像可以从阿里云拉取一个,然后在搭建linux的时候跟之前版本差不多,只不过需要更改的点是vi/etc/sysconfig/network-scripts/ifcfg-

    2022年10月9日
    6
  • mse pytorch_pytorch scatter

    mse pytorch_pytorch scatter基本概念均方误差(meansquareerror,MSE),是反应估计量与被估计量之间差异程度的一种度量,设ttt是根据子样确定的总体参数θ\thetaθ的一个估计量,(θ−t)2(\theta-t)^{2}(θ−t)2的数学期望,称为估计量ttt的均方误差。pytorch中MSELoss函数介绍torch.nn.MSELoss(size_average=True,reduce=Tru…

    2026年1月19日
    6
  • portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程

    portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程Portraiture3forMac是PS中优秀的人像磨皮滤镜插件,portraiture3mac激活成功教程版可以对皮肤、头发、眉毛、睫毛等部位进行磨皮润色处理,还能自由调整锐度、柔软度、亮度、对比度等,这里为大家带来portraiture滤镜的激活成功教程教程,赶紧来看看吧!portraiture激活成功教程步骤下载好Portraiture安装包后,点击打开Portraiture.dmg,双击【…

    2022年7月22日
    15
  • 数据结构哈希表怎么画(数据结构哈希算法)

    数据结构哈希表参考代码如下:/* 名称:哈希表 语言:数据结构C语言版 编译环境:VC++6.0 日期:2014-3-26*/#include#include#include#defineNULLKEY0 //0为无记录标志#defineN10 //数据元素个数typedefintKeyType;//设关键字域为整型

    2022年4月11日
    396

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号