SpringBoot接入JPA连接数据库H2或MySQL例子

一,JPA相关的常用注解和对象

java 复制代码
@Entity,用于实体类声明语句之前,‌指出该Java类为实体类,‌将映射到指定的数据库表;

@Table,当实体类与其映射的数据库表名不同名时需要使用。‌该标注与@Entity标注并列使用,
‌置于实体类声明语句之前,‌用于指明数据库的表名。‌此外,‌@Table标注还有catalog和schema选项,‌
用于设置表所属的数据库目录或模式,‌通常为数据库名;

@Basic:‌用于属性到表字段的映射。‌如果get方法前没加注解,‌默认是该注解。‌fetch属性
表示该属性的读取策略,‌EAGER表示主支抓取,‌LAZY表示延迟加载。‌
optional属性表示该属性是否允许为空,‌默认值为true。‌

@Id,用于将实体类的属性映射为主键;
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "xx_seq"),指定主键生成策略,参见GenerationType 枚举类;
@SequenceGenerator(name = "xx_seq", sequenceName = "xx_seq"),
@Column(name="xxx"),位于属性前或get方法前,‌通常用于属性名与映射的表列名不同时,
‌name属性可以指定表名,‌还有unique、‌nullable、‌length等属性指定表列的属性;

@Transient,表示当前类属性无需映射到数据库表中字段;

@Temproal,主要针对 Date 类型的属性使用,可以通过该注解指定时间的精度,有
三种精确度:DATE,TIME,TIMESTAMP三种精确度:DATE,TIME,TIMESTAMP,
分别表示精确到日期,精确到时分秒,精确到日期+时分秒;

EntityManagerFactory,类似与 hibernate 的 SessionFactory;

EntityManager,是JPA中用于增删改查的接口,‌它充当了内存中的Java对象和数据库数据存储之间的桥梁;

EntityTransaction,JPA事务处理相关,根据EntityManager对象建立;

二,SpringBoot接入JPA连接H2或MySQL例子

1,首先,在pom.xml中添加Spring Data JPA和数据库驱动的依赖:

XML 复制代码
<dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
 
    <!-- 数据库驱动,以H2数据库为例 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
<!-- 其它依赖省略 -->

2,然后,在 application.properties 或 application.yml 中配置数据库连接和JPA属性:

css 复制代码
# application.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
#下面两行是连接mysql数据库
#spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=sa
spring.datasource.password=
 
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

# 下面一行是使用mysql数据库
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

#下面一行表示每次运行应用程序时更新数据库模式,
#即会根据java实体类相应字段的变化情况更新DB中相关表的字段,
#值除了update外还有create,但推荐使用 update,因create会删除对应表然后再新创建表
spring.jpa.hibernate.ddl-auto=update

#下面一行表示在控制台中显示执行的SQL语句
spring.jpa.show-sql=true

3,创建一个实体类User:

java 复制代码
import javax.persistence.*;
 
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @Column(nullable = false)
    private String name;
	
	@Column(nullable = false)
    private Integer age;
 
    // 更多字段增加,标准的getter和setter方法省略
}

4,创建一个继承自JpaRepository的接口UserRepository:

java 复制代码
import org.springframework.data.jpa.repository.JpaRepository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

	/** 根据名字进行模糊查询返回对象结果列表,
	其中 ?1 代表传递给查询方法的第一个参数*/
	@Query("SELECT u FROM User u WHERE u.name LIKE %?1%")
    List<User> findByUserName(String text);
	
	/** 根据名字和年龄查找, 
	其中 :xxx 和 注解@Param("xxx")中指定的名称要对应上,
	nativeQuery=true, 表示采用原生SQL语句方式编写查询*/
	@Query(nativeQuery=true, value="select * from user where name = :uname and age = :uage")
	List<User> queryByCondition(@Param("uname") String uname, 
	@Param("uage") Integer uage);

}

5,创建一个服务类UserService:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
	
	@PersistenceUnit
    private EntityManagerFactory entityManagerFactory;
	
	// 查询
    public List<User> listAllUsers() {
        return userRepository.findAll();
    }
	
	// 模糊查询
	public List<User> findByUserName(String userName) {
        return userRepository.findByUserName(userName);
    }
 
	// 精确查询
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
 
	// 保存(新增或更新)
    public User saveUser(User user) {
        return userRepository.save(user);
    }
	
	// 精确删除
	public void deleteEntity(Long userId) {
		EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction transaction = null;
		
		try {
			// 开启事务
            transaction = entityManager.getTransaction();
            transaction.begin();
			
			// 通过ID查询到实体
            User entityToDelete = entityManager.find(User.class, id);
			
			// 删除实体
            entityManager.remove(entityToDelete);
 
            // 提交事务
            transaction.commit();			
		} catch(Exception e) {
			if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
            // 处理异常
            e.printStackTrace();
		} finally {
            entityManager.close();
        }
	}
	
	
	//精确批量删除
	public void deleteEntity(Class<?> entityClass, 
		String fieldName, List<?> fieldValues) {
		EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction transaction = null;
		try {
			// 开启事务
            transaction = entityManager.getTransaction();
            transaction.begin();
			
			Query query = entityManager.createQuery("delete from " 
			+ entityClass.getSimpleName() + " e where e." + fieldName 
			+ " in :fieldValues");
			query.setParameter("fieldValues", fieldValues);
			int delNum = query.executeUpdate();
			
			// 提交事务
            transaction.commit();
		} catch(Exception e) {
			if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
            // 处理异常
            e.printStackTrace();
		} finally {
            entityManager.close();
        }	
	}	
	
}

6,controller 层省略

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
	
	@Autowired
	private UserService userService;
	
	/** 通过用户名称查询用户列表 */
	@GetMapping("/query")
	public List<User> queryUser(@RequestParam("name") String name){
		List<User> users = userService.findByUserName(name);
		return users;
	}

}

7,最后,创建一个启动类SpringBootJpaApplication:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class SpringBootJpaApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootJpaApplication.class, args);
    }
}

8,部分单元测试(对应的包名相应修改):

java 复制代码
import com.xx.yy.kk.dao.UserRepository;
import com.xx.yy.kk.model.User;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Optional;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {

    @Autowired
    private UserRepository userRepository;

    @Before
    public void before() {
        User user = new User();
        user.setId(1L);
        user.setName("张三");        
        userRepository.save(user);
		
        user = new User();
        user.setId(3L);
        user.setName("李四");        
        userRepository.save(user);
		
        user.setId(5L);
        user.setName("王五");        
        userRepository.save(user);
    }
	
    @Test
    public void testAdd() {
        User user = new User();
        user.setId(2L);
        user.setName("老六");        
        userRepository.save(user);
		
        User = new User();
        user.setId(4L);
        user.setName("王七");        
        userRepository.save(user);
    }
	
	@Test
    public void testQuery() {
		String userName="张三";
        List<User> users = userRepository.findByUserName(zhangsan);
		//...more...
    }

    @After
    public void after() {
        userRepository.deleteById(1L);
        userRepository.deleteById(3L);
        userRepository.deleteById(5L);
    }

}

部分代码需要补全或结合自己的情况修改,这里仅展示SpringBoot接入JPA连接数据库H2或MySQL例子的过程,谢谢拍砖讨论...

相关推荐
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
汤姆yu1 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶1 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
biyezuopinvip3 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
JavaGuide3 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot