1**. 创建工程,导入坐标**
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.10version>
dependency>
<dependency>
<groupId>com.mchangegroupId>
<artifactId>c3p0artifactId>
<version>0.9.5.4version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
<scope>providedscope>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.15version>
dependency>
<dependency>
<groupId>commons-dbcpgroupId>
<artifactId>commons-dbcpartifactId>
<version>1.2.2version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.58version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.9version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.1.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>5.1.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>5.1.5.RELEASEversion>
<scope>testscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>aopalliancegroupId>
<artifactId>aopallianceartifactId>
<version>1.0version>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>1.9.4version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-jpaartifactId>
<version>2.2.3.RELEASEversion>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-coreartifactId>
<version>5.4.9.Finalversion>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-entitymanagerartifactId>
<version>5.4.9.Finalversion>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-validatorartifactId>
<version>6.0.18.Finalversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
<version>5.1.9.RELEASEversion>
dependency>
dependencies>
2.配置Spring的配置文件(整合Spring Data Jpa)
注意:mysql指定数据库方言时,新版本要用MySQL5Dialect
老版本用MySQLDialect
不然会连接数据库异常
<context:property-placeholder location="classpath:druid.properties"/>
<context:component-scan base-package="com.sinosoft"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource">property>
<property name="packagesToScan" value="com.sinosoft.entity">property>
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider">bean>
property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false">property>
<property name="database" value="MYSQL">property>
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect">property>
<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: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层接口
/*
* 符合SpringDataJpa的dao层接口规范
* JpaRepository<操作的实体类,实体类主键的类型>
封装了基本的CRUD操作
JpaSpecificationExecutor<操作的实体类>
* 封装了复杂查询(例如分页)
* */
public interface UsersDao extends JpaRepository<Users,Integer>, JpaSpecificationExecutor<Users> {
}
5.测试dao层接口
@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("[email protected]");
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)