spring data jpa 入门

spring data jpa 入门初衷本文是 springdatajp 入门级的操作 实现 CRUD 操作 详细的概念可以参考文末的文章 参考网上一些文章 实际 coding 的时候还是出好多错误 这里记录摸索填坑的过程

初衷

项目中有用到spring data jpa,简单看了一下,在基础的数据库操作上,要比mybatis好用,简化了持久层的操作,使coder可以专注于业务逻辑的实现。网上参考了一些文章,实际coding的时候还是出好多错误。这里通过CRUD,记录摸索填坑的过程。详细的概念可以参考文末的文章。


创建工程


配置

web.xml

 
      <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>spring-jpa-web 
     display-name>  
      <servlet> <servlet-name>appServlet 
     servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet 
     servlet-class> <init-param> <param-name>contextConfigLocation 
     param-name> <param-value>classpath:spring.xml 
     param-value>  
     init-param> <load-on-startup>1 
     load-on-startup>  
     servlet> <servlet-mapping> <servlet-name>appServlet 
     servlet-name> <url-pattern>/ 
     url-pattern>  
     servlet-mapping>  
     web-app> 

pom.xml

特别说明,spring-data-jpa要用版本1.9.0.RELEASE。

 
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0 
     modelVersion> <groupId>org.wxs.spring 
     groupId> <artifactId>spring-jpa-web 
     artifactId> <packaging>war 
     packaging> <version>0.1.0 
     version> <properties> <spring_version>4.3.0.RELEASE 
     spring_version> <spring_jpa_version>1.9.0.RELEASE 
     spring_jpa_version> <spring_data_commons_version>1.12.6.RELEASE 
     spring_data_commons_version> <hibernate.version>4.2.5.Final 
     hibernate.version>  
     properties> <dependencies>  
       
      <dependency> <groupId>org.springframework.data 
     groupId> <artifactId>spring-data-jpa 
     artifactId> <version>${spring_jpa_version} 
     version>  
     dependency>  
      <dependency> <groupId>org.hibernate 
     groupId> <artifactId>hibernate-core 
     artifactId> <version>${hibernate.version} 
     version>  
     dependency> <dependency> <groupId>org.hibernate 
     groupId> <artifactId>hibernate-entitymanager 
     artifactId> <version>${hibernate.version} 
     version>  
     dependency> <dependency> <groupId>org.hibernate 
     groupId> <artifactId>hibernate-ehcache 
     artifactId> <version>${hibernate.version} 
     version>  
     dependency>  
      <dependency> <groupId>org.apache.tomcat 
     groupId> <artifactId>tomcat-jdbc 
     artifactId> <version>7.0.54 
     version>  
     dependency>  
      <dependency> <groupId>mysql 
     groupId> <artifactId>mysql-connector-java 
     artifactId> <version>5.1.35 
     version>  
     dependency>  
      <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-core 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-beans 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-web 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-webmvc 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-context 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-orm 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-tx 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-jdbc 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-context-support 
     artifactId> <version>${spring_version} 
     version>  
     dependency> <dependency> <groupId>org.springframework 
     groupId> <artifactId>spring-test 
     artifactId> <version>${spring_version} 
     version>  
     dependency>  
       
      <dependency>  
      <groupId>junit 
     groupId> <artifactId>junit 
     artifactId>  
       
       
       
      <version>4.12 
     version> <scope>test 
     scope>  
     dependency>  
      <dependency> <groupId>org.apache.tomcat 
     groupId> <artifactId>tomcat-servlet-api 
     artifactId> <version>8.0.3 
     version> <scope>provided 
     scope>  
     dependency> <dependency> <groupId>org.apache.tomcat 
     groupId> <artifactId>jsp-api 
     artifactId> <version>6.0.39 
     version> <scope>provided 
     scope>  
     dependency> <dependency> <groupId>jstl 
     groupId> <artifactId>jstl 
     artifactId> <version>1.2 
     version>  
     dependency> <dependency> <groupId>javax.servlet.jsp 
     groupId> <artifactId>jsp-api 
     artifactId> <version>2.1 
     version> <scope>provided 
     scope>  
     dependency>  
       
     dependencies>  
     project>

spring.xml

 
      <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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd" default-lazy-init="true"> <description>Spring公共配置 
     description>  
      <context:component-scan base-package="com.wx.jpa"/>  
      <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/> <property name="packagesToScan" value="com.wx.jpa.entities"/> <property name="jpaProperties"> <props>  
      <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy 
     prop>  
     props>  
     property> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>  
     property>  
     bean> <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="generateDdl" value="true"/> <property name="database" value="MYSQL"/> <property name="databasePlatform" value="org.hibernate.dialect.MySQLInnoDBDialect"/>  
     bean>  
      <jpa:repositories base-package="com.wx.jpa.repository" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>  
      <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/>  
     bean>  
      <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/>  
     bean>  
      <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">  
      <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/>  
      <property name="maxActive" value="${jdbc.pool.maxActive}"/> <property name="maxIdle" value="${jdbc.pool.maxIdle}"/> <property name="minIdle" value="0"/> <property name="defaultAutoCommit" value="true"/>  
     bean>  
      <context:property-placeholder location="classpath:jdbc.properties"/>  
     beans>

属性文件

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=admin jdbc.pool.maxIdle=5 jdbc.pool.maxActive=10

Entity

新建表

新建表 user

这里写图片描述

实体类

新建实体类User

@Entity @Table(name = "user") public class User { 
       @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name = "password") private String password; @Column(name = "birthday") private Date birthday; / * The default constructor only exists for the sake of JPA. You won’t use it directly, so it is designated as protected. */ protected User() { } public User(String name, String password, Date birthday) { this.name = name; this.password = password; this.birthday = birthday; } getter、setter省略

DAO层

创建接口UserRepository

public interface UserRepository extends JpaRepository<User,Integer> { 
        }

测试

新增

 @Test public void test1(){ User user=new User("SL1","123",new Date()); userRepository.save(user); System.out.println("save success"); }

这里写图片描述

查询

查询全部

 @Test public void test2(){ for (User user:userRepository.findAll()) { System.out.println(user); } System.out.println("search all success"); }

查询结果

User{id=9, name='SL1', password='123', birthday=2017-01-12 00:00:00.0} User{id=10, name='SL1', password='123', birthday=2017-01-12 00:00:00.0} User{id=11, name='SL1', password='123', birthday=2017-01-13 00:00:00.0} search all success

根据ID查询

 @Test public void test3(){ System.out.println(userRepository.findOne(9)); System.out.println("search one success"); }

查询结果

User{id=9, name='SL1', password='123', birthday=2017-01-12 00:00:00.0} search one success

更新

如果有Id,jpa会认为是更新,没有则是新增。

 @Test public void test4(){ User user=new User("SL99","123",new Date()); user.setId(9); userRepository.save(user); test3(); System.out.println("update success"); }

更新成功

User{id=9, name='SL99', password='123', birthday=2017-01-13 00:00:00.0} search one success update success

删除

 @Test public void test5(){ userRepository.delete(9); test3(); System.out.println("delete success"); }

删除成功

null search one success delete success

踩过的坑

坑1

java.lang.AbstractMethodError: org.springframework.data.repository.core.support.RepositoryFactorySupport.getTargetRepository(Lorg/springframework/data/repository/core/RepositoryInformation;)Ljava/lang/Object;

解决方案

Deleting the spring-data-commons and changing the spring-data-jpa version to 1.9.0.RELEASE like @peeskillet said now works fine!
这也是为什么pom文件中spring-data-jpa要配置1.9.0.RELEASE的版本。

坑2

java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object

解决方案

Dao层的接口继承JpaRepository的时候加上泛型。添加域对象类型和主键类型。

public interface UserRepository extends JpaRepository

坑3

org.hibernate.InstantiationException: No default constructor for entity: com.wx.jpa.entities.User

新增、根据ID查询这2个方法不会报这个异常。

解决方案


欢迎感兴趣的同学指正。。。


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

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

(0)
上一篇 2026年3月16日 下午7:44
下一篇 2026年3月16日 下午7:45


相关推荐

  • Java 技术是什么?

    Java 技术是什么?Java技术既是一种高级的面向对象的编程语言,也是一个平台。Java技术基于Java虚拟机(Javavirtualmachine,JVM)的概念——这是语言与底层软件和硬件之间的一种转换器。Java语言的所有实现都必须实现JVM,从而使Java程序可以在有JVM的任何系统上运行。Java编程语言(Javaprogramminglanguage)与众不同之

    2022年7月8日
    24
  • 黄仁勋GTC演讲要点:将营收预测上调至1万亿美元,推出极简养虾NemoClaw智能体平台

    黄仁勋GTC演讲要点:将营收预测上调至1万亿美元,推出极简养虾NemoClaw智能体平台

    2026年3月17日
    3
  • 用Excel处理笛卡尔积

    用Excel处理笛卡尔积    工作中遇到需要处理笛卡尔积的需求,用数据库只需把需要做笛卡尔积的各列进行外链接就可以了,想到Excel应该可以处理这样的需求,就百度学习了一下,但还是看不太懂,下面只是依葫芦画瓢做了一遍,记录一下。1、构建两列数据,如下图:2、构建D列辅助列,E列为用index函数处理A列后的数据,每个值的重复次数为B列的数值行数。3、用index()函数处理B列:…

    2022年7月27日
    123
  • GoogLeNet论文详解[通俗易懂]

    GoogLeNet论文详解[通俗易懂]GoogLeNet1.Introduction  得益于深度学习的优势和更强大的卷积神经网络的出现,图像分类和目标检测的准确率发生了令人意想不到的进步。在2014年的ILSVRC比赛中,GoogLeNet取得了第一名的成绩,所用模型参数不足AlexNet(2012年冠军)的1/12。论文题目《Goingdeeperwithconvolutions》中的deeper有两层含义…

    2022年8月14日
    12
  • 扣子(Coze)实战教程:一分钟搞定1000条公众号文章,重写与发布一气呵成!

    扣子(Coze)实战教程:一分钟搞定1000条公众号文章,重写与发布一气呵成!

    2026年3月12日
    2
  • 怎么更改wifi频段_wifi信道和频段怎么设置?「建议收藏」

    怎么更改wifi频段_wifi信道和频段怎么设置?「建议收藏」现在基本上每家都有无线路由器,在家里我们用手机一搜WIFI,就是几个甚至几十个,WIFI信号相互之间会有相互的干扰,当周围的很多无线路由器发射的信号在同一个信道的时候,干扰更为严重,影响到了我们的WiFi性能和网速的体验,甚至出现频繁的掉线情况。无线网络信号在空气中传播频率范围通常是2.4~2.4835GHz,但是这些频段被分为了11或13个信道,我们一般家里用的都有13个信道可以选择。通常情况下…

    2022年10月20日
    6

发表回复

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

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