SpringBoot----利用JpaRepository实现数据的增删查改
1、新建一个Maven项目,使用jdk1.8,在pom.xml中添加如下依赖:
<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.etc</groupId>
<artifactId>springboot4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot4</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- SpringBoot web开发包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot 测试包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<!-- data jpa依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2、在com.etc.springboot4包下新建一个Application.java启动类:
package com.etc.springboot4;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
/**
* @Description:启动类
* @author zoey
* @date:2018年3月12日
*/
@SpringBootApplication
@ComponentScan(basePackages="com.etc.*")//指定要扫描的包
@EnableJpaRepositories(basePackages="com.etc.*")
@EntityScan(basePackages="com.etc.*")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
System.out.println("启动完成。。。。。。。。。。。");
}
/**
报错:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController':
Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.
BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed;
nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.etc.domain.User
解决办法:
在启动类Application.java类上添加注解:@EntityScan(basePackages="com.etc.*")
*/
/**
报错:
Description:
Field userRepository in com.etc.controller.UserController required a bean of type 'com.etc.domain.UserRepository' that could not be found.
Action:
Consider defining a bean of type 'com.etc.domain.UserRepository' in your configuration.
解决办法:
在启动类Application.java类上添加注解:@EnableJpaRepositories(basePackages="com.etc.*")
*/
}
3、新建src/main/resources文件夹,在文件夹下新建application.properties文件
###############################数据库配置:连接本地数据库###############################
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
4、在com.etc.domain包下新建User.java类:
package com.etc.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @Description:用户实体类:自动根据这个类在数据库中创建一个表
* @author zoey
* @date:2018年3月12日
*/
@Entity
//@Table(name = "t_user2")//指定要创建的表的名称,如果不加这个注解,默认创建user表(User类的名称第一个字母小写)
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
private String name;
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 User(String name) {
super();
this.name = name;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
5、在com.etc.domain包下新建UserRepository.java类:
package com.etc.domain;
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;
/**
* @Description:用户接口类:实现用户的增删查改方法
* @author zoey
* @date:2018年3月12日
*/
@Transactional//执行修改方法时一定要添加这个注解和@Modifying注解
public interface UserRepository extends JpaRepository<User, Long> {
@Modifying
@Query(value = "update user set name = :name where id = :id",nativeQuery = true)
void updateNameById(@Param("id") Long id, @Param("name") String name);
/**报错:
* java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
* 解决方式:
* 在修改方法上面添加@Modifying 注解
* 报错:
* javax.persistence.TransactionRequiredException: Executing an update/delete query
* 解决方式:
* 在UserRepository.java类上添加@Transactional注解
*/
}
6、在com.etc.controller包下新建UserController.java类:
package com.etc.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.etc.domain.User;
import com.etc.domain.UserRepository;
/**
* @Description:用户控制类,调用用户接口中的方法,实现对用户信息的增删查改
* @author zoey
* @date:2018年3月12日
*/
@RequestMapping("/users")
@RestController
@Transactional
public class UserController {
@Autowired
private UserRepository userRepository;
/**
* @Description:添加用户信息
* 访问地址:http://localhost:8080/users/save
* @return
* @author:zoey
* @date:2018年3月12日
*/
@RequestMapping("/save")
public String save() {
System.out.println("添加用户");
userRepository.save(new User("AAAA"));
userRepository.save(new User("BBBB"));
userRepository.save(new User("CCCC"));
return "save";
}
/**
* @Description:查找所有用户信息
* @return 返回用户列表 [{"id":1,"name":"AAAA"},{"id":2,"name":"BBBB"},{"id":3,"name":"CCCC"}]
* @author:zoey
* @date:2018年3月12日
*/
@RequestMapping("/findAll")
public List<User> findAll(){
System.out.println("查询所有用户");
List<User> userList = userRepository.findAll();
for(User user:userList) {
System.out.println("用户:"+user);
}
return userList;
}
/**
* @Description:根据用户ID查询用户信息
* 访问地址:http://localhost:8080/users/findById/xx
* @param id
* @return json数据 {"id":1,"name":"AAAA"}
* @author:zoey
* @date:2018年3月12日
*/
@RequestMapping("/findById/{id}")
public User findUserById(@PathVariable Long id){
System.out.println("查询用户");
User user = userRepository.findOne(id);
System.out.println("用户:"+user);
return user;
}
/**
* @Description:根据用户ID修改用户名
* 访问地址:http://localhost:8080/users/update?id=xx&name=xx
* @param id 传入的参数:用户ID
* @param name 传入的参数:用户名
* @return
* @author:zoey
* @date:2018年3月12日
*/
@RequestMapping("/update")
public String updateNameById(@RequestParam Long id,@RequestParam String name) {
System.out.println("修改用户");
userRepository.updateNameById(id,name);
return "update";
}
/**
* @Description:删除用户
* 访问地址:http://localhost:8080/delete?id=xx
* @param id 传入的参数:用户ID
* @return
* @author:zoey
* @date:2018年3月12日
*/
@RequestMapping("/delete")
public String delete(@RequestParam Long id) {
System.out.println("删除用户");
userRepository.delete(id);
return "delete";
}
}
7、运行:选中启动类Application.java,点击Run As-->Java Application,然后在页面使用地址访问如下:
(1)添加用户,创建表user:
访问地址:http://localhost:8080/users/save,效果如下:
(2)查询所有用户:
访问地址:http://localhost:8080/users/findAll
(3)根据指定ID查询指定用户:
访问地址:http://localhost:8080/users/findById/1
(4)根据用户ID修改用户名:
访问地址:http://localhost:8080/users/update?id=1&name=aaa
(5)根据用户ID删除指定用户:
访问地址:http://localhost:8080/users/delete?id=1
错误总结:
1、启动报错:
Description:
Field userRepository in com.etc.controller.UserController required a bean of type 'com.etc.domain.UserRepository' that could not be found.
Action:
Consider defining a bean of type 'com.etc.domain.UserRepository' in your configuration.
解决方法:
在启动类Application.java类上添加注解:@EnableJpaRepositories(basePackages="com.etc.*")
2、启动报错:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController':
Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.
BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed;
nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.etc.domain.User
解决方法:
在启动类Application.java类上添加注解:@EntityScan(basePackages="com.etc.*")
3、执行更新方法报错:
java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
解决方法:
在修改方法上面添加@Modifying 注解
修改后又有另一个报错:
javax.persistence.TransactionRequiredException: Executing an update/delete query
解决方法:
在UserRepository.java类上添加@Transactional注解
总结:
1、要使用JpaRepository实现增删查改需要进行如下操作:
- 在pom.xml中添加JPA依赖包:
- User.java类需要添加@Entity注解,在类的属性上面需要添加@Id或者@Column注解
- UserRepository.java接口需要实现JpaRepository接口,默认有增删查方法,修改方法可以自己定义
- 启动类需要添加两个注解,分别是:@EnableJpaRepositories(basePackages="com.etc.*")和@EntityScan(basePackages="com.etc.*")
2、注解的作用:
@Entity:表示这是一个实体
@Table:指定Entity所要映射的数据库表,指定表名称,如果不指定,就是类名的首字母小写
@Id:对应数据库中的ID,主键
@Column:对应数据库表中普通属性
@GeneratedValue:指定主键的生成策略,根据不同的数据库自动选择
@EnableJpaRepositories(basePackages="com.etc.*"):扫描指定的包下的Respository
@EntityScan(basePackages="com.etc.*") :扫描指定包下的实体
@ComponentScan(basePackages="com.etc.*"):指定扫描的包,否则只扫描此类所在的包
@Modifying:完成修改操作(不包括新增)
@Transactional:事务注解,要么全部成功,要么全部失败