目录
1.在IDEA中新建项目springboot-JPA
2.配置maven环境
设置--settings出现菜单首页(view-->Appearance-->Toolbar设置完成 查看菜单栏出现🔧)
3.引入依赖--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>
<groupId>com.it.springboot</groupId>
<artifactId>springboot-JPA</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.mysql.version>8.0.25</project.mysql.version>
<project.lombok.version>1.18.22</project.lombok.version>
<project.druid.version>1.2.8</project.druid.version>
<project.junit.version>4.12</project.junit.version>
<project.swagger.version>3.0.0</project.swagger.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.5.10</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${project.lombok.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${project.mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${project.druid.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${project.junit.version}</version>
<scope>test</scope>
</dependency>
<!--swagger3 api测试框架-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${project.swagger.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.main
4.1 resources配置
application.yml
spring:
profiles:
active: dev
application-dev.yml
server:
port: 8099
spring:
datasource:
druid:
url: mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
#json时间处理
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#jpa的配置
#表已存在 所以注释update
#true 显示sql语句
jpa:
show-sql: true
# hibernate:
# ddl-auto: update
#日志
logging:
level:
com.it.springboot: debug
4.2 java
4.2.1 启动类--App.class
建包完成后(com.it.springboot),立即编写启动类
package com.it.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
}
4.2.2 实体类
package com.it.springboot.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity//实体类,为例映射表的特殊类 POJO(简单的Java对象)
@Table(name = "publisher_tab")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Publisher {
@Id
//以数据库的主键策略为主
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "publisher_id")
private Integer id;
@Column(name = "publisher_name")
private String name;
@Column(name = "publisher_loc")
private String loc;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
/**
* 两表联查 多对一关系@ManyToOne
*/
@Entity
@Table(name = "book_tab")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "book_id")
private Integer id;
@Column(name = "book_isbn")
private String isbn;
@Column(name = "book_title")
private String title;
// @ManyToOne
// @JoinColumn(name = "book_publisher")
// private Publisher publisher;
//两表中的外键使用 不需要分辨每个表的关系
@Column(name = "book_publisher")
private Integer publisher;
}
4.2.3 定义接口和数据库的交互Dao
JpaRepository是CrudRepository的子接口
JpaRepository源码
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
/** @deprecated */
@Deprecated
default void deleteInBatch(Iterable<T> entities) {
this.deleteAllInBatch(entities);
}
void deleteAllInBatch(Iterable<T> entities);
void deleteAllByIdInBatch(Iterable<ID> ids);
void deleteAllInBatch();
/** @deprecated */
@Deprecated
T getOne(ID id);
T getById(ID id);
<S extends T> List<S> findAll(Example<S> example);
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
一个实体类对应一个Dao
package com.it.springboot.dao;
import com.it.springboot.entity.Publisher;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
public interface IPublisherDao extends JpaRepository<Publisher,Integer> {
//注解自己编写SQl语句 nativeQuery代表原生态的SQL语句
@Query(value = "SELECT * FROM publisher_tab WHERE publisher_name=?1 AND publisher_loc=?2",nativeQuery = true)
//JpaRepository源码中不存在的方法 自定义
Publisher findByNameAndLoc(String name,String loc);
}
package com.it.springboot.dao;
import com.it.springboot.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* 出版社服务于书
* jpa 一个实体类对应一个接口
*/
public interface IBookDao extends JpaRepository<Book, Integer> {
}
4.2.4 service
package com.it.springboot.service;
import com.it.springboot.entity.Book;
import com.it.springboot.entity.Publisher;
import java.util.List;
import java.util.Optional;
public interface IBookService {
List<Publisher> findAll();
Optional<Publisher> findById(int id);
Publisher findByNameAndLoc(String name,String loc);
int cnt();//返回出版社的个数
List<Book> findAllBooks();
}
@Service
@Transactional
public class IBookServiceImpl implements IBookService {
@Autowired
private IPublisherDao dao;
@Autowired
private IBookDao bookDao;
@Override
public List<Publisher> findAll() {
return dao.findAll();
}
@Override
public Optional<Publisher> findById(int id) {
return dao.findById(id);
}
@Override
public Publisher findByNameAndLoc(String name, String loc) {
return dao.findByNameAndLoc(name,loc);
}
@Override
public int cnt() {
return (int)dao.count();
}
@Override
public List<Book> findAllBooks() {
return bookDao.findAll();
}
}
4.3 测试
@RunWith(SpringJUnit4ClassRunner.class)//测试容器
@SpringBootTest
@Slf4j
public class IBookServiceImplTest {
@Autowired
private IBookService ibs;
@Test
public void findAll() {
log.debug("findAll-->"+ibs.findAll());
}
@Test
public void findById() {
log.debug("findById-->"+ibs.findById(2));
}
@Test
public void findByNameAndLoc() {
log.debug("findByNameAndLoc-->"+ibs.findByNameAndLoc("少儿出版社","碑林"));
}
@Test
public void cnt() {
log.debug("出版社的个数-->"+ibs.cnt());
}
@Test
public void findAllBooks(){
// log.debug("findAllBooks-->"+ibs.findAllBooks());
List<Book> list = ibs.findAllBooks();
for (Book book : list) {
//getPublisher--获取Id
System.out.println(book.getTitle()+book.getPublisher());
}
}
}
4.3.1 执行结果
findAll
findById
findByNameAndLoc
count[统计出版社的个数]
findAllBooks
两表联查--第一种:书记信息对应出版社的Id
两表联查--第二种:书籍标题对应出版社的Id