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

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

@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事务处理相关;

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

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

<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属性:

# 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:

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:

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:

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 层省略

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

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,部分单元测试(对应的包名相应修改):

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例子的过程,谢谢拍砖讨论...

相关推荐

  1. SpringBoot接入JPA连接数据库H2MySQL例子

    2024-07-20 20:36:05       25 阅读
  2. springboot集成h2数据库

    2024-07-20 20:36:05       47 阅读
  3. SpringBoot连接mysql数据库相关配置(druid连接池)

    2024-07-20 20:36:05       62 阅读
  4. 数据源配置H2 Mysql

    2024-07-20 20:36:05       59 阅读
  5. mysql、oracle、db2数据库连接参数

    2024-07-20 20:36:05       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 20:36:05       141 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 20:36:05       156 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 20:36:05       129 阅读
  4. Python语言-面向对象

    2024-07-20 20:36:05       141 阅读

热门阅读

  1. CentOS7中的yum命令不可用,网络不可达

    2024-07-20 20:36:05       25 阅读
  2. HTML5的离线存储

    2024-07-20 20:36:05       26 阅读
  3. 牛客周赛51:小红走矩阵(二分+bfs)

    2024-07-20 20:36:05       31 阅读
  4. 设计模式--外观模式

    2024-07-20 20:36:05       27 阅读
  5. Kylin Cube Designer:数据洞察的魔法画布

    2024-07-20 20:36:05       22 阅读
  6. opencv读写路径包含中文的文件

    2024-07-20 20:36:05       28 阅读
  7. 探索Web世界:WebKit的地理位置API

    2024-07-20 20:36:05       32 阅读
  8. OpenCV从基础到入门(基于python)

    2024-07-20 20:36:05       24 阅读
  9. 运维 | Linux 系统中 MySQL 的安装与使用记录

    2024-07-20 20:36:05       25 阅读