Springboot+JPA+Mysql的实践操作
1、什么是JPA?
JPA全称为Java Persistence API ,Java持久化API是Sun公司在javaEE 5规范中提出的Java持久化接口。
JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
2、作用是什么?
通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,同样可以将数据库的结果集自动映射到实体类中。
3、底层是什么?
JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个,应该说无人能出其右。
从功能上来说,JPA就是Hibernate功能的一个子集。
4、JPA和JDBCTemplate区别?
最根本的区别就是不需要我们再去书写原声SQL语句,通过对象来操作数据库,用极简的代码实现了对数据库的访问和操作,包括了增、删、改、查等在内的常用功能.
实践
应为JPA属于持久层技术,此处使用mysql数据库进行演示,SpingBoot+JPA+MYSQL需要添加一下依赖
<!-- mysql连接类-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--alibaba连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!-- 开启web-->
<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>
#properties.yml配置
#mysql数据库连接
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/hotel?serverTimezone=UTC
username: root
password: aaaaaa
jpa:
hibernate:
ddl-auto: update # 第一次建表create 后面用update,建完表之后,要改为update,要不然每次重启工程会删除表并新建。
show-sql: true #配置在日志中打印出执行的 SQL 语句信息。
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #在 SrpingBoot 2.0 版本中,Hibernate 创建数据表的时候,默认的数据库存储引擎选择的是 MyISAM (之前好像是 InnoDB,这点比较诡异)。这个参数是在建表的时候,将默认的存储引擎切换为 InnoDB 用的。
jpa.hibernate.ddl-auto:参数的作用主要用于:自动创建、一次性创建、更新、验证数据库表结构,有四个值。
create:每次加载 Hibernate 时都会删除上一次生成的表,然后根据 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载 Hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
update:最常用的属性,第一次加载 Hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),
以后加载 Hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。
要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。如果先创建的数据库表则直接写update就行,免得再次创建覆盖原先的
validate :每次加载 Hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
实体(Model)类书写
@Entity(name=“EntityName”) 必须,用来标注一个数据库对应的实体,数据库中创建的表名默认和类名一致。
@Table(name="",catalog="",schema="") 可选,用来标注一个数据库对应的实体,数据库中创建的表名默认和类名一致。通常和 @Entity 配合使用,只能标注在实体的 class 定义处,表示实体对应的数据库表的信息。
@Id 必须,@Id 定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键。
@GeneratedValue(strategy=GenerationType,generator="") 可选,strategy: 表示主键生成策略,有 AUTO、INDENTITY、SEQUENCE 和 TABLE 4 种,generator: 表示主键生成器的名称。
AUTO主键由程序控制, 是默认选项 ,不设置就是这个
IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
@Column(name = “user_code”, nullable = false, length=32) 可选,@Column 描述了数据库表中该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具。name: 表示数据库表中该字段的名称,默认情形属性名称一致,不一致时可指定;nullable: 表示该字段是否允许为 null,默认为 true;unique: 表示该字段是否是唯一标识,默认为 false;length: 表示该字段的大小,仅对 String 类型的字段有效。
@Transient可选,@Transient 表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。
@Enumerated 可选,使用枚举的时候,我们希望数据库中存储的是枚举对应的 String 类型,而不是枚举的索引值,需要在属性上面添加 @Enumerated(EnumType.STRING) 注解。
Dao层
数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问,其中包含了几本的单表查询的方法,
非常的方便。值得注意的是,这个Account 对象名,而不是具体的表名,另外Interger是主键的类型,一般为Integer或者Long
@Repository
public interface JpaStyleDao extends JpaRepository<Style, Integer>
{
}
Service层
public interface StyleService {
/* JPA写法*/
Style add(Style style);
Style update(Style style);
void delete(int id);
List<Style> findAll();
Style findById(Integer id);
}
@Service
public class StyleServiceImpl implements StyleService {
@Autowired
StyleDao styleDao;
@Autowired
JpaStyleDao jpaStyleDao;
@Override
public Style add(Style style) {
return jpaStyleDao.save(style);
}
@Override
public Style update(Style style) {
return jpaStyleDao.saveAndFlush(style);
}
@Override
public void delete(int id) {
jpaStyleDao.deleteById(id);
}
@Override
public List<Style> findAll() {
return jpaStyleDao.findAll();
}
@Override
public Style findById(Integer id) {
/* 原来是自从spring boot 2.0以后,由于用上了Java 8 的Optional,废除了原来的findOne(Id)。*/
/* findById()方法也使用了Optional,废除了原来的方法:*/
return jpaStyleDao.findById(id).get();
}
}
Web层
@RestController
@RequestMapping("/style")
public class StyleController {
@Autowired
StyleService styleService;
/*插入数据*/
@RequestMapping(value = "/add", method = RequestMethod.POST)
public Style add() {
Style style = new Style();
style.setStyle("大房");
style.setMoney(125.0);
style.setFacilities("卫生间、健生房");
style.setMessage("可住两人");
return styleService.add(style);
}
//更新数据
/*@[email protected] 一起使用 请求方式http://127.0.0.1:8080/style/update/5?style=大房*/
@RequestMapping(value = "/update/{id}", method = RequestMethod.PUT)
public Style update(@PathVariable int id, @RequestParam(value = "style", required = true) String styles) {
Style style = new Style();
style.setId(id);
style.setStyle(styles);
style.setMoney(126.0);
style.setFacilities("卫生间、健生房");
style.setMessage("可住两人");
return styleService.update(style);
}
//删除数据
@RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
public void delete(@PathVariable int id) {
styleService.delete(id);
}
//按照ID查找数据
@RequestMapping(value = "/findById/{id}", method = RequestMethod.GET)
public Style findById(@PathVariable int id) {
return styleService.findById(id);
}
//查找所有数据
@RequestMapping(value = "/findAll", method = RequestMethod.GET)
public List<Style> findAll() {
return styleService.findAll();
}
}
上一篇: 自己寫的分頁存儲過程
下一篇: JAVA____异常