目录
使用工具
IDEA2018.2 MySQL5.6 JDK1.8
使用说明
需要在数据库中创建一个数据库,无需创建数据库表
SpringDtataJpa自动生成数据表
使用maven的pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ming</groupId>
<artifactId>springbootjpatest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootjpatest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
环境搭建
代码示例
java目录
Student.java
package com.vvcat.gitee.bean;
import javax.persistence.*;
@Entity
@Table(name = "student")//数据库表明
public class Student {
@Id//声明id为主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//声明自动增长
@Column(name = "id")//声明数据库对应的字段
private Integer id;
@Column(name = "stuName")//声明数据库对应的字段
//定义字段也是有讲究的,比如首字母小写,后边的驼峰,对应的数据库字段,遇到驼峰用下划线断开
//比如实体类定义的userName,则数据库字段为user_name,
//比如实体类定义的username,则数据库字段也为username
private String stu_name;
@Column(name = "age")//声明数据库对应的字段
private Integer age;
@Column(name = "sex")//声明数据库对应的字段
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", stu_name='" + stu_name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
public Student(String stu_name, Integer age, String sex) {
this.stu_name = stu_name;
this.age = age;
this.sex = sex;
}
public Student() {
}
}
IStuDao.java
package com.vvcat.gitee.dao;
import com.vvcat.gitee.bean.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* @Author ꧁ʚVVcatɞ꧂
* @Date 2019/10/23 14:13
* @Version 1.0
**/
public interface IStuDao extends JpaRepository<Student, String> {
//模糊查询姓名
@Query("SELECT stu FROM Student stu WHERE stu_name LIKE ?1")
List<Student> findByNameLike(String name);
}
IStudentDao.java
package com.vvcat.gitee.dao;
import com.vvcat.gitee.bean.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @Author ꧁ʚVVcatɞ꧂
* @Date 2019/10/23 15:19
* @Version 1.0
**/
public interface IStudentDao extends JpaRepository<Student, Integer> {
//查询数据库中全部的数据
@Transactional //纳入事务管理
@Modifying // 对表进行修改操作 需要调用该注解
@Query("SELECT stu FROM Student stu")
// 注意表的大小写 要跟 IBaseDao<Student,Integer> 中的参数一致
List<Student> findAll();
//删除对应的ID信息
@Transactional
@Modifying // 对表进行修改操作 需要调用该注解
@Query("DELETE FROM Student WHERE id = ?1")
// 注意表的大小写 要跟 IBaseDao<Student,Integer> 中的参数一致
void testDeleteSql(@Param("id") Integer id);
}
App.java
package com.vvcat.gitee;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello world!
*
*/
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
resources目录
hibernate:
ddl-auto: 参数
参数 | 描述 |
---|---|
validate | 项目启动表结构进行校验 如果不一致则报错 |
create | 启动时删数据库中的表,然后创建,退出时不删除数据表 |
create-drop | 启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错 |
update | 最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。 |
application.yml
server:
port: 8080
servlet:
context-path: /
spring:
datasource:
url: jdbc:mysql://localhost:3306/item?serverTimezone=UTC
username: root
password: 123456
jpa:
database: MySQL
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #mysql数据库固定配置
show-sql: true #控制台打印sql
hibernate:
ddl-auto: update #update代表数据库没有表的话,会先创建表,有表的话就不创建了。
test目录
AppTest.java
package com.vvcat.gitee;
import com.vvcat.gitee.bean.Student;
import com.vvcat.gitee.dao.IStuDao;
import com.vvcat.gitee.dao.IStudentDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
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.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* Unit test for simple App.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest
{
@Autowired
private IStuDao stuDao;
@Autowired
private IStudentDao studentDao;
/**
* 增加方法
*/
@Test
public void testAdd(){
Student student = new Student();
student.setStu_name("vvcat");
student.setAge(18);
student.setSex("男");
stuDao.save(student);
}
/**
* 批量增加
*/
@Test
public void testAddList(){
List<Student> stuList = new ArrayList<>();
for(int i=0 ; i < 10 ;i++){
Student stu = new Student();
stu.setStu_name("VVcat" + i);
stu.setAge(i);
stu.setSex("男");
stuList.add(stu);
}
stuDao.saveAll(stuList);
}
/**
* 通过主键查找
*/
@Test
public void testFindById(){
Optional<Student> optionalStudent = studentDao.findById(1);
Student stu = optionalStudent.get();
System.out.println(stu);
}
/**
* 查询所有 如果想通过条件查询,可以根据上边的方式查询。
*/
@Test
public void testFindAll(){
List<Student> stuList = stuDao.findAll();
for(Student stu : stuList){
System.out.println(stu);
}
}
/**
* 分页排序查询
* page,第几页,从0开始,默认为第0页
* size,每一页的大小,默认为20
* sort,排序相关的信息,例如sort=firstname&sort=lastname,desc表示在按firstname正序排列基础上按lastname倒序排列
*/
@Test
public void testPage(){
//排序
Sort sort = new Sort(Sort.Direction.DESC,"id"); // //排序条件 id倒序排序
//分页
Pageable pageable = PageRequest.of(0,2,sort);
// page:index是0开始的,不是从1开始的
Page<Student> page = stuDao.findAll(pageable);
//当前页结果,(0)页
List<Student> stuList = page.getContent();
//按照每页2条数据,一共有的页数
int totalPages = page.getTotalPages();
//总共有多少条数据
long totalElements = page.getTotalElements();
//第0页的数据
for (Student list :stuList) {
System.out.println(list);
}
//查询的当前第几页
int number = page.getNumber();
//查询的当前页面的记录数
int numberOfElements = page.getNumberOfElements();
System.out.println(
"一共有" + totalPages + "页\n" + "总共有" + totalElements + "条数据"+ "\n"
+ "查询的当前第" + number + 1 + "页"+ "\n"
+ "查询的当前页面的记录数:"+ numberOfElements
);
//遍历每页的数据
// for (int i = 0; i < page.getTotalPages(); i++) {
// PageRequest page1 = PageRequest.of(i, 2, sort);
// Page<Student> page2 = studentDao.findAll(page1);
// List<Student> stuList2 = page2.getContent();
// for (Student list :stuList2) {
// System.out.println(list);
// }
// }
}
/**
* 通用修改方法,先根据主键查找,然后在修改提交
* 也可以通过sql直接修改.需要在IUserDao接口中定义,这里不再演示。
*/
@Test
public void testUpdate(){
Optional<Student> stuOptional = studentDao.findById(1);
Student stu = stuOptional.get();
stu.setStu_name("springDataJpa");
//主键存在为修改,不存在为新增
stuDao.save(stu);
}
/**
* 查询其中一个进行删除
* */
@Test
public void testDelete(){
Optional<Student> stuOptional = studentDao.findById(11);
Student stu = stuOptional.get();
stuDao.delete(stu);
}
/**
* 通过主键删除
* 也可以通过sql直接删除.需要在IUserDao接口中定义
*/
@Test
public void testDeleteID(){
studentDao.testDeleteSql(10);
}
/**
* 通过自定义数据库语句进行模拟查询
*/
@Test
public void findByNameSql() {
List<Student> byNameSql = stuDao.findByNameLike("zhangsan%");
for (Student list :byNameSql) {
System.out.println(list);
}
}
/**
* 通过自定义数据库语句进行模拟查询
*/
@Test
public void findNameSql() {
List<Student> byNameSql = stuDao.findByNameLike("zhangsan%");
for (Student list :byNameSql) {
System.out.print("id:" + list.getId() + ",");
System.out.print("name:" + list.getStu_name() + ",");
System.out.print("age:" + list.getAge() + ",");
System.out.println("sex:" + list.getSex() );
}
}
}