SpringBoot----利用JpaRepository实现数据的增删查改

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:事务注解,要么全部成功,要么全部失败

猜你喜欢

转载自blog.csdn.net/zz2713634772/article/details/79535619
今日推荐