SpringBoot+hibernate+mysql的数据访问

Hibernate是数据访问解决技术绝对霸主,使用O/R映射(Object-Relation Mapping)技术实现数据访问,O/R映射即将领域模型类和数据库的表进行映射,通过程序操作对象而实现数据表操作的能力,让数据访问操作无须关注数据库相关的技术。

Hibernate主导了EJB 3.0的JPA规范,JPA即Java Persistence API。JPA是基于O/R映射的标准规范。所谓规范,只定义标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需要按照规范中定义的方式来使用。

本项目实现mysql增,查数据。

一、在mysql创建数据jpa

二,创建SpringBoot项目,勾选web下的web ,SQL下的jpa和MySQL

项目中连接Mysql:

1、点击Database

2、点击+号,选中Mysql

3、填写mysql调用的数据库名字和mysql账户和密码

三、在resource文件下创建data.sql,添加如下sql语句

#插入数据,学号id是自动增涨的字段,做不用插入,表中需要设置为自动增涨
INSERT INTO person (name,age,address) VALUES ('汪云飞',32,'合肥');
INSERT INTO person (name,age,address) VALUES ('xx',31,'北京');
INSERT INTO person (name,age,address) VALUES ('yy',30,'上海');
INSERT INTO person (name,age,address) VALUES ('zz',29,'南京');
INSERT INTO person (name,age,address) VALUES ('aa',28,'武汉');
INSERT INTO person (name,age,address) VALUES ('bb',27,'合肥');

四、配置基本属性application.properties配置数据源和jpa的相关属性

#数据源的定义,如果是oracle需要做相应的修改
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?characterEncoding=utf8&useUnicode=true
spring.datasource.username=root
#密码是自己的数据库密码
spring.datasource.password=******
#指定Data (DML)脚本
#spring.datasource.schema=classpath:schema.sql
#指定Data (DDL)脚本,似乎没有起作用,等查
spring.datasource.data=classpath:data.sql
spring.datasource.sql-script-encoding=utf-8
#jpa配置
#reate:启动时删除上一次生成的表,并根据实体类生成表,表中数据会被清空
#create-drop:启动时根据实体类生成表,sessionFactory关闭时表会被删除
#update:启动时会根据实体类生成表,当实体类属性变动时,表结构也会更新,开发初期使用
#validate:启动时验证实体类与数据表是否一致,在数据稳定时使用此选项
#none:什么了也不做

#ddl-auto=update没有表,会新建表但是表内有数据不会被清空,只会更新表结构
spring.jpa.hibernate.ddl-auto=update
#控制台输出执行的sql语句
spring.jpa.show-sql=true
#使用json格式的数据显示更美观
spring.jackson.serialization.indent-output=true
# 是否生成ddl语句
spring.jpa.generate-ddl=true

五、创建实体类Person使用注解@Entity

package com.hedingjun.entity;


import org.hibernate.annotations.NamedQuery;
import org.hibernate.validator.constraints.Length;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;


//使用正向工程生成的实体类中没有@Table(实体类映射表名),没有@Column(属性映射字段名),和逆向工程不一样
@Entity //表明是一个与数据库表映射的实体类
@NamedQuery(name = "Person.withNameAndAddressNamedQuery", query = "select p from Person p where p.name=?1 and p.address=?2")
public class Person {
    @Id //表示id字体是主键
    //@GeneratedValue(strategy = GenerationType.AUTO)  //主键的生成方式为自动增涨,hibernate会为我们自动生成一个名为HIBERNATE_SEQUENCE的序列
    //  @GeneratedValue(generator = "persistenceGenerator")
    // @GenericGenerator(name = "persistenceGenerator", strategy = "increment")
    @GeneratedValue(strategy = GenerationType.IDENTITY) //验证此句可以在MYSQL中实现自动增涨
    private Long id;
    @NotNull
    @Length(max = 8)
    private String name;
    private Integer age;


    @Length(max = 50)
    private String address;


    //构造函数
    public Person() {
        super();
    }


    public Person(String name, Integer age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }


    //getters and setters
    public Long getId() {
        return id;
    }


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




    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public Integer getAge() {
        return age;
    }


    public void setAge(Integer age) {
        this.age = age;
    }


    public String getAddress() {
        return address;
    }


    public void setAddress(String address) {
        this.address = address;
    }
}

六、创建数据访问接口PersonRepository接口

package com.hedingjun.dao;

import com.hedingjun.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

//数据访问接口定义
public interface PersonRepository extends JpaRepository<Person, Long> {
    //使用方法名查询,接受一个name参数,返回值为列表
    List<Person> findByAddress(String name);

    //使用方法名查询,接受name和address两个参数,返回值为单个对象
    Person findByNameAndAddress(String name, String address);

    //使用@Query查询,参数按照名称绑定
    @Query("select p from Person p where p.name=:name and p.address=:address")
    Person withNameAndAddressQuery(@Param("name") String name, @Param("address") String address);

    //使用@NamedQuery查询,对应实体类中的@NamedQuery的定义
    Person withNameAndAddressNamedQuery(String name, String address);
}

七、创建程序控制启动类 PersonController

package com.hedingjun.controller;


import com.hedingjun.dao.PersonRepository;
import com.hedingjun.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import java.util.List;


@RestController
public class PersonController {
    //自动注入数据访问接口
    @Autowired
    private PersonRepository personRepository;


    /**
     * 保存
     * save支持批量保存:<S extends T> Iterable<S> save(Iterable<S> entities);
     * 删除
     * 支持使用id删除对象、批量删除以及删除全部
     * void delete(Id id);
     * void delete(T entity);
     * void delete(Iterable<? extends T> entities);
     * void deleteAll();
     */
    @RequestMapping("/save")
    public Person save(String name, String address, Integer age) {
        Person p = personRepository.save(new Person(name, age, address));
        return p;
    }


    //测试findByAddress
    @RequestMapping("/q1")
    public List<Person> q1(String address) {
        List<Person> people = personRepository.findByAddress(address);
        return people;
    }


    //测试findByNameAndAddress
    @RequestMapping("/q2")
    public Person q2(String name, String address) {
        Person person = personRepository.findByNameAndAddress(name, address);
        return person;
    }


    //测试withNameAndAddressQuery
    @RequestMapping("/q3")
    public Person q3(String name, String address) {
        Person p = personRepository.withNameAndAddressQuery(name, address);
        return p;
    }


    //测试withNameAndAddressNamedQuery
    @RequestMapping("/q4")
    public Person q4(String name, String address) {
        Person p = personRepository.withNameAndAddressNamedQuery(name, address);
        return p;
    }


    //测试排序
    @RequestMapping("/sort")
    public List<Person> sort() {
        List<Person> p = personRepository.findAll(new Sort(Sort.Direction.ASC, "age"));//按照年龄升序
        return p;
    }


    //测试分页
    @RequestMapping("/page")
    public Page<Person> page() {
        Page<Person> pagePerson = personRepository.findAll(new PageRequest(1, 2));
        return pagePerson;
    }
}

八、启动程序,打开浏览器

运行访问 http://localhost:8080/save?name=dddd&address=上海&age=25

数据库就添加name为dddd的数据

http://localhost:8080/q1?address=合肥

浏览器查询显示出现:

    http://localhost:8080/q2?address=合肥&name=汪云飞

    http://localhost:8080/q3?address=合肥&name=汪云飞

    http://localhost:8080/q4?address=合肥&name=汪云飞

    http://localhost:8080/sort

根据年龄实现排序

 

    http://localhost:8080/page

实现分页

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值