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

相关推荐
ruleslol8 分钟前
MySQL的段、区、页、行 详解
数据库·mysql
天若有情6739 分钟前
校园二手交易系统实战开发全记录(vue+SpringBoot+MySQL)
vue.js·spring boot·mysql
while(1){yan}25 分钟前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
奋进的芋圆32 分钟前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
それども34 分钟前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊42 分钟前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
计算机程序设计小李同学1 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
富士康质检员张全蛋1 小时前
JDBC 连接池
数据库
yangminlei1 小时前
集成Camunda到Spring Boot项目
数据库·oracle
小刘爱搬砖2 小时前
SpringBoot3 + GraalVM安装和初次打包
spring boot·graalvm