SpringDataJpa的入门操作
一、搭建环境
1**. 创建工程,导入坐标**
<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>
<!--连接池-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mysql数据库连接-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!--json-->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--Spring相关jar包-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!--测试包-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--AOP相关jar包-->
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--Springmvc的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--SpringDataJpa依赖包-->
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.9.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.9.Final</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.hibernate/hibernate-validator-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
2.配置Spring的配置文件(整合Spring Data Jpa)
注意:mysql指定数据库方言时,新版本要用MySQL5Dialect
老版本用MySQLDialect
不然会连接数据库异常
<!--导入配置文件-->
<context:property-placeholder location="classpath:druid.properties"/>
<context:component-scan base-package="com.sinosoft"/>
<!--spring 和 spring data jsp的配置-->
<!--1.创建entityManagerFactory对象交给Spring管理-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--包扫描,扫描实体类所在的包-->
<property name="packagesToScan" value="com.sinosoft.entity"></property>
<!--jpa实现的厂家-->
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider"></bean>
</property>
<!--jpa供应商适配器-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!--是否自动创建数据库表-->
<property name="generateDdl" value="false"></property>
<!--指定数据库类型-->
<property name="database" value="MYSQL"></property>
<!--指定数据库方言,新版本用MySQL5Dialect-->
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"></property>
<!--是否在控制台显示sql语句-->
<property name="showSql" value="true"></property>
</bean>
</property>
</bean>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${Jdbc.driverClassName}"></property>
<property name="url" value="${Jdbc.url}"></property>
<property name="username" value="${Jdbc.username}"></property>
<property name="password" value="${Jdbc.pwd}"></property>
</bean>
<!--整合JPA,扫描DAO层,事务配置,实例类-->
<jpa:repositories
base-package="com.sinosoft.dao"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory">
</jpa:repositories>
<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
3.编写实体类,使用JPA注解配置映射关系
一定要生成Getter/Setter方法
@Entity//告诉JPA这是一个实体类(和数据表映射的类)
@Table(name = "users")//指定来和哪个数据表进行映射;如果省略那么默认是表名小写
public class Users {
@Id//主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
private Integer id;
@Column//省略默认列名就是属性名
private String name;
@Column //指定表名
private String pwd;
@Column
private String email;
4.编写一个符合SpringDataJpa的dao层接口
- 只需要编写dao层接口,无需实现类
- dao层接口规范
1.需要继承两个接口(JpaRepository,JpaSpecificationExecutor)
2.需要提供响应的泛型
/*
* 符合SpringDataJpa的dao层接口规范
* JpaRepository<操作的实体类,实体类主键的类型>
封装了基本的CRUD操作
JpaSpecificationExecutor<操作的实体类>
* 封装了复杂查询(例如分页)
* */
public interface UsersDao extends JpaRepository<Users,Integer>, JpaSpecificationExecutor<Users> {
}
5.测试dao层接口
- finall() :查询所有用户
- save(users) :报错或者更新(依据:传递的实体类对象中,是否包含id属性)
- delete(id) :根据id删除
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UsersDaoTest {
@Autowired
UsersDao usersDao;
/**
* 查询所有
*/
@Test
public void findTest(){
List<Users> all = usersDao.findAll();
System.out.println(all);
}
/**
* save:保存或者更新
* 根据传递的对象是否存在主键id
* 如果没有id属性:保存
* 存在id数据,根据id查询数据,更新数据
*/
@Test
public void saveTest(){
Users users = new Users();
users.setName("吴彦祖");
users.setPwd("123");
users.setEmail("123@qq.com");
usersDao.save(users);
}
/**
* 如果传递的对象有id属性,保存会变成更新
* 并且没有赋值的实体类属性,表中对应的字段会自动变成Null
*/
@Test
public void updateTest(){
Users users = new Users();
users.setId(28);
users.setName("wms吴彦祖");
users.setPwd("123");
usersDao.save(users);
}
/*
* 根据id删除
* */
@Test
public void deleteTest(){
usersDao.deleteById(28);
}
6.SpringDataJpa的运行过程和原理剖析
1.通过JdkDynamicAopProxy的invoke方法创建了一个动态代理对象
2.SimpleJpaRepository当中封装了Jpa的操作(借助JPA的api完成数据的CRUD)
3.通过hibernate完成数据库操作(封装了jdbc)