版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/marvHuang/article/details/82921361
- JPA全称JavaPersistenceAPI.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
- 配置pom.xml文件:
<!--jpa dependency-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql dependency-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
- 配置application.properties:
在application.properties文件中添加数据库连接的相关信息配置
########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql://localhost:3306/spring-boot
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=10
########################################################
### Java Persistence Api
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
- create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
- update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5Dialect
- 创建实体类User:
@Entity
@Table(name = "user")
public class User implements Serializable {
private String id;
private String userName;
private String password;
public User() {
}
@Id
public String getId() {
return id;
}
@Column
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
@Column
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
@Column
public void setPassword(String password) {
this.password = password;
}
}
- 创建Dao层的UserDao接口:、
为了解决抽象各个Java实体基本的“增删改查”操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现。虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的接口和实现。
由于模板Dao的实现,使得这些具体实体的Dao层已经变的非常“薄”,有一些具体实体的Dao实现可能完全就是对模板Dao的简单代理,并且往往这样的实现类可能会出现在很多实体上。Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式。
public interface UserDao extends JpaRepository<User,String> {
}
- 创建业务层接口UserService:
public interface UserService {
User getUser();
void save(User user);
}
- 创建业务接口实现类UserServiceImpl:
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public User getUser() {
User user = userDao.findOne("09e7b25c-12f7-43ea-a553-fb34189fce17");
return user;
}
@Override
public void save(User user) {
User u = userDao.save(user);
return;
}
}
- 控制层注入业务bean:
在UserController类中注入业务bean:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/hello")
@ResponseBody//返回json数据
String home() {
return "Hello World !";
}
@RequestMapping("/get")
@ResponseBody
public User getUser() {
User user = userService.getUser();
return user;
}
@RequestMapping("/save")
public String save(Model model){
User user = new User();
user.setUserName("李四");
user.setPassword("123456789");
user.setId(UUID.randomUUID().toString());
userService.save(user);
model.addAttribute("msg","添加数据哇啊");
return "index";
}
}
- 程序main入口类的注解配置:
找到main程序入口类,在上面加上实体类、持久类的注解@EnableJpaRepositories、@EntityScan:
package com.yunlian.controller;
import com.yunlian.entity.User;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.stereotype.*;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller//让当前启动入口也成为控制层,如果不想让当前入口也成为控制层,当前程序入口类可以不加Controller注解
@SpringBootApplication
@ComponentScan("com.yunlian")//包名:扫描这个包下面的加了@Controller注解的类及其子包的加了@Controller注解的类,或者加了@Service注解等其他组件注解的类
@EnableJpaRepositories("com.yunlian.dao") // JPA扫描该包路径下的Repositorie
@EntityScan("com.yunlian.entity") // 扫描实体类
public class SpringBootController {
public static void main(String[] args) throws Exception {
//程序启动入口,一般该入口文件不写成控制层
SpringApplication.run(SpringBootController.class, args);
}
@RequestMapping("/hello")
@ResponseBody//返回json数据
String home() {
return "Hello World!";
}
@RequestMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
user.setId("1");
user.setUserName("张三111");
user.setPassword("123456789");
return user;
}
@RequestMapping("/toJSP")
public String toPage(Model model) {
System.out.println("3456789");
model.addAttribute("msg","欢迎来到异次元世界");
return "index";//返回视图
}
}
- 运行访问:运行main程序,启动好后,打开浏览器根据配置的地址访问即可