访问数据库的方式大概可以分为两个流派:一个是以sql为中心,在jdbc上做封装;另一个流派则是以java entity为中心,以实体与实体关系映射,实体与实体操作会映射到数据库操作,spring data JPA则属于此类。第二中流派的好处,我想是可以最大限度的减少用户自己编写sql语句,尽量减少因sql而造成的错误,可维护性和迁移性更高。
最近项目中需要用到jpa,就简单的学习了一下具体的操作,于是记录下来。
首先,使用jpa,要创建一个实体类,这个实体类是用来关联数据库的业务表;以user为例。
1、建立Entity
@Entity
@Table(name = "user") //如果没有指定,默认为当前类名,如User,数据库中为user;如UserTable,对应
数据库为user_table
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id ;
//部门
@Column
private String name ;
//创建时间
@Column(name="create_time") // 同table规则
private Date createTime ;
}
2、建立Repository
Repository是数据库noSql的核心
CrudRepository,提供基本增删改查;
PagingAndSortingRepository,集成CrudRepository,新增分页查询;
JpaRepository,提供丰富的数据库访问接口;
以JpaRepository为例
public interface UserRepository extends JpaRepository<User, Integer>{
Optional<User> findByName (String name);//根据name查找,where name = name,返回映射User实体类
}
3、持久化Entity
以保存记录sava为例
public interface UserService {
public User findUser(int id);
public Integer addUser(User user);
public List<User> getAllUser(int start,int end);
public User getUser(String name);
public User getUser(String name,Integer departmentId);
public Page<User> queryUser(Integer departmentId,Pageable page);
public Page<User> queryUser2(Integer departmentId,Pageable page);
public List<User> getByExample(String name) ;
public void updateUser();
}
//实现UserService,其中以addUser为例
public Integer addUser(User user){
userDao.save(user);
user.setName("1"+user.getName());
userDao.save(user);
return user.getId();
}
第一个save是保存操作,输出的sql语句应为(Hibernate:insert into user(create_time,name)values(?,?))
第二个save为更新操作,输出的sql语句应为(Hibernate:update user set create_time=?,name=?)
4、基于方法名称查询
在建立Repository中有一个接口写了一个方法,findByName,但后续并未实现此方法,特别说明的是,这里不需要我们实现这个方法,这也是noSql中最方便的地方,这里可根据方法名进行查询。比如:findByLastnameAndFirstname对应的jpql语句则为
...where x.lastname=?1 and x.firstname= ?2,接口封装的程序帮我们自动生成了SQL语句对数据库进行访问,再映射到创建的实体类中。
注,本文部分代码来自于《spring Boot 2 精髓》一书中的spring Data JPA一章中