spring data jpa使用 (转:http://www.manongjc.com/article/25284.html#four_1_7)
Jap相关的使用
一、jpa的概念
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。主要作用是简化JavaEE和JavaSE的应用开发,还有就是对ORM技术的整合。Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的JPA(Java Persistence API)兼容认证。其实如果对hibernate比较熟的,对于理解和应用JPA来说其实就没有多大困难了!,这里就不对Hibernate进行具体的介绍了。下文中用的全部为注释进行操作的,这里就不进行一一解说了。
二、jpa的相关注解描述
| 注解 | 作用 |
|---|---|
| @Basic | 基本注解,默认有 |
| @Entity | 指出该Java类为实体类,将映射到指定的数据库 |
| @Table | 标注常用name属性,用于指定数据库的表的名称 |
| @Id | 主键的映射 |
| @GeneratedValue | 用于标注主键的生成策略,通过strategy属性指定 |
| @Column | 映射数据表的列名,指定unique,length等 |
| @Temporal | 在属性上调整精度,比如Date |
| @Transient | 忽略该属性,不需要映射到数据表的一列,否则默认为@Basic |
| @JoinColumn | 用来映射外键 |
| @JoinTable | 插入表 多用于多对多或者一对多 |
| @OneToOne | 映射一对一的关系 |
| @OneToMany | 映射少对多的关系 |
| @ManyToOne | 映射多对少的关系 |
| @ManyToMany | 映射多对对的关系 |
- @Table的常用属性:
- name : 用来命名 当前实体类 对应的数据库 表的名字
- uniqueConstraints : 用来批量命名唯一键
- catalog : 实体指定的目录名或是数据库名
- schema : 实体指定的目录名或是数据库名
- @Entity的常用属性:
- name : 实体的名称
- @GeneratedValue的常用属性:
- strategy : ID的生成策略
- GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长型)
- GenerationType.AUTO 主键由程序控制
- GenerationType.TABLE 使用一个特定的数据库表格来保存主键
- GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列
- strategy : ID的生成策略
- @Column相关属性:
- name : 对应的列表的名称
- unique : 是否是唯一
- nullable : 是否为空
- length : 长度
- insertable : 是否插入表
- updatable :是否更新表
- @Temporal
- value : TemporalType.DATE,TemporalType.TIME,TemporalType.TIMESTAMP,以上三个参数分别表示年月日、时分秒、年与日时分秒
- @JoinColumn部分参数:
- name : 表的名称,一般情况下默认,但是多对多的时候第三方表的时候需要填写
- referencedColumnName : 产生外键,依据的列的名称
- @OneToOne、@OneToMany、@ManyToMany、@ManyToOne相关参数:
- targetEntity : 变量对应的类
- cascade : 关联级别
- fetch : 加载方式 FetchType.EAGER数据同步加 FetchType.LAZY 懒加载,使用的时候才会加载
- optional : 当其为false 真实关系必须存在 当其为true 可以不存在
- mappedBy : 放弃对外键的维护,数值为本类中在外键维护类中的变量名称
- orphanRemoval : 当执行级联操作删除时,如果此为true 那么就把关系被维护端的数据实体删除,false 不删除,删除的只是关系
三、jpa中类实体的映射关系
实体关系映射,简化编程操作,把冗余的操作交给底层框架来处理。只要我们把实体关系的映射写清楚,那么就不用过多的考虑sql语句的关系了。
1、一对一映射(@OneToOne)
一对一关系,说白了就是一个萝卜一个坑,这里例子是Student<----->Car,一个学生只有一辆车,一辆车的归属只是一个学生(当然学生可以没有车,车也可以不属于任何学生),如果关系必须存在的话,需要设置@OneToOne的属性optional
@OneToOne(optional = false)
Car的实例代码:
@Entity(name = "car")
@Table(name = "car",uniqueConstraints = {@UniqueConstraint(columnNames = {"license_plate"})})
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer carId;
@Column(name = "license_plate")
private String licensePlate;
@Column(name = "car_name")
private String carName;
@Column(name = "car_color")
private String carColor;
@OneToOne
@JoinColumn(name = "sid",referencedColumnName = "id")
private Student student;
.......get和set方法
}
Student的实现:
@Entity(name = "student")
@Table(name ="student" ,catalog = "smartdot")
public class Student {
@Id
//生成策略
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "class_num")
private String class_num;
@Column(name = "student_name")
private String student_name;
@Column(
name = "student_num",//对应的列表的名称
unique = true,//是否为唯一
nullable = false,//是否为空
length = 20,//长度
insertable = true,//是否插入表
updatable = true)//是否更新表
private String student_num;
@Temporal(TemporalType.TIMESTAMP)
private Date date;
/**
* fetch 属性为:
* FetchType.EAGER 数据同步加载
* FetchType.LAZY 懒加载,使用的时候才会加载
* mappedBy 属性为:
* 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,
* 如果类和类之间形成双向关系.我们就需要使用这个属性进行定义,
* 否则可能引起数据一致性的问题。该属性的值是“多”方class里的“一”方的变量名。
*
* targetEntity:
* 定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
* cascade 级联操作:
* CascadeType.PERSIST 级联新建
* CascadeType.REMOVE 级联删除
* CascadeType.REFRESH 级联刷新
* CascadeType.MERGE 级联更新
* CascadeType.ALL 级联以上全部
* orphanRemoval :
* 当执行级联操作删除时,如果此为true
* 那么就把关系被维护端的数据实体删除,
* false 不删除,删除的只是关系
*/
@OneToOne(cascade = {CascadeType.ALL},orphanRemoval = true)
@JoinColumn(name = "car_id",referencedColumnName = "carid")
private Car car;
.......get和set方法
}
2、一对多映射(@OneToMany和@ManyTone)
一对多关系即数据库中的一行数据关联另一个数据库中的多行关系,多对一与之相反。举个具体的例子,现在有100本书,有10个学生,分给10个学生那么每一本书肯定属于一个学生,每个学生有多本书。所以他们的对应关系为:
Student-----OneToMany----->Book
Book-----ManyToOne----->Student
@ManyToOne 以在Collection、Set、List、Map上使用,我们可以根据业务需要选择。Collection类是Set和List的父类,在未确定使用Set或List时可使用;
Set集合中对象不能重复,并且是无序的;List集合中的对象可以有重复,并且可以有排序;
Book的实现代码:
@Entity(name = "book")
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
/*
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制
*/
private Integer bookId;
@Column(name = "book_name",unique = false,nullable = false)
private String bookName;
@Column(name = "book_price",unique = false,nullable = false)
private String bookPrice;
@Column(name = "book_color",unique = false,nullable = false)
private String bookColor;
@ManyToOne(fetch = FetchType.LAZY,optional = true,cascade = {CascadeType.MERGE,CascadeType.PERSIST })
@JoinColumn(name="sid")
private Student student;
.......get和set方法
}
Student的实现代码:
@Entity(name = "student")
@Table(name ="student" ,catalog = "smartdot")
public class Student {
@Id
//生成策略
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "class_num")
private String class_num;
@Column(name = "student_name")
private String student_name;
@Column(
name = "student_num",//对应的列表的名称
unique = true,//是否为唯一
nullable = false,//是否为空
length = 20,//长度
insertable = true,//是否插入表
updatable = true)//是否更新表
private String student_num;
@Temporal(TemporalType.TIMESTAMP)
private Date date;
@OneToMany(targetEntity = Book.class,fetch=FetchType.EAGER, orphanRemoval = false,cascade={CascadeType.ALL })
@JoinColumn(name = "sid",referencedColumnName = "id")
//注意这里需要初始化
private Set<Book> books = new HashSet<>();
.......get和set方法
}
3、多对多映射关系(@ManyToMany)
多对多关系是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。举个简单的例子:一个学生可以报考多门课程、每一门课程有很多学生报考,学生和课程之间产生了多对多的关系,需要注意的是在多对多关系的中,我们需要让其中的一方放弃对外键的维护,下面的例子中,课程放弃了对外键的维护。
Student的实现:
@Entity(name = "student")
@Table(name ="student" ,catalog = "smartdot")
public class Student {
@Id
//生成策略
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "class_num")
private String class_num;
@Column(name = "student_name")
private String student_name;
@Column(
name = "student_num",//对应的列表的名称
unique = true,//是否为唯一
nullable = false,//是否为空
length = 20,//长度
insertable = true,//是否插入表
updatable = true)//是否更新表
private String student_num;
@Temporal(TemporalType.TIMESTAMP)
private Date date;
@ManyToMany(targetEntity = Course.class,cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "student_course_mapping",
joinColumns = {@JoinColumn(name = "s_id")},
inverseJoinColumns = {@JoinColumn(name = "c_id")})
private Set<Course> courses = new HashSet<>();
.......get和set方法
Course的实现:
@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "course_credit")
private String course_credit;
@Column(name = "course_name")
private String course_name;
//放弃 外键的维护
//mappedBy声明于关系的被维护方,声明的值为关系的维护方的关系对象属性名
@ManyToMany(fetch = FetchType.LAZY,mappedBy = "courses")
private Set<Student> students = new HashSet<>();
.......get和set方法
}
4、单向与双向关联的简介
本文从头到尾所有的示例,使用的都是双向关联。即在关联双方都进行关联声明。而事实上,除了双向关联,还有一种用法是单向关联。即在关联的其中一方进行关联。其实可以简单的理解为Student中有Car的变量,但是Car中没有Student的变量,这时候就是单向关联。这样的话student中有外键只想Car但是Car就不会在产生外键了。
四、具体代码实现数据的保存、修改、查询
1、springboot+jap相关配置:
1.1相关的pom.xml,通过maven导入包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smartdot</groupId>
<artifactId>springbootjap</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springbootjap Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.smartdot.com</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--springboot的相关-->
<!--spring-boot-starter-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring-boot-starter-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>compile</scope>
</dependency>
<!--spring-boot-starter-aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--spring-boot-configuration-processor-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<!--spring boot web依赖包-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>compile</scope>
</dependency>
<!--jstl包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>compile</scope>
</dependency>
<!-- =========数据库相关======================== -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<!--测试软件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>springbootjap</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
1.2 数据库配置
# 配置mysql的属性
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.username=sgk
spring.datasource.password=111111
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/smartdot?characterEncoding=UTF-8&useSSL=true
## 初始化连接数
spring.datasource.dbcp2.initial-size=10
## 最大连接数
spring.datasource.dbcp2.max-total=100
## 最大空闲数
spring.datasource.dbcp2.max-idle=10
## 最小闲连接
spring.datasource.dbcp2.min-idle=2
## 最大等待毫秒数
spring.datasource.dbcp2.max-wait-millis=10000
# 配置jpa的属性
## 配置方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
1.3 Jpa的pojo和repository的配置
@SpringBootApplication
@ComponentScan(basePackages = {"com.smartdot.jpa"})
@EntityScan(basePackages = {"com.smartdot.jpa.pojo"})
@EnableJpaRepositories(basePackages = {"com.smartdot.jpa.repository"})
@Configuration
public class AppConfig {
}
其中
@EntityScan(basePackages = {"com.smartdot.jpa.pojo"})
@EnableJpaRepositories(basePackages = {"com.smartdot.jpa.repository"})
是对pojo和repository扫描的配置。
1.4创建Student的Repository
/**
* JpaRepository 第一个为pojo中的实体类 第二个为实体类的主键的类型
*/
public interface StudentRepository extends JpaRepository<Student,Integer>{
}
1.5完成数据库的增删改查的代码具体实现
我们可以找到JpaRepository的接口:
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
具体代码实现(主要是实现的查询):
public class JpaSelect {
@Autowired
StudentRepository studentRepository;
/**
* ExampleMatcher.GenericPropertyMatchers.contains() 包含字段
* ExampleMatcher.GenericPropertyMatchers.endsWith() 以该字段结尾
* ExampleMatcher.GenericPropertyMatchers.startsWith() 以该字段开始
* ExampleMatcher.GenericPropertyMatchers.caseSensitive() 区分大小写
* ExampleMatcher.GenericPropertyMatchers.exact() 精准匹配
* ExampleMatcher.GenericPropertyMatchers.ignoreCase() 忽略该字段
* ExampleMatcher.GenericPropertyMatchers.regex() 正则匹配
*
* 分页:Pageable
* 条件:Example
* 排序:Sort
*/
//分页 排序查询
public void pageSelect(){
Student student = new Student();
student.setClassum("三国");
student.setStudentum("2018");
Pageable pageable = PageRequest.of(0,2,new Sort(Sort.Direction.ASC,"id"));
ExampleMatcher exampleMatcher = ExampleMatcher.matchingAll()
.withMatcher("classum", ExampleMatcher.GenericPropertyMatchers.exact())
.withMatcher("studentum",ExampleMatcher.GenericPropertyMatchers.startsWith());
Example<Student> example = Example.of(student,exampleMatcher);
Page<Student> students = studentRepository.findAll(example, pageable);
students.forEach(x->{System.out.println(x);});
}
//条件查询并且排序
public void selectAllFuzzyueryQ(){
Student student = new Student();
student.setClassum("三国");
student.setStudentum("04");
Sort orders = new Sort(Sort.Direction.ASC,"studentum");
ExampleMatcher exampleMatcher = ExampleMatcher.matchingAll()
.withMatcher("classum", ExampleMatcher.GenericPropertyMatchers.contains())
.withMatcher("id",ExampleMatcher.GenericPropertyMatchers.caseSensitive())
.withMatcher("studentum", ExampleMatcher.GenericPropertyMatchers.endsWith());
List<Student> students = studentRepository.findAll(Example.of(student,exampleMatcher),orders);
for (Student s:students) {
System.out.println(s);
}
}
//准确的条件查询
public void selectAllExample (){
Student student = new Student();
student.setClassum("三国");
Example<Student> example_student = Example.of(student);
List<Student> stundets = studentRepository.findAll(example_student, new Sort(Sort.Direction.ASC, "studentum"));
for (Student s:
stundets) {
System.out.println(s);
}
}
//查询所有的Student 并且根据Student的属性studentum排序
public void selectAllSort(){
List<Student> students = studentRepository.findAll(new Sort(Sort.Direction.ASC,
"studentum"));
for (Student s:
students) {
System.out.println(s);
}
}
//查询所有的Student
public void selectAll(){
//直接查询所有
List<Student> students = studentRepository.findAll();
for (Student s:
students) {
System.out.println(s);
}
//
}
}
1.6 为单个Repository添加自定义方法
其实我们在开发过程中有很多时候需要进行自定义的查询条件,所以我们这里单独给StudentRepository添加一个自定义的接口,实现查找比给出的sid的值大的所有的学生,首先自定义接口:
public interface StudentCustomRepository {
//查找 比sid 大的所有的学生
public List<Student> findAllIdgreaterWith(Integer sid);
}
改造StudentRepository接口,这样StudentRepository同时继承于StudentCustomRepository和JpaRepository<Student,Integer>:
/**
* JpaRepository 第一个为pojo中的实体类 第二个为实体类的主键的类型
*/
public interface StudentRepository extends JpaRepository<Student,Integer>,StudentCustomRepository{
}
既然是自定义的方法,就需要我们自己去实现该方法。由于我们需要为StudentRepository添加自定义方法,Spring Data Jpa会自动的去寻找类名为StudentRepositoryImpl的类作为自定义方法的实现如果有两个以上类名为StudentRepositoryImpl的类,Spring Data Jpa会抛出错误。具体实现如下:
public class StudentRepositoryImpl implements StudentCustomRepository{
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Student> findAllIdgreaterWith(Integer sid) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
Root<Student> studentRoot = criteriaQuery.from(Student.class);
criteriaQuery.where(criteriaBuilder.greaterThan(studentRoot.get("id"),sid));
criteriaQuery.select(studentRoot);
TypedQuery<Student> query = entityManager.createQuery(criteriaQuery);
return query.getResultList();
}
}
这里使用的是EntityManager,来代替了Hibernate中的session,Criteria语法这里就不多解释了,可以看下Hibernate的Criteria的增删改查。
测试代码:
@SpringBootTest(classes = {AppConfig.class})
@RunWith(SpringRunner.class)
public class JpaSelect {
@Autowired
StudentRepository studentRepository;
@Test
public void test(){
List<Student> students = studentRepository.findAllIdgreaterWith(1);
students.forEach(x->{System.out.println(x);});
}
}
1.7 使用@Query增加原生的sql语句查询hql语句查询
如果需要查看原生的sql语句或Hibernate的hql语句,请自行查阅
/**
* JpaRepository 第一个为pojo中的实体类 第二个为实体类的主键的类型
*/
public interface StudentRepository extends JpaRepository<Student,Integer>,StudentCustomRepository{
//使用原生的sql 进行数据查询
@Query(value = "select * from student where class_num = ?1",nativeQuery = true)
public List<Student> selectStudentByClassNum(String classNum);
@Query(value = "select stu from com.smartdot.jpa.pojo.Student stu where class_num = ?1",nativeQuery = false)
public List<Student> selectStudentByClassNumHql(String classNum);
}
2、spring+jpa整合
spring+jpa的pom.xml配置:
<dependencies>
<!--导入spring相关的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
applicationContext.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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<!--加载数据库配置文件-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<context:component-scan base-package="com.smartdot.jpa.service"></context:component-scan>
<!--配置数据库连接池 这里使用的是dbcp-->
<bean name="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="maxTotal" value="${jdbc.maxTotal}"></property>
<property name="initialSize" value="${jdbc.initialSize}"></property>
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
<property name="maxWaitMillis" value="${jdbc.maxWait}"></property>
</bean>
<!-- spring整合JPA -->
<bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="com.smartdot.jpa.pojo"></property>
<!-- 指定持久层提供者为Hibernate -->
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- 自动建表 -->
<property name="generateDdl" value="true" />
<property name="database" value="MYSQL" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="showSql" value="true" />
</bean>
</property>
<!--方言-->
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!--指定Spring Data JPA要进行扫描的包,该包中的类框架会自动为其创建代理-->
<jpa:repositories base-package="com.smartdot.jpa.dao" />
</beans>
db.properties相关:
# dbcp mysql 数据库的配置
# mysql驱动
jdbc.driverClassName=com.mysql.jdbc.Driver
# mysql url
jdbc.url=jdbc:mysql://localhost/smartdot?characterEncoding=UTF-8&useSSL=true
# 账户名
jdbc.username=sgk
# 账户密码
jdbc.password=111111
# 最大连接数
jdbc.maxTotal=20
#<!-- 初始化连接 -->
jdbc.initialSize=10
#最大连接数量
jdbc.maxActive=50
#<!-- 最大空闲连接 -->
jdbc.maxIdle=20
#<!-- 最小空闲连接 -->
jdbc.minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
jdbc.maxWait=1000
以上配置完成以后,至于代码的实现增、删、改、查参考springboot+jpa的增删改查就可以了!
spring data jpa使用 (转:http://www.manongjc.com/article/25284.html#four_1_7)的更多相关文章
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- spring boot(五):spring data jpa的使用
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 深入浅出学Spring Data JPA
第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...
- spring data jpa 调用存储过程
网上这方面的例子不是很多,研究了一下,列出几个调用的方法. 假如我们有一个mysql的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1in ...
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...
- Spring Boot with Spring Data JPA (1) - Concept
What's Spring Data JPA? According to Pivotal, Spring Data JPA, part of the larger Spring Data family ...
- 了解 Spring Data JPA
前言 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为开发者提供了丰富的选择.它一改之前 EJB 2.x 中实体 B ...
- spring spring data jpa save操作事务
整合spring spring data jpa的时候,在save方法上加了@Transactional注解.此时调用springdatajpa save方法并不会真的把数据提交给数据库,而是缓存起来 ...
随机推荐
- HTML-参考手册: HTTP 方法:GET 对比 POST
ylbtech-HTML-参考手册: HTTP 方法:GET 对比 POST 1.返回顶部 1. HTTP 方法:GET 对比 POST 两种最常用的 HTTP 方法是:GET 和 POST. 什么是 ...
- Linux关闭端口
1. 查看哪些端口被占用 $ netstat -anp | grep 2042 tcp 0 0 192.168.56.1:2042 0.0.0.0:* LISTEN 8974/python 2. 删 ...
- 2019牛客多校第三场J-LRU management(map+双向链表)
LRU management 题目传送门 解题思路 用map索引对应地址,用双向链表维护序列. 代码如下 #include <bits/stdc++.h> #define INF 0x3f ...
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
- 用node-http-proxy搭建代理
程序员三大必备网站是:Google.Github.StackOverflow.如果你还在用Baidu搜索技术文章的话,我想说的是,少年你已经被鄙视很多年了,赶紧换成谷歌吧,不要再被鄙视了!Github ...
- 使ie8正常支持placeholder
在IE8下测试,发现一个问题placeholder不被支持,下面是解决IE支持placeholder的方法,本文引用的jquery是1.12.0测试通过,先引用jquery <script ty ...
- python调用tushare获取股票月线数据
接口:monthly 描述:获取A股月线数据 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare库下载和初始化教程,请查阅 ...
- IDEA下将dubbo简单项目跑Demo(2019.12版)
项目架构(聚合项目,父子模块) src没用,所以删去 选择maven项目,不用勾选模板骨架,直接main方法,因为不用到服务器 顺序是按照:添加pom依赖-接口实现类-配置文件 项目环境 IDE:In ...
- 令人清爽的异步函数async、await
1.什么是async.await? async用于声明一个函数是异步的.而await从字面意思上是"等待"的意思,就是用于等待异步完成.并且await只能在async函数中使用; ...
- http://localhost:8080 is requesting your username and password
after you startup your tomcat, you type a concrete request url in broswer, the tomcat probably wil ...