1.ORM对象关系映射
java程序: 创建实体类;定义类属性;new对象。
DB关系型数据库:创建表; 定义表的列;insert插入一条记录。
JPA是数据持久层框架,实现数据的crud操作,它是以ORM对象关系映射为基础,实现完全面向对象的数据库操作,不用在进行数据库操作的时候定义sql语句,封装了jdbc,简化了对数据库的操作,使得java程序可以在不同的数据库平台上移植。
2.搭建项目
2.配置application.yml
#配置mysql数据库连接
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/jpa
username: root
password: root
#进行JPA的特性配置
jpa:
#配置jpa的正向工厂(根据实体类自动生成数据库表)
generate-ddl: true
#将jpa产生的sql语句,打印到控制台
show-sql: true
hibernate: #配置自定创建数据库表的策略
ddl-auto: update
#配置数据库方言
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
3.创建实体类
/****
* 实现ORM对象关系映射
* Entity 注解描述类和表的关系
*/
//创建用户实体类
@Entity(name="t_users")
public class Users {
//描述数据库主键和java属性的关系
@Id
//描述数据库中主键的生成策略,自增的
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//描述除过主键列之外的其他列和数据库的映射
@Column
private String uname;
@Column
private String upwd;
@Column
private Integer age;
4.dao接口
/***
* 该接口中定义方法Users信息的访问
* 自定义的UsersDao,必须继承JpaResository接口,获得对数据库进行CURD操作的方法
*/
public interface UsersDao extends JpaRepository<Users,Integer>,JpaSpecificationExecutor {
}
5.测试
@SpringBootTest
class ApplicationTests {
@Test
void contextLoads() {
System.out.println("初始化数据库");
}
/****
* 将UsersDao代理对象注入到测试类
*/
@Autowired
private UsersDao usersDao;
/***
* 测试添加用户信息
*/
@Test
public void saveUsersTest(){
Users users=new Users();
//users.setId(10000);
users.setUname("oo");
users.setAge(32);
users.setUpwd("909090");
//通过继承的save方法完成数据的保存
usersDao.save(users);
}
/****
* 测试用户信息更新
* save方法可以做insert操作,也可以做插入操作
* id=null:进行insert操作
* id!=null:
* 能查询到数据,进行更新操作
* 查询不到数据,进行插入操作
*/
@Test
public void updateUsersTest(){
Users users=new Users();
users.setId(1);
users.setUname("ll");
users.setAge(22);
users.setUpwd("8080");
usersDao.save(users);
}
/***
* 查询某个用户信息
*/
@Test
public void loadUsers(){
//Users users = usersDao.getOne(1);
Optional<Users> optional = usersDao.findById(1);
Users users = optional.get();
System.out.println(users.getId()+"\t"+users.getUname()+"\t"+users.getUpwd()+"\t"+users.getAge());
}
/****
* 查询所有用户信息
*/
@Test
public void loadUsersList(){
List<Users> all = usersDao.findAll();
for(Users users:all){ System.out.println(users.getId()+"\t"+users.getUname()+"\t"+users.getUpwd()+"\t"+users.getAge());
}
}
/***
* 进行用户信息分页查询
*/
@Test
public void loadUsersList02(){
//指定分页查询参数
Pageable pageable= PageRequest.of(0,2);
//PageRequest.of(1,3,sort);
Page<Users> page = usersDao.findAll(pageable);
//获得用户的总记录数
long elements = page.getTotalElements();
//获得分页查询的最大额
int pages = page.getTotalPages();
System.out.println("elements="+elements);
System.out.println("pages="+pages);
//获得查询到的用户信息
List<Users> content = page.getContent();
for (Users users:content){
System.out.println(users.getId()+"\t"+users.getUname()+"\t"+users.getUpwd()+"\t"+users.getAge());
}
}
/****
* 查询结果排序
*/
@Test
public void loadUsersList03(){
//调用静态方法创建对
Sort sort=Sort.by(Sort.Direction.DESC,"age");
List<Users> list = usersDao.findAll(sort);
for (Users users:list){
System.out.println(users.getId()+"\t"+users.getUname()+"\t"+users.getUpwd()+"\t"+users.getAge());
}
}
/****
* 实现动态where条件查询
*/
@Test
public void laodUsersList04(){
//创建Users对象,封装前台提交的查询条件
Users users=new Users();
/*users.setUname("laifu");
users.setAge(30);*/
List<Users> list = usersDao.findAll(new Specification<Users>() {
/***
*
* @param root
* @param query
* @param cb 封装了sql语句中的运算符
* @return
*/
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//创建List<Predicate>对象,封装查询条件
List<Predicate> params = new ArrayList<>();
String uname = users.getUname();
if (!StringUtils.isEmpty(uname)) {
//where uname=uname
params.add(cb.equal(root.get("uname"), uname));
}
Integer age = users.getAge();
if (age != null) {
params.add(cb.ge(root.get("age"), age));
}
//多个查询条件使用and连接
//return cb.and(params.toArray(new Predicate[]{}));
return cb.or(params.toArray(new Predicate[]{}));
}
});
for (Users u:list){
System.out.println(u.getId()+"\t"+u.getUname()+"\t"+u.getUpwd()+"\t"+u.getAge());
}
}
}