Spring Data JPA (Oracle)基础使用「建议收藏」

Spring Data JPA (Oracle)基础使用「建议收藏」SpringDataJPA基础使用学习了尚硅谷的jpa在线视频教程,结合其他资料后动手实践的成果。 1.环境搭建Maven环境,在pom.xml中加入相关hibernate,spring,jdbc,slf4j-log4j12,json-lib,testng的jar包2.Spring配置文件说明配置文件放置位置,在classpath设定的目录下建个resources文件,放s…

大家好,又见面了,我是你们的朋友全栈君。

Spring Data JPA基础使用

学习了 尚硅谷的jpa在线视频教程, 结合其他资料后动手实践的成果。

 

1.环境搭建
Maven环境,在pom.xml中加入相关hibernate,spring,jdbc,slf4j-log4j12,json-lib,testng的jar包

2.Spring配置文件说明
配置文件放置位置,在classpath设定的目录下建个resources文件,放spring-config.xml(这个名字可以自己取)。
文件内容:
配置service自动扫描的包
配置数据源oracle
配置JPA的entityManagerFactory
配置事物管理器
配置支持注解的事物
配置springData

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<!--配置自动扫描的service包  -->
<context:component-scan base-package ="com.springjpa.orclSpringJpa"></context:component-scan>
<!-- 1.配置数据源oracle -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@192.168.2.36:1521:ORCL"/>
<property name="username" value="test"/>
<property name="password" value="test"/>
</bean>
<!-- 2.配置JPA的entityManagerFactory--> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" /> 
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<!--packagesToScan的  value需覆盖Entity和对应接口定义Repository所在的包,可以将两个放同个包,或者建个总包,下面再分包管理-->
<!--packagesToScan会扫描  value定义的包以及下面的子包-->
<property name="packagesToScan" value="com.springjpa.orclSpringJpa"></property> 
<property name = "jpaProperties">
<props>
<!-- 生成数据表的列的映射策略 -->
<prop key = "hibernate.ejb.naming_strategy">org.hibernate.cf.ImprovedNamingStrategy</prop>
<!-- hibernate基本属性 -->
<prop key ="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key ="hibernate.show_sql">true</prop>
<prop key ="hibernate.format_sql">true</prop>
<prop key ="hibernate.hbm2ddl.auto">update</prop><!-update,create,create-drop,validate-
</props>
</property>
</bean>
<!--3. 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactory" /> 
 </bean> 
<!-- 4.配置支持注解的事物 -->
<tx:annotation-driven transaction-manager = "transactionManager"/>
<!-- 5.配置springData -->
<!-- entity-manager-factory-ref值与配置JPA的entityManagerFactory 的bean id对应-->
<jpa:repositories base-package ="com.springjpa.orclSpringJpa"
entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
</beans>

 

3.使用示例
一个最简单的应用包含:
在数据库建表
数据表实例(根据数据库中的表定义)
接口定义( Repository ,CrudRepository ,JPA Repository,…)
应用调用
(看示例说明)

3.1数据库表实例

package com.springjpa.orclSpringJpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name="Jpa_Person")//需实例化的数据库表名称:Jpa_Person,将其与实体类JpaPerson映射关联
@Entity
public class JpaPerson {
@GeneratedValue(strategy=GenerationType.TABLE)
@Id
private Integer id;//id,name,age为表中的字段
private String name;
private Integer age;

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 getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}

@Override
public String toString() {
return "JpaPerson [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

 

3.2.1普通接口定义

package com.springjpa.orclSpringJpa;

import org.springframework.data.repository.JpaRepository;

public interface IJpaPersonRepository extends JpaRepository<JpaPerson,Integer> {
//不需加任何内容,就可以通过IJpaPersonRepository调用默认的一些查询方法了
}

 

3.2.2应用调用

package com.springjpa.orclSpringJpaTest;

import java.sql.SQLException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

import com.springjpa.orclSpringJpa.IJpaPersonRepository;
import com.springjpa.orclSpringJpa.JpaPerson;

public class PersonTest {
private ApplicationContext ctx =null;
private IJpaPersonRepository  jpaPersonRepository =null;
{
ctx = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
jpaPersonRepository = ctx.getBean(IJpaPersonRepository.class);
}

@Test
public void testSpringData_saveJpaPerson(){
JpaPerson jpaPerson = new JpaPerson();
//jpaPerson.setId(2);
jpaPerson.setAge(2);
jpaPerson.setName("yyy");
jpaPersonRepository.save(jpaPerson);//save是JpaRepository中定义的方法
List<JpaPerson> jPersonList = jpaPersonRepository.findAll();//findAll也是JpaRepository中定义的方法,还有其他方法不举例了
System.out.println(jPersonList);
}

 

以上简单的Spring Data Jpa的应用方式完成了, 下面根据规则增加对数据库的操作方式:

(数据库表实例与3.1一样)

3.3.1关键字、注解方式接口定义

package com.springjpa.orclSpringJpa;

import java.util.List;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;

public interface IJpaPersonRepository extends JpaRepository<JpaPerson,Integer> {
//关键字方法查询-简单条件查询,方法名定义需符合规则1.方法名2.连接词3.关键词4.属性名首字母大写
List<JpaPerson> getByName(String name);
List<JpaPerson> getByNameInAndAgeLessThan(List<String> name,Integer age);

//宽注解的方式查询
//查询年龄最大的Person,FROM后面是类名不是Table名
@Query("SELECT p FROM JpaPerson p WHERE p.age = (SELECT max(p2.age) FROM JpaPerson p2)")
JpaPerson getMaxAgePerson(); 

//查询年龄为( ?占位符)的Person
@Query("SELECT p FROM JpaPerson p WHERE p.age = ?1 AND p.id <?2")
List<JpaPerson> getPersonByAgeAndId(Integer age,Integer id);
//排序
//查询年龄,从大到小排列
@Query("SELECT p.age FROM JpaPerson p ORDER BY p.age DESC")
List<Integer> getAgeOrderByDESC();


//原生的SQL查询,需设置nativeQuery = true
//Jpa_Person表名,非类名
@Query(value = "SELECT count(id) FROM Jpa_Person",nativeQuery = true)
long getTotalCount();
//------------------------
//自定义JQL可以完成UPDATE,DELETE,不支持INSERT(需要INSERT时可以采用nativeQuery = true,直接用原生的SQL方式)
//在Query中写JQL语句需用@Modifying修饰
//凡是对表中数据产生改动的,UPDATE,DELETE,INSERT操作都需要使用事务,要定义Service层
//默认情况SpringData每个方法都有事务,但都是一个只读事务,不能完成修改操作
@Modifying
@Query("UPDATE JpaPerson p SET p.name = :name WHERE p.id =:id")
void updateJpaPersonName(@Param("id")Integer id,@Param("name")String name);

@Modifying
@Query("DELETE FROM JpaPerson p WHERE p.age = :age")
void deleteJpaPersonAge(@Param("age")Integer age);
  @Modifying
 @Query(value = "INSERT INTO Jpa_Person(name,age) VALUES (?1,?2)", nativeQuery = true)
    void insert(String name, int age);

}

 

3.3.2 Service

package com.springjpa.orclSpringJpa;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class JpaPersonService {
@Autowired
private IJpaPersonRepository jpaPersonRepository;

@Transactional
//Transactional标注下的方法可以实现多个操作
//对于事物Transactional标注下的函数如果有多个操作,如插入/修改/删除数据,只要有一条操作失败,整个事务就会回滚,成功的插入/修改/删除的数据会被恢复到这个事务开始前的状态
public void actionJpaPersonName(String name,Integer id,Integer age){
jpaPersonRepository.updateJpaPersonName(id, name);
jpaPersonRepository.deleteJpaPersonAge(age);
}
//update
@Transactional
public void updateJpaPersonName(String name,Integer id){
jpaPersonRepository.updateJpaPersonName(id, name);
}
//delete
@Transactional
public void deleteJpaPersonAge(Integer age){
 jpaPersonRepository.deleteJpaPersonAge(age);
}

//insert

 @Transactional
 public void insert(String name, int age) {
      jpaPersonRepository.insert(String name, int age);
    }


}

 

3.3.3应用调用

package com.springjpa.orclSpringJpaTest;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

import com.springjpa.orclSpringJpa.IJpaPersonRepository;
import com.springjpa.orclSpringJpa.JpaPerson;
import com.springjpa.orclSpringJpa.JpaPersonService;

public class PersonTest {
private ApplicationContext ctx =null;
private IJpaPersonRepository  jpaPersonRepository =null;
private JpaPersonService jpaPersonService =null;
{
ctx = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
jpaPersonRepository = ctx.getBean(IJpaPersonRepository.class);
jpaPersonService = ctx.getBean(JpaPersonService.class);
}

@Test
public void testSpringData_getTotalCount(){
long count = jpaPersonRepository.getTotalCount();
System.out.println("记录数: " + count);
}

@Test
public void testSpringData_updateJpaPersonName(){
jpaPersonService.updateJpaPersonName("美丽传说", 1);
}

@Test
public void testSpringData_deleteJpaPersonAge(){
jpaPersonService.deleteJpaPersonAge(5);
}
}

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139909.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 多元函数求极值,万能函数——fmincon讲解

    多元函数求极值,万能函数——fmincon讲解    matlab中的函数fmincon可用于求可以求取多元函数的极值,其约束包括五种:1、线性不等式约束;2、线性等式约束;3、变量约束;4、非线性不等式约束;5、非线性等式约束。其形式如下:x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)求解问题的标准型为minF(X)s.tAX&lt;=b(线性不等式约束)AeqX=beq(线性等式…

  • 【DeepLearning学习笔记】Neurons神经元

    【DeepLearning学习笔记】Neurons神经元今天找到一个比较好的deeplearning的教材:NeuralNetworksandDeepLearning对神经网络有详细的讲解,鉴于自己青年痴呆,还是总结下笔记吧=。=Perceptr

  • django 验证码_rhino5授权验证失败

    django 验证码_rhino5授权验证失败验证和授权概述Django有一个内置的授权系统。他用来处理用户、分组、权限以及基于cookie的会话系统。Django的授权系统包括验证和授权两个部分。验证是验证这个用户是否是他声称的人(比如用户名

  • 微信小程序开发【前端+后端(java)】

    微信小程序开发【前端+后端(java)】前言现在微信小程序越来越火了,相信不少人都通过各种途径学习过微信小程序或者尝试开发,作者就是曾经由于兴趣了解开发过微信小程序,最终自己的毕业设计也是开发一个微信小程序。所以现在用这篇博客记录我之前开发的一些经验和一些心得吧。主要内容springboot+mybatis构建小程序项目构建小程序组件讲解小程序api调用后台resetful接口编写小程序调用后台接口小…

  • kali linux破解wifi密码-超详细过程

    前期准备VMwareWorkstation虚拟机在虚拟机安装好kaillinunx系统无线网卡(芯片为3070或者1887L都支持Linux)一.打开终端,用airmon-ng命令查看如果出现无法访问…没有那个文件或目录解决办法:先在window主机上按win+r键然后输入services.msc回车找到VMwareUSBArbitrationService,双击…

  • 大学四年,我把私藏的自学「学习网站/实用工具」都贡献出来了

    大学四年,我把私藏的自学「学习网站/实用工具」都贡献出来了在分享之前,先说说初学者如何学习编程,这个话题想必非常的重要,要学好编程,给你一些学习网站也好、实用工具也好,但前提是你知道如何去学习它。见过很多初学者,以及小鹿我刚开始学习的时候,也是自己瞎摸索,找不到路子,看什么书?看什么资料?编程的方向太多了,如果确定自己的方向?尤其是上大一、大二甚至大三还没有确定自己到底是学习前端还是后天,每天这学一点,那学一块,掌握那么多,没有一门精通的,去面试的时候…

发表回复

您的电子邮箱地址不会被公开。

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