本节我们学习使用Jpa,jpa其实是一个规范,在出来之前,都是使用hibernate,hibernate可以使程序员以面向对象的方式操作数据库,我还是喜欢native sql。
先导入相关包,如下:
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('mysql:mysql-connector-java')
配置数据库连接,修改application-dev.yml,如下:
spring:
datasource:
url: jdbc:mysql://localhost:3306/xfdb?useUnicode=true&characterEncoding=UTF-8
password: root
username: root
配置实体,配置实体与表的关联,是否字段映射,ID生成器等,如下:
@Entity(name = "t_user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
private String name;
private Integer age;
@Transient
private String email;
首先,使用@Entity(name = "t_user")
指定实体映射的表名,ID生成方式IDENTITY为由底层数据库生成标识,@Transient
指定当前字段不映射到数据库。
接着写db操作类repository,其实这里是一个interface,如下:
@Repository
public interface UserRepository extends JpaRepository {
/**
* 自定义
*/
List findAllByName(String name);
}
我们继承JpaRepository,就已经有了增删改查的方法了,无需我们再加,但可以加其它的方法,如上面的findAllByName。
这里是根据方法名生成sql,如select u from User u where u.name=?
,深入学习可以查看官方文档。
接着编写controller实现增删改查,注入repository,如下:
@RestController
@RequestMapping("/user")
public class SpringJpaController {
@Autowired
private UserRepository repository;
查询用户
@GetMapping
public List queryUsers() {
// 查询所有用户
return repository.findAll();
}
根据id查询用户
@GetMapping("/{id}")
public Optional getUser(@PathVariable Long id) {
// 根据主键ID查询
User u = new User();
u.setId(id);
return repository.findOne(Example.of(u));
}
这里使用了Optional,这是java8引入的,当一个值可能是不存在的时候,就需要用到可选类型(optionals)。
删除用户
@DeleteMapping("/{id}")
public void delUser(@PathVariable Long id) {
// 根据主键ID删除用户信息
repository.deleteById(id);
}
添加用户
@PostMapping
public User addUser(@RequestBody User user) {
// 添加用户
return repository.save(user);
}
更新用户
@PutMapping("/{id}")
public User editUser(@PathVariable Long id, @RequestBody User user) {
// 根据主键ID修改用户信息
user.setId(id);
return repository.save(user);
}
注意,更新实体一定要用id,否则会当作保存。
学习交流,请加群:64691032