开发者学堂课程【SpringBoot 实战教程: SpringBoot 整合 JPA-Hibernate】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10804
SpringBoot 整合 JPA-Hibernate
1、jpa 是持久化规范,它制定了一些持久化的接口,hibernate 是它具体的实现。
2、首先需要依赖 jpa 的包。
<!--springboot 整合 jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
spring提供的依赖
</dependency>
<dependency>
<groupId>mysql</groupId>
使用的是 mysql 数据库,所以还要将 mysql 的包进行依赖
<artifactId>mysql-connector-java</artifactId>
</dependency>
把依赖加到工程中,已经做好 web 的依赖,写好启动类,接下来配置连接 mysql 的相关信息,以及 jpa 的相关信息,这些需要在全局配置文件中配置。
和数据库相关的配置主要有以下四项,全局配置配置文件:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/db6
使用 db6 数据库
#让控制器输出 json 字符串格式
spring.jackson.serialization.indent-output=true
让控制器输出字符串的格式
spring.jpa.hibernate.ddl-auto=update
在执行 ddl 操作时执行哪一种
spring.jpa.show-sql=true
显示 sql 语句spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
以及使用的方言
3、这些配置好后,创建实体类,jpa 会根据实体类自动生成相应的表,创建包,命名为 com.qianfeng.pojo。
比如创建 user 实体类。
定义一些属性。生成 set,get 方法,它现在只是普通的实体类,不可能自动生成相应的表。加注解 Entity 后,jpa 就知道需要为 user 实体类生成相应的表,表的名字默认和实体类的名字相同,如果不想用这个名字,使用 table 注解表明。一张表是需要有主见的,如何指定 id 作为表的主见,需要使用注解 id,主见上的值如何生成,生成策略是什么?使用注解 GeneratedValue。指定主见上的值如何生成。
auto 表示自动生成,对 mysql 仍然是自动增长,identity 也是自动增长,sequence 序列,mysql 不支持,用表的方式。其他的属性映射到表中就是相应的字段,如果希望字段名和属性名相同,不需要做任何操作,如果不同需要添加注解 column,添加表中的名字,如果只写注解,不指定,表中字段名和属性名是一样的。。
import java.util. Date;
import javax.persistence . Entity;
@
Entity
@Table (name="t
_
user")
public class User
{
@
id
@GeneratedValue(strategy=GenerationType. IDENTITY)
这里选 IDENTITY 让它自动增长
Private
Integer
id;
Private
String
name ;
private String password;
private String email;
Private
Date birthday;
public Integer getId()
{
Return
id;
}
public void setId (Integer id)
{
this. id = id;
}
public String getName ()
{
return name ;
}
public void setName (String name)
{
this. name = name ;
4、创建 dao 层,命名为 com.qianfeng.dao。
只需要创建一个接口,命名为 userdao。
不需要创建实体类,只需要创建一个接口,只不过要让接口继承 jpaRepository,它有两个范型,一个范性是实体类的类型,第二个范型是实体类中做为主见属性的类型,integer 类型。jpaRepository 提供增删改成的功能。
package com. qianfeng.dao;
import org.spring framework.data.jpa. repository .JpaRepository;
import com. qianfeng .pojo.User;
public interface UserDao extends JpaRepository<User, Integer> {
}
5、创建 service,命名为 com.qianfeng.service。
首先写一个接口 UserService。
写一个功能,添加用户,写具体的实现类,UserServicelmpl。
加 service 注解,调用 dao,并且注入,添加用户,但是dao里面没有写具体的功能,只是继承了一个 JpaRepository。仍然可以实现添加,
package com. qianfeng . service;
import org. springframework. stereotype . Service;
import
com. qianfeng . dao. UserDao;
import com. qianfeng .pojo.User;
@Service
public class UserServiceImpl implements UserService
{
private UserDao
userDao;
@ Autowired
Private
UserDao
userDao;
@Override
public void
adlmUser (User user)
{
userDao. save (user) ;
}
}
6、创建 controller,com.qianfeng.controller。Usercontroller。
加上注解,controller 调用 service,注入,实现添加 saveuser,手动创建 user 对象。
@Controller
public class
UserController
{
@Autowired
private UserService userService ;
@RequestMapping("/ save'')
添加用户
@ResponseBody
public String
saveUser ()
{
User
user= new
User() ;
user . setName("小花") ;
user . setPassword("123") ;
user. set Email ("xiaohua@163. com") ;
user . setBirthday (new Date () ) ;
userService . addUser (user) ;
实现用户添加
return"success";
返回成功的字符串
}
7、controller 和 service 需要进行扫描,在启动类中进行扫描。
@SpringBootApplication(scanBasePackages="com. qianfeng")
8、另外注意 pojo 实体类也需要进行扫描,用注解 EntityScan 进行扫描实体类。
@EntityScan ("com. qianfeng.pojo")
//扫描实体类
9、dao 也需要扫描,在启动类中加入注解,指明 dao 所在的包。
@EnableJpaReposi tories ("com. qianfeng.dao")
//扫描 sao
10、查看数据库,添加功能可以正常使用,启动,添加功能,小花,密码123。成功。
查看是否自动生成表,可以看到已经添加成功,并且规定的表名是 t-user,有 id,name,password,email,birthday。这和实体类中的属性名相同。
11、添加两个功能,在 service 中,根据 id 查找用户,删除用户。
@Override
public User
findUser ( Integer
id)
{
return userDao. findOne (id) ;
}
@Override
public void delUser ( Integer id)
{
userDao.delete (id) ;
}
在 controller 里写查找和删除,查找返回的是查到的对象。
@Reques tMapping("/ find/
{
id
}
")
接收 id 查找 find,传 id 值
@ResponseBody 阶层格式
public User findUser (@PathVariable Integer id)
return userService. findUser (id) ;
@RequestMapping("/del/ (id)")
删除 del,传 id 值
@ResponseBody
Public
String delUser (@PathVariable Integer id) (
userService .delUser (id) ;
return "ok";
12、输入localhost:8080/find/1
,查找 id 是1的,可以看到小花的阶层格式。
输入localhost:8080/del/1
删除。
查看数据库已经删掉了。