JPA包括以下3方面的技术:
1.ORM映射元数据。JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
2.API。用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
3.查询语言。这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
由于JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用.
SpringData JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成.
以下通过创建项目具体操作来一起了解项目。
创建项目
File->New->Project->New module,
创建完成后如下:
在pom.xml中配置数据库依赖包
<?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.example.springboot</groupId> <artifactId>springboot-jpa</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-jpa</name> <description>Demo project for Spring Boot</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--jpa依赖包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--mysql连接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
在application.properties配置文件中增加数据库连接,jpa连接
#修改server端口 #server.port=8085 #server.context-path=/springdemo #mysql数据连接 spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driverClassName=com.mysql.jdbc.Driver #spring.datasource.max-active=20 #spring.datasource.max-idle=8 #spring.datasource.min-idle=8 #spring.datasource.initial-size=20 #spirng jpa 配置 spring.jpa.database=MYSQL #显示sql语句 spring.jpa.show-sql=false spring.jpa.generate-ddl=true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto=update #spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy #spring.jpa.database=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
编写user实体类
package com.example.springboot.jpa.entity; import javax.persistence.*; /** * @desc 使用@Entity进行实体类持久化操作,jpa会检测到该主键是,会自动生成表结构 * @Author wangsh * @date 2018/5/5 21:40 * @return */ @Entity @Table(name = "t_User") public class User { /** * @Id指定主键id,@GeneratedValue指定主键生成策略为自增长 */ @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "username") private String userName; @Column(name = "password") private String password;}
编写dao操作数据库类
Repository接口是spring data 的一个核心接口,它不提供任何方法,开发者需要在自己定义接口中声明的方法。
1. Repository是一个空接口,即是一个标记接口;
2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。
3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。
4. 查询方法以find | read | get开头;
5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。
CrudRepository 接口提供了最基本添删改查操作
--T save(T entity);//保存单个实体--Iterable<T> save(Iterable<? extends T> entities);//保存集合
--T findOne(ID id);//根据id查找实体
--boolean exists(ID id);//根据id判断实体是否存在
--Iterable<T> findAll();//查询所有实体
--long count();//查询实体数量
--void delete(ID id);//根据Id删除实体
--void delete(T entity);//删除一个实体
--void delete(Iterable<? extends T> entities);//删除一个实体的集合
--void deleteAll();//删除所有实体,这个要慎用,一键回到*。
package com.example.springboot.jpa.dao; import com.example.springboot.jpa.entity.User; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @Repository public interface UserRepository extends CrudRepository<User, Integer> { }
package com.example.springboot.jpa.dao; import com.example.springboot.jpa.entity.User; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.springframework.data.repository.query.Param; public interface UserRepository2 extends Repository<User, Integer> { /** * 查询以get|find|read开头; 条件属性以首字母大写 */ public User findByUserName(String userName); /** * 通过jpa hql语句查询 */ @Query(value = "from User where userName=:cn") public User findByUserName2(@Param("cn") String userName); }
编写service类
package com.example.springboot.jpa.service; import com.example.springboot.jpa.dao.UserRepository; import com.example.springboot.jpa.dao.UserRepository2; import com.example.springboot.jpa.entity.User; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.transaction.Transactional; @Service public class UserService { @Resource private UserRepository userRepository; @Resource private UserRepository2 userRepository2; // 保存 @Transactional public void save(User user) { userRepository.save(user); } // 删除 @Transactional public void delete(int id) { userRepository.delete(id); } // 查询 public void getUser(int id) { userRepository.findOne(id); } // 根据名称查询 public User findByUserName(String userName) { return userRepository2.findByUserName(userName); } // 根据名称查询 public User findByUserName2(String userName) { return userRepository2.findByUserName2(userName); } }
编写controller类
package com.example.springboot.jpa.controller; import com.example.springboot.jpa.entity.User; import com.example.springboot.jpa.service.UserService; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @desc * @Author wangsh * @date 2018/5/5 21:37 */ @RestController @RequestMapping("/jpa") public class JpaController { @Resource private UserService userService; @RequestMapping("/save") public void save() { User user = new User(); user.setUserName("zhangsan"); user.setPassword("123"); userService.save(user); } @RequestMapping("/findByUserName") public User findByUserName(String userName) { User user = userService.findByUserName(userName); System.out.println(user); return user; } @RequestMapping("/findByUserName2") public User findByUserName2(String userName) { User user = userService.findByUserName2(userName); System.out.println(user); return user; } }
编写启动服务类
package com.example.springboot.jpa; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @desc * @Author wangsh * @date 2018/5/5 22:01 * @return */ @EnableTransactionManagement @SpringBootApplication public class SpringbootJpaApplication { public static void main(String[] args) { SpringApplication.run(SpringbootJpaApplication.class, args); } }
启动服务测试
浏览器访问: http://localhost:8080//jpa/findByUserName2?userName=张三8376