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=汪云飞
根据年龄实现排序
实现分页