当前位置: 首页 > news >正文

SpringBoot 数据访问-jpa

JPA 

JPA(Java Persistence API)是 Java 持久化规范,它为关系型数据库访问提供了一种对象关系映射(ORM)的解决方案。在 Spring Boot 中,结合 JPA 可以极大地简化数据库访问的开发工作。

@Entity注解:用于标记一个 Java 类为实体类,该类将与数据库中的表对应。

package com.ktjiaoyu.crm.pojo;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "sys_user")
//@NamedQueries(@NamedQuery(name = "User.findUsersByName", query = "select u from User u where u.usrName= ?1"))
public class User implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "usr_id")private Long usrId;@Column(name = "usr_name")private String usrName;@Column(name = "usr_password")private String usrPassword;
//    @Column(name = "usr_role_id")
//    private Long usrRoleId;@ManyToOne(targetEntity = Role.class)@JoinColumn(name = "usr_role_id")private Role role;@Column(name = "usr_flag")private Integer usrFlag;public User() {}public User(String usrName, String usrPassword, Role role, Integer usrFlag) {this.usrName = usrName;this.usrPassword = usrPassword;this.role = role;this.usrFlag = usrFlag;}public Long getUsrId() {return usrId;}public void setUsrId(Long usrId) {this.usrId = usrId;}public String getUsrName() {return usrName;}public void setUsrName(String usrName) {this.usrName = usrName;}public String getUsrPassword() {return usrPassword;}public void setUsrPassword(String usrPassword) {this.usrPassword = usrPassword;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}public Integer getUsrFlag() {return usrFlag;}public void setUsrFlag(Integer usrFlag) {this.usrFlag = usrFlag;}
}

 @Repository注解:用于标记数据访问层的组件类,通常用于数据库操作的方法定义

package com.ktjiaoyu.crm.repository;
import com.ktjiaoyu.crm.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User,Long>{//    List<User> findByUsrNameLike(String usrName);
//
//    @Query(value = "select u from User u where u.usrRoleId=:roleId")
//    List<User> findByRoleId(@Param("roleId") Long roleId);
//
//    @Transactional(timeout = 10)
//    @Modifying
//    @Query("update  User u set u.usrName=?1 where u.usrId=?2")
//    int modifyNameById(String usrName,Long roleId);
//
//    List<User> findUsersByName(String usrName);
//
//    @Query("select u from User u where u.usrRoleId=?1")
//    Page<User> findPageByUsrRoleId(Long roleId, Pageable pageable);
}

JpaRepository接口:Spring Data JPA 提供的核心接口,继承自PagingAndSortingRepositoryCrudRepository,提供了丰富的数据库操作方法,如增删改查、分页和排序等。

配置

application.propertiesapplication.yml文件中进行数据库连接等配置。

spring.application.name=SpringBootJPA
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
#??JPA????
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

测试 

package com.ktjiaoyu.crm;import com.ktjiaoyu.crm.pojo.Role;
import com.ktjiaoyu.crm.pojo.User;
import com.ktjiaoyu.crm.repository.RoleRepository;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
//@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTester {
//    @Resource
//    private UserRepository userRepository;@Resourceprivate RoleRepository roleRepository;@Testpublic void testAdd(){//测试级联新增Role role=new Role("测试角色","演示级联新增角色和用户",1);User user1=new User("测试用户1","123456",role,1);User user2=new User("测试用户2","123456",role,1);role.getUsers().add(user1);role.getUsers().add(user2);roleRepository.save(role);//新增角色的同时新增关联的用户}//级联删除@Testpublic void testDelete() {//测试级联删除//先使用getOne方法获取到Role的引用,然后调用delete方法删除Role role = roleRepository.getOne(9L);roleRepository.delete(role);}@Testpublic void testsGet(){//测试按主键查询角色,输出关联角色数量Role role=roleRepository.findById(2L).get();System.out.println("roleName "+role.getRoleName());System.out.println("users.size "+role.getUsers().size());}//    @Test
//    public void testGet(){//测试按注解查询用户,关联获得
//        User user=userRepository.findById(2L).get();
//        System.out.println("usrName "+user.getUsrName());
//        System.out.println("roleName "+user.getRole().getRoleName());
//    }//    @Resource//    private UserService userService;//    @Test
//    public void testInsert(){
//        User user = new User("JPA","123456",2L,1);
//        userRepository.save(user);
//    }
//
//    @Test
//    public void testGet(){
//        User user = userRepository.findById(6L).get();
//        System.out.println("usrName:"+user.getUsrName());
//    }
//
//    @Test
//    public void testFindByUsrNameLike(){
//        List<User> list = userRepository.findByUsrNameLike("%s%");
//        if (list != null){
//            for (User user : list){
//                System.out.println("usrName:"+user.getUsrName());
//            }
//        }
//    }
//
//
//
//    @Test
//    public void testFindPageByUsrRoleId(){
//        int page=0,size=4;
//        Sort sort = Sort.by(Sort.Direction.DESC,"usrId");
//        Pageable pageable = PageRequest.of(page,size,sort);
//        Page<User> userPage = userRepository.findPageByUsrRoleId(9L,pageable);
//        System.out.println("总记录数:"+userPage.getTotalElements());
//        System.out.println("总页数:"+userPage.getTotalPages());
//        System.out.println("当前页数:"+userPage.getNumber()+1);
//        System.out.println("每页记录数:"+userPage.getSize());
//        System.out.println("当前页记录数:"+userPage.getNumberOfElements());
//        for (User user : userPage.getContent()){
//            System.out.println("usrId:"+user.getUsrId());
//        }
//    }
//
//
//
//
//    @Test
//    public void testFindPageByMap(){
//        int page=0,size=5;
//        Sort sort = Sort.by(Sort.Direction.DESC,"usrId");
//        Pageable pageable = PageRequest.of(page,size,sort);
//        Map param = new HashMap();
//        param.put("roleId",3L);
//        Page<User> userPager = userService.findPageByMap(param,pageable);
//        System.out.println("总记录数 -----> "+userPager.getTotalElements());
//        System.out.println("总页数 -----> "+userPager.getTotalPages());
//        System.out.println("当前页数-----> "+userPager.getNumber());
//        System.out.println("当前记录数 -----> "+userPager.getSize());
//        System.out.println("当前页记录 -----> ");
//        for (User user : userPager.getContent()){
//            System.out.println("usrId:"+user.getUsrId());
//        }
//    }
}

总结 

简化开发:减少了大量的 SQL 编写工作,通过对象操作数据库。

可维护性高:代码更加清晰、易于理解和维护。

数据库无关性:可以在不同的数据库之间轻松切换,只需更改配置。

强大的查询功能:支持方法命名查询和使用 JPQL(Java Persistence Query Language)进行复杂查询。

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 旋转编码器模块(软件消抖)
  • LVGL | VisualStuio PC模拟器
  • 【机器学习】集成学习------迅速了解什么是集成学习!!!
  • 子组件和父组件的挂载顺序
  • 微信小程序认证和备案
  • c++ 编译器的不同处理阶段详解
  • Open3D 点云添加均匀分布的随机噪声
  • Spring Cloud各个微服务之间为什么要用http交互?难道不慢吗?
  • camtasia studio字幕位置怎么移动 camtasia studio字幕有黑框怎么删除黑框
  • oracle 数据库安装与配置 全新教程
  • nestjs目录命名导致的循环引用
  • 2024嵌入式面试:比亚迪嵌入式面试题及参考答案(BYD面试)
  • 数据安全与个人信息保护的辨析
  • 数据结构---五大排序---哈希表---二分查找法
  • 9,sql 约束
  • 3.7、@ResponseBody 和 @RestController
  • Angular6错误 Service: No provider for Renderer2
  • css布局,左右固定中间自适应实现
  • golang 发送GET和POST示例
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Laravel Telescope:优雅的应用调试工具
  • Logstash 参考指南(目录)
  • Map集合、散列表、红黑树介绍
  • PhantomJS 安装
  • Phpstorm怎样批量删除空行?
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关于Flux,Vuex,Redux的思考
  • 两列自适应布局方案整理
  • 爬虫模拟登陆 SegmentFault
  • 前端_面试
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 说说动画卡顿的解决方案
  • 突破自己的技术思维
  • 小程序button引导用户授权
  • 智能合约Solidity教程-事件和日志(一)
  • 追踪解析 FutureTask 源码
  • 关于Android全面屏虚拟导航栏的适配总结
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​2020 年大前端技术趋势解读
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​如何防止网络攻击?
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #define与typedef区别
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $.proxy和$.extend
  • (1)常见O(n^2)排序算法解析
  • (2)(2.10) LTM telemetry
  • (6)STL算法之转换
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740