persistence-demo之spring data jpa
0、前言
目的:旨在记录Spring Data JPA操作数据,持久层使用hibernate实现
项目结构:
1、导入pom文件
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.32.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
2、编写配置文件spring.xml
<?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:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
https://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--用于整合jpa,相当于类上的@EnableJpaRepositories-->
<jpa:repositories base-package="cn.itcast.orm.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager"
/>
<!--EntityManagerFactory-->
<bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<!--Hibernate实现-->
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!--生成数据库表-->
<property name="generateDdl" value="true"></property>
<property name="showSql" value="true"></property>
</bean>
</property>
<!--设置实体类的包-->
<property name="packagesToScan" value="cn.itcast.orm.entity"></property>
<property name="dataSource" ref="dataSource" ></property>
</bean>
<!--数据源-->
<bean class="com.alibaba.druid.pool.DruidDataSource" name="dataSource">
<property name="username" value="root"/>
<property name="password" value="abc123456#"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://10.10.50.160:3306/test?characterEncoding=UTF-8"/>
</bean>
<!--声明式事务-->
<bean class="org.springframework.orm.jpa.JpaTransactionManager" name="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!--启动注解方式的声明式事务-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
3、或步骤2同样作用的Config类:SpringDataJPAConfig.java
package cn.itcast.orm.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
/**
* @author jiangl
* @ClassName SpringDataJPAConfig.java
* @Description Config类
* @createTime 2022年06月03日 11:21
*/
@Configuration //标记当前类为配置类 =xml配文件
@EnableJpaRepositories(basePackages = "cn.itcast.orm.repository") //启动jpa <jpa:repositories>
@EnableTransactionManagement //开启事务
public class SpringDataJPAConfig
{
/*
<!--数据源-->
<bean class="com.alibaba.druid.pool.DruidDataSource" name="dataSource">
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springdata_jpa?characterEncoding=UTF-8"/>
</bean>
*/
@Bean
public DataSource dataSource()
{
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername("root");
dataSource.setPassword("abc123456#");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://10.10.50.160:3306/test?characterEncoding=UTF-8");
return dataSource;
}
/*
<!--EntityManagerFactory-->
<bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<!--Hibernate实现-->
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!--生成数据库表-->
<property name="generateDdl" value="true"></property>
<property name="showSql" value="true"></property>
</bean>
</property>
<!--设置实体类的包-->
<property name="packagesToScan" value="com.tuling.pojo"></property>
<property name="dataSource" ref="dataSource" ></property>
</bean>
*/
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
{
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("cn.itcast.orm.entity");
factory.setDataSource(dataSource());
return factory;
}
/*
<bean class="org.springframework.orm.jpa.JpaTransactionManager" name="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
*/
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory)
{
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
4、编写实体类
package cn.itcast.orm.entity;
import javax.persistence.*;
/**
* @author jiangl
* @ClassName Book.java
* @Description 实体类,图书
* @createTime 2022年06月03日 11:21
*/
@Entity
@Table(name = "t_book")
public class Book
{
@Id
@Column(name = "bid")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;//主键
@Column(name = "bname")
private String name;//图书名称
@Column(name = "author")
private String author;//作者
@Column(name = "price")
private double price;//价格
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 String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
public double getPrice()
{
return price;
}
public void setPrice(double price)
{
this.price = price;
}
@Override
public String toString()
{
return "Book{" + "id=" + id + ", name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + '}';
}
}
5、编写repository(dao)层
package cn.itcast.orm.repository;
import cn.itcast.orm.entity.Book;
import org.springframework.data.repository.CrudRepository;
/**
* @author jiangl
* @ClassName BookRepository.java
* @Description
* @createTime 2022年06月07日 16:38
*/
public interface BookRepository extends JpaRepository<Book, Integer>
{
}
7、编写测试类
package cn.itcast.orm;
import cn.itcast.orm.config.SpringDataJPAConfig;
import cn.itcast.orm.entity.Book;
import cn.itcast.orm.repository.BookRepository;
import javafx.scene.input.PickResult;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
import java.util.Optional;
/**
* @author jiangl
* @ClassName BookTest.java
* @Description
* @createTime 2022年06月07日 21:13
*/
//@ContextConfiguration("/spring.xml") //xml文件
@ContextConfiguration(classes = SpringDataJPAConfig.class) //config类
@RunWith(SpringJUnit4ClassRunner.class)
public class BookTest
{
@Autowired
public BookRepository bookRepository;
@Test
public void getOne()
{
Optional<Book> book = bookRepository.findById(20);
System.out.println(book);
}
@Test
public void testPage()
{
Page<Book> page = bookRepository.findAll(PageRequest.of(1, 2));
List<Book> books = page.getContent();
for (Book book : books) {
System.out.println(book);
}
}
@Test
public void test01()
{
Book book = new Book();
book.setName("c#从入门到精通");
book.setPrice(9.8);
Example<Book> example =Example.of(book);
List<Book> books = bookRepository.findAll(example);
System.out.println(books);
}
}
6、测试
保存数据成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结