文章目录
一、添加依赖和配置信息
建立一个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 ,它会先判断记录是否存在,如果存在则更新,不存在则插入记录。