1.JPA全称Java Persistence API,它并不是一个框架,而是一组规范
(1)JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中
(2)JPA的目标之一是制定一个可以由很多供应商实现的API,并且开发人员可以编码来实现该API,而不是使用私有供应商特有的API
(3)JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个
(4)从功能上来说,JPA就是Hibernate功能的一个子集
2.创建工程
(1)引入数据库操作相关依赖:
<!--引入spring-boot-starter-data-jpa的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--引入MySQL Driver驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
(2)配置相关文件
<1>在application.yml:(需注意配置格式)文件配置mysql相关信息
spring:
datasource:
url: jdbc:mysql://localhost:3306/user_manage?serverTimezone=GMT%2B8
username: root
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
#更新或创建数据库表结构(第一次简表create,后面用update)
ddl-auto: update
#输出执行sql
show-sql: true
<2>如果通过jpa在数据库中建表,将jpa.hibernate,ddl-auto改为create,建完表之后,要改为update,要不然每次重启工程会删除表并新建
<3>spring-boot-start-data-jpa默认的数据库连接池tomcat-jdbc
3.具体编码
(1)创建实体类
@Entity//表明是一个映射的实体类
@Table(name = "user")//表名
public class User{
@Id//表明主键id
@GeneratedValue(strategy=GenerationType.IDENTITY)//主键自增
private int id ;
private String name ;
private String passWord;
... 省略getter setter}
(2)dao层
1.数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问
2.JpaRepository接口中已经封装了创建(save)、更新(save)、删除(delete)、查询(findAll、findOne)等基本操作的函数
<1>dao层接口:
public interface UserDAO extends JpaRepository<User,Integer> {
//根据姓名查询
User findByName(String name);
//查询所有
List<User> findAll();
//对于复杂查询可以使用@Query 编写sql
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);}
<2>dao层接口的实现类:
1.接口类继承JpaRepository后,不管简单的,复杂的操作都不需要实现类,只需要传入相关的参数即可
2.对于高级复杂的sql操作,自定义方法只要遵循一定的规范,就不需要实现接口
3.只要程序能够认识这个方法名的意思就回自动执行
举例:
3.1.要根据name模糊查找,sql语句就是xxx where name like 'x%',关键字就是like
3.2.方法名就是findByNameLike(String name),括号里就是要传进去的条件,相当于'x%'
3.3.底层会解析方法名,拼接成sql语句,向数据库发送sql语句进行操作,本质上,一个方法就是一条sql语句
3.4.还有一些关键词,And,Or,Between,OrderBy等等,都可以用于方法名
4.如果想不符合规范的方法名,也可以通过注解编写sql语句
4.1.通过@Query注解实现:里面的语句是hql语句,操作的是实体类
4.2.要写原生sql语句,在@Query里面要加个属性:nativeQuery=true,就可以写原生sql语句了
4.3.如果使用@Query注解,那么方法名就可以随意
4.4.查询只要@Query一个注解就可以了,但是增加,修改,删除还需要另外一个注解@Modifying
(3)service层
<1>service层接口:
public interface UserService {
List<User> findAll();}
<2>service层接口的实现类:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public List<User> findAll() {
// 这里即使没有实现该方法也可以直接使用 findAll 方法
return userDAO.findAll();}
(4)controller层:构建一组restful api来展示
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
private UserDAO userDAO;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public List<Account> getAccounts() {
return userService.findAll();}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Account getAccountById(@PathVariable("id") int id) {
return userDAO.findOne(id);}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public String updateAccount(@PathVariable("id") int id, @RequestParam(value = "name", required = true) String name){
User user= new User();
user.setName(name);
user.setId(id);
User user1 = userDao.saveAndFlush(user);
return user1.toString();}
4.可以通过postman来测试,注意restful构建api的风格
5.一般项目开发中SpringBoot+JPA用的比较少
6.在Springboot2.X版本,数据库的连接池官方推荐使用HikariCP(默认的数据库连接池)
(1)HikariCP的性能和并发性。如果有HikariCP,总是选择它
(2)否则,如果Tomcat池数据源可用,将使用它
(3)如果HikariCP和Tomcat池数据源都不可用,如果Commons DBCP2可用,将使用它
(4)如果springboot版本是2.X,当使用spring-boot-starter-data-jpa依赖,springboot就会自动引入HikariCP的依赖了
(5)如果需要使用指定的数据库连接池
5.1.需要在application.properties中配置:spring.datasource.type
5.2.引入第三方数据库连接池依赖