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配置

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 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

数据库脚本

DROP TABLE IF EXISTS `style`;
CREATE TABLE `style`  (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `style` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '风格',
  `money` double(100, 0) DEFAULT NULL COMMENT '优惠前的单价',
  `facilities` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '房间设施描述',
  `image` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '封面图片',
  `message` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '类型描述',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

实体(Model)类书写

@Entity
public class Style {
    @Id
    @GeneratedValue(strategy=IDENTITY)
    private int id;
    @Column(length = 32)
    private String style;
    private Double money;
    private String facilities;
    private String image;
    private String message;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getStyle() {
        return style;
    }

    public void setStyle(String style) {
        this.style = style;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public String getFacilities() {
        return facilities;
    }

    public void setFacilities(String facilities) {
        this.facilities = facilities;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "Style{" +
                "id=" + id +
                ", style='" + style + '\'' +
                ", money='" + money + '\'' +
                ", facilities='" + facilities + '\'' +
                ", image='" + image + '\'' +
                ", message='" + message + '\'' +
                '}';
    }
}

@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);


    }
//更新数据
    /*@PathVariable@RequestParam 一起使用 请求方式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();
    }
}
发布了20 篇原创文章 · 获赞 10 · 访问量 5460

猜你喜欢

转载自blog.csdn.net/weixin_43784880/article/details/104249778