在本篇文章,将手把手带着大家学会使用SpringBoot整合JPA,其实这都很简单。下边就列举出两种整合方法
第一种方式
导入如下依赖
<!--spring data jpa-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.6.Final</version>
</dependency>
编写实体类
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import ;
/**
* 雇员: 先开发实体类===>自动生成数据表
*/
@Entity
public class Employee {
private Integer id;
private String name;
private Integer age;
//主键自增
@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 20)
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
编写映射接口,需要注意的是不一定非要@RespositoryDefinition注解,也可以直接继承Repository或者是JapRepository(相比于Repository有分页功能),并且传入实体类和主键的类型。
//可以使用此注解声明实体类,并且在后边指定主键的类型
@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
public interface EmployeeRepository { //extends Repository<Employee,Integer>{
//使用JPA模板——————————————————————————————————————
public Employee findByName(String name);
// where name like ?% and age <?
public List<Employee> findByNameStartingWithAndAgeLessThan(String name, Integer age);
// where name like %? and age <?
public List<Employee> findByNameEndingWithAndAgeLessThan(String name, Integer age);
// where name in (?,?....) or age <?
public List<Employee> findByNameInOrAgeLessThan(List<String> names, Integer age);
// where name in (?,?....) and age <?
public List<Employee> findByNameInAndAgeLessThan(List<String> names, Integer age);
//自定义————————————————————————————————————————
@Query("select o from Employee o where id=(select max(id) from Employee t1)")
public Employee getEmployeeByMaxId();
@Query("select o from Employee o where =?1 and o.age=?2")
public List<Employee> queryParams1(String name, Integer age);
@Query("select o from Employee o where =:name and o.age=:age")
public List<Employee> queryParams2(@Param("name")String name, @Param("age")Integer age);
@Query("select o from Employee o where like %?1%")
public List<Employee> queryLike1(String name);
@Query("select o from Employee o where like %:name%")
public List<Employee> queryLike2(@Param("name")String name);
@Query(nativeQuery = true, value = "select count(1) from employee")
public long getCount();
@Modifying
@Query("update Employee o set o.age = :age where = :id")
public void update(@Param("id")Integer id, @Param("age")Integer age);
}
配置文件
spring:
jpa:
hibernate:
# 更新或者创建数据表结构,如果没有就创建,有的话就更新
ddl-auto: update
# 控制台显示SQL
show-sql: true
在测试类中进行测试(先要给数据库里添加几条记录)
public class EmployeeRepositoryTest {
private ApplicationContext ctx = null;
private EmployeeRepository employeeRepository = null;
//测试类中的前置通知
@Before
public void setup() {
ctx = new ClassPathXmlApplicationContext("beans-new.xml");
employeeRepository = ctx.getBean(EmployeeRepository.class);
System.out.println("setup");
}
//测试类中的后置通知
@After
public void tearDown() {
ctx = null;
System.out.println("Done");
}
@Test
public void testFindByName() {
System.out.println(employeeRepository);
Employee employee = employeeRepository.findByName("zhangsan");
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
@Test
public void testFindByNameStartingWithAndAgeLessThan() {
List<Employee> employees = employeeRepository.findByNameStartingWithAndAgeLessThan("test", 22);
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testFindByNameEndingWithAndAgeLessThan() {
List<Employee> employees = employeeRepository.findByNameEndingWithAndAgeLessThan("6", 23);
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testFindByNameInOrAgeLessThan() {
List<String> names = new ArrayList<String>();
names.add("test1");
names.add("test2");
names.add("test3");
List<Employee> employees = employeeRepository.findByNameInOrAgeLessThan(names, 22);
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testFindByNameInAndAgeLessThan() {
List<String> names = new ArrayList<String>();
names.add("test1");
names.add("test2");
names.add("test3");
List<Employee> employees = employeeRepository.findByNameInAndAgeLessThan(names, 22);
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testGetEmployeeByMaxId() {
Employee employee = employeeRepository.getEmployeeByMaxId();
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
@Test
public void testQueryParams1() {
List<Employee> employees = employeeRepository.queryParams1("zhangsan", 20);
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testQueryParams2() {
List<Employee> employees = employeeRepository.queryParams2("zhangsan", 20);
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testQueryLike1() {
List<Employee> employees = employeeRepository.queryLike1("test");
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testQueryLike2() {
List<Employee> employees = employeeRepository.queryLike2("test1");
for (Employee employee : employees) {
System.out.println("id:" + employee.getId()
+ " , name:" + employee.getName()
+ " ,age:" + employee.getAge());
}
}
@Test
public void testGetCount() {
long count = employeeRepository.getCount();
System.out.println("count:" + count);
}
}
这就是第一种方法,反正我感觉还是有些麻烦,还有一些繁琐的配置
第二种方法
pom依赖
<!-- springdata jpa依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
编写实体类(也可以使用上边的)
- Entity:注解这是一个实体类
- Id一般和GeneratedValue一起用,Id是表明这是一个主键,GeneratedValue表明这是一个自增键
- Column:是属性列可以省略,如果有特殊的属性要求在Column后加上要求
- Transient :声明这是一个非映射字段
- Table:一些表信息都基本在Table里,比如Schema,name等
还有很多很多,如果有不懂的可以参考下边的博文
//使用JPA注解配置映射关系
@Entity //告诉JPA这是一个实体类(和数据表映射的类)
@Table(name = "tbl_user") //@Table来指定和哪个数据表对应;如果省略默认表名就是user;
public class User {
@Id //这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
private Integer id;
@Column(name = "last_name",length = 50) //这是和数据表对应的一个列
private String lastName;
@Column //省略默认列名就是属性名
private String email;
......
编写一个映射接口
//继承JpaRepository来完成对数据库的操作,Integer是主键类型
public interface UserRepository extends JpaRepository<User,Integer> {
}
配置
spring:
jpa:
hibernate:
# 更新或者创建数据表结构,如果没有就创建,有的话就更新
ddl-auto: update
# 控制台显示SQL
show-sql: true
这样就配置好了一个拥有基本CRUD功能的UserRepository,不仅可以CRUD也可以拼接等,接下来就和上边一样了,直接在测试类测试(需要先注入UserRepository)就ok了!
那个用起来简单就不用多说了!
package com.wrial.demo.dao;
import com.wrial.demo.domain.User;
import org.junit.Assert;
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.SpringJUnit4ClassRunner;
import java.text.DateFormat;
import java.util.Date;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void test() throws Exception {
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
String formattedDate = dateFormat.format(date);
//
// userRepository.save(new User("aa1", "aa@", "aa", "aa123456",formattedDate));
// userRepository.save(new User("bb2", "bb@", "bb", "bb123456",formattedDate));
// userRepository.save(new User("cc3", "cc@1222.com", "cc", "cc123456",formattedDate));
Assert.assertEquals(3, userRepository.findAll().size());
Assert.assertEquals("bb123456", userRepository.findByUserNameOrEmail("bb2", "cc@11222.com").getNickName());
userRepository.delete(userRepository.findByUserName("aa1"));
// userRepository.deleteAll();
}
}
整合和测试的代码已经上传到GitHub,感觉不错就点个Star吧!