SpringBoot整合SpringData(JPA)

一、添加依赖和配置信息

建立一个SpringBoot项目
在这里插入图片描述
已有项目直接添加SpringData依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

application-dev.yml中添加配置

spring:
  datasource:    #连接数据库四要素
    username: yancy
    password: yancy
    url: jdbc:mysql://127.0.0.1:3306/yan_1808
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    database: mysql           #指定数据库类型
    show-sql: true            #显示sql语句
    hibernate:
      ddl-auto: update        #建表策略update,根据实体类更改表结构

二、代码测试

1、建立一个实体类

/**
 * Created by yan on 2019/2/10.
 */
@Entity   //对象关系映射生成表结构
@Table(name = "data_user")
public class User {
    @Id  //主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  //主键自增
    @Column(name = "us_id")
    private Integer usId;
    @Column(name = "us_name")
    private String usName;
    @Column(name = "us_age")
    private Integer usAge;
    //getter setter
}

2、建立持久层、业务逻辑层、控制层

2.1、dao

接口继承CrudRepository,

CrudRepository为我们提供了一下方法:save,saveAll,findById,existsById,findAll,findAllById,deleteById,delete,deleteAll,因此简单的增删改查不需要在持久层写代码

/**
 * Created by yan on 2019/2/10.
 *
 * CrudRepository参数 :<实体类,主键类型>
 */
public interface UserRepository extends CrudRepository<User,Integer> {
		
}
2.2、service

UserService.java

/**
 * Created by yan on 2019/2/10.
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public List selectUser() {
        return (List) userRepository.findAll();
    }
}
2.3、controller

controller.java

/**
 * Created by yan on 2019/2/10.
 */
@Controller
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 查询User列表
     */
    @RequestMapping("select")
    public String selectUser(ModelMap map){
        List userList = userService.selectUser();
        map.put("userList",userList);
        return "list";
    }
}

3、启动项目,自动生成表结构

启动日志:
在这里插入图片描述
生成的表:
在这里插入图片描述

4、查询

创建list.ftl页面
后台代码前面已经写好了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border = "1">
    <tr>
        <td>编号</td>
        <td>名称</td>
        <td>年龄</td>
        <td>操作</td>
    </tr>
    <#list userList as user>
        <tr>
            <td>${user.usId}</td>
            <td>${user.usName}</td>
            <td>${user.usAge}</td>
            <td>
                <a href = "">修改</a>
                <a href = "">删除</a>
            </td>
        </tr>
    </#list>
</table>
</body>
</html>

在这里插入图片描述

5、增加

调用CrudRepository中的save()方法即可。

三、CrudRepository与JpaRepository的区别

在持久层可以继承CrudRepository,也可以替换成JpaRepository。这两个接口都包含了我们需要的方法

首先看他们两个的继承关系
在这里插入图片描述

1、CrudRepository和JpaRepository两个接口的代码区别

CrudRepository接口

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1);
    <S extends T> Iterable<S> save(Iterable<S> var1);
    T findOne(ID var1);
    boolean exists(ID var1);
    Iterable<T> findAll();
    Iterable<T> findAll(Iterable<ID> var1);
    long count();
    void delete(ID var1);
    void delete(T var1);
    void delete(Iterable<? extends T> var1);
    void deleteAll();
}

JpaRepository接口

@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();
    List<T> findAll(Sort var1);
    List<T> findAll(Iterable<ID> var1);
    <S extends T> List<S> save(Iterable<S> var1);
    void flush();
    <S extends T> S saveAndFlush(S var1);
    void deleteInBatch(Iterable<T> var1);
    void deleteAllInBatch();
    T getOne(ID var1);
    <S extends T> List<S> findAll(Example<S> var1);
    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}



两者的save方法的不同
JpaRepository 中的save方法实现源码:

@Transactional
    public <S extends T> List<S> save(Iterable<S> entities) {
        List<S> result = new ArrayList<S>();
        if (entities == null) {
            return result;
        }
        for (S entity : entities) {
            result.add(save(entity));
        }
        return result;
    }

CrudRepository 中的save方法源代码:

@Transactional
    public <S extends T> S save(S entity) {
        if (entityInformation.isNew(entity)) {
            em.persist(entity);//是新的就插入
            return entity;
        } else {
            return em.merge(entity); //不是新的merge
        }
    }

CrudRepository 中的save方法是相当于merge+save ,它会先判断记录是否存在,如果存在则更新,不存在则插入记录。

猜你喜欢

转载自blog.csdn.net/weixin_44030218/article/details/86867252