spring boot 基础-数据库连接-jpa
操作数据库方式
jpa 与mybatis,分为两个章节介绍,这里先介绍jpa的方式。 GitHub地址
使用前提
工具/jar包 | 版本 |
---|---|
idea | 2018.2.8 |
spring boot | 2.1.4.RELEASE |
Maven | 3.6.0 |
jdk | 1.8 |
pom.xml 使用依赖
<dependencies>
<!--添加MySQL驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.properties
spring.datasource.url=jdbc:mysql://192.168.80.11:3306/db_geoary?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
# 显示sql语句
spring.jpa.show-sql=true
注意事项:
在properties中的密码
不可添加
单引号''
,在yml 中的密码必须添加
单引号''
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
- create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
- update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库)。以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
项目结构
这里只做了最简单的功能实现,所以不会涉及到service 、implement等层面。
entity:持久化层,与数据库中表结构对应。
dao:数据库操作层,执行RURD 基本操作。
SpringBootJdbc01Application:spring boot项目启动程序入口。
static:静态资源文件根目录。
templates:模板文件根目录。
application.properties:配置文件。
系统流程
在配置文件application.properties
中配置了 update
操作,所以表结构不需要我们建立,在系统启动时根据@Entity
注解的自动创建表结构(数据库还是得先创建的)。使用 JpaRepository
进行数据库的增删改查。
各文件介绍
User.java
@Entity
public class User {
@Id
@GeneratedValue
private Integer id;
private String username;
private String tel;
public User() {
}
public User(String username, String tel) {
this.username = username;
this.tel = tel;
}
// ...
// get / set 方法
// ...
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", tel='" + tel + '\'' +
'}';
}
}
UserRepository.java
/**
* @description UserRepository 继承 JpaRepository, User为仓库中的对象, Integer 为主键类型 JpaRepository 默认未我们提供了很多基本的接口,这里就不需要定义了
* @param
* @return
* @author geoary
* @date 2019/5/11
*/
public interface UserRepository extends JpaRepository<User, Integer> {
// 此处的User必须为entity中的类名 不能写成 user
/**
* @description 根据用户名查询数据
* @param username 用户名
* @return
* @author geoary
* @date 2019/5/11
*/
@Query("from User where username=:username")
List<User> findbyName(@Param("username") String username);
/**
* @description 根据id查询数据 Query 默认执行读操作
* @param id 编号
* @return
* @author geoary
* @date 2019/5/11
*/
@Query("from User where id=:id")
User findAllById(@Param("id") Integer id);
/**
* @description 做update / delete 这类写操作时,要夹@Modifying注解,并且要在调用的方法前加 @Transactional 注解标识进行事务控制
* @param username 用户名
* @return
* @author geoary
* @date 2019/5/11
*/
@Modifying
@Query("delete from User where username=:username")
void deleteByUsername(@Param("username") String username);
}
这里说几点:
- JpaRepository 已经提供了很多常用到的方法,这个我们直接调用即可。但是总有一些方法是定制化的,必须自己写的,这些定制化的方法就是在这个接口下写的。
- 若是查询 直接使用
@Query()
注解即可,但是涉及到写操作的 (update、delete)等的操作就需要再加@Modifying
了,并在调用方法前加注解@Transactional
表示进行事务控制。
测试方法 SpringBootJdbc01ApplicationTests.java
使用spring boot中自带的测试类进行
@Autowired
private UserRepository userRepository;
@Test
public void initDb(){
// 添加数据到数据库
// save方法即JpaRepository自带的方法,直接使用
// save有两个用处,不带id的是insert,带id的是update。
userRepository.save(new User("geoary", "13400000001"));
userRepository.save(new User("icon man", "15600000000"));
userRepository.save(new User("Thanos", "17800000000"));
}
@Test
public void test01() {
// 查询所有数据 调用默认的接口
List<User> users = userRepository.findAll();
System.out.println(users);
// 根据id查询数据 调用默认的接口
User user = userRepository.findAllById(new Integer(1));
System.out.println(user);
// 根据姓名查询数据 调用自己写的接口
List<User> userList = userRepository.findbyName("Elizabeth Olsen");
System.out.println(userList);
}
@Test
public void test02(){
User user = new User("Elizabeth Olsen", "18900000000");
User userAdded = userRepository.save(user);
System.out.println(userAdded);
}
@Test
public void test03(){
userRepository.deleteById(new Integer(11));
}
@Test
public void test04(){
// 修改之前要先做查询,不然会将未修改过的字段置为空
User user = userRepository.findAllById(new Integer(10));
user.setTel("18900000001");
User userModifyed = userRepository.save(user);
System.out.println(userModifyed);
}
// 这里使用@Transactional 进行事务控制
@Test
@Transactional
public void test05(){
userRepository.deleteByUsername("test");
}
标签:
Java
, Spring Boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)