欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  SpringBoot2(九):整合Jpa的基本使用
 
  本文在个人技术博客【鸟不拉屎】同步发布,详情可猛戳亦可扫描文章末尾二维码关注个人公众号【鸟不拉屎】
 
  一、前言
 
  今天早上看到一篇微信文章,说的是国内普遍用的Mybatis,而国外确普遍用的是Jpa。我之前也看了jpa,发现入门相当容易。jpa对于简单的CRUD支持非常好,开发效率也会比Mybatis高出不少,因为JpaRepository会根据你定制的实体类,继承了JpaRepository会有一套完整的封装好了的基本条件方法。减少了很多开发量。你只需要写SQL就行了。可能我才刚入门Jpa,对一些认识还是很浅显。我觉得Jpa对于多表查询,开发起来有点吃力。。
 
  这是我开始玩Jpa的最初的感受,但是Jpa却受到了极大的支持和赞扬,在国外Jpa远比Mybatis流行得多得多。国内却还是在流程用Mybatis,估计也是收到很多培训机构或者大V的带领下,很多国内优秀的开源项目也是用的Mybatis,因为已经用得非常熟练了。
 
  话不多说,先看看SpringBoot如何整合使用Jpa吧!
 
  这里具体讲一讲Jpa的搭建,几种常见的场景的使用:增删改查、多表查询,非主键查询这几种情况的一个学习总结。
 
  二、代码部署
 
  1、添加Maven依赖
 
  <dependency>
 
  <groupId>org.springframework.boot</groupId>
 
  <artifactId>spring-boot-starter-web</artifactId>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.springframework.boot</groupId>
 
  <artifactId>spring-boot-devtools</artifactId>
 
  <scope>runtime</scope>
 
  <optional>true</optional>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.projectlombok</groupId>
 
  <artifactId>lombok</artifactId>
 
  <optional>true</optional>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.springframework.boot</groupId>
 
  <artifactId>spring-boot-starter-test</artifactId>
 
  <scope>test</scope>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.springframework.boot</groupId>
 
  <artifactId>spring-boot-starter-data-jpa</artifactId>
 
  </dependency>
 
  <dependency>
 
  <groupId>mysql</groupId>
 
  <artifactId>mysql-connector-java</artifactId>
 
  <scope>runtime</scope>
 
  </dependency>
 
  其实Jpa关键用到的是最下面两块
 
  2、配置application
 
  application.yml
 
  server:
 
  port:8081
 
  #指定配置文件为test
 
  spring:
 
  profiles:
 
  active:test
 
  application-test.yml
 
  spring:
 
  datasource:
 
  driver-class-name:com.mysql.cj.jdbc.Driver
 
  url:jdbc:mysql://127.0.0.1:3306/jpatest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
 
  username:root
 
  password:root
 
  jpa:
 
  #数据库类型
 
  database:mysql
 
  #打印SQL
 
  show-sql:true
 
  hibernate:
 
  ddl-auto:update#第一次启动创建表,之后修改为update
 
  application-test.yml需要了解的是jpa分支,如果需要通过jpa在数据库中建表,就将spring.jpa.hibernate.ddl-auto改为create,建完表之后,建议改为update,否则你再次重启,表会回炉重造,数据相应的会丢失。可得注意啦。
 
  3、创建实体类
 
  用户表sys_user的实体类
 
  @Data
 
  @Entity
 
  @Table(name="sys_user")
 
  publicclassSysUserimplementsSerializable{
 
  @Id
 
  privateStringuserId;
 
  @Column(nullable=false)
 
  privateStringuserName;
 
  @Column(nullable=false)
 
  privateStringpassWord;
 
  @Column(nullable=false,unique=true)
 
  privateStringemail;
 
  @Column(nullable=false,unique=true)
 
  privateStringsalt;
 
  @Column(nullable=false)
 
  privateDateregTime;
 
  }
 
  用户角色对照表sys_user_role的实体类
 
  @Entity
 
  @Data
 
  @Table(name="sys_user_role")
 
  publicclassSysUserRoleimplementsSerializable{
 
  @Id
 
  @GeneratedValue
 
  privateintid;
 
  //用户ID
 
  privateStringuserId;
 
  //角色ID
 
  privateintroleId;
 
  }
 
  4、Dao层
 
  用户表SysUserDao
 
  publicinterfaceSysUserDaoextendsJpaRepository<SysUser,Integer>{
 
  }
 
  用户角色对照表SysUserRoleDao
 
  publicinterfaceSysUserRoleDaoextendsJpaRepository<SysUserRole,Integer>{
 
  }
 
  5、Controller层
 
  @RestController
 
  @RequestMapping("/user")
 
  publicclassUserController{
 
  @Autowired
 
  privateSysUserDaosysUserDao;
 
  @Autowired
 
  privateSysUserRoleDaosysUserRoleDao;
 
  /**
 
  *用户表sys_user,用户角色对照表sys_user_role。数据初始化
 
  */
 
  //发送get请求进行数据添加:127.0.0.1:8081/user/init
 
  @RequestMapping(value="/init",method=RequestMethod.GET)
 
  publicStringinitData(){
 
  for(inti=1;i<6;i++){
 
  //根据时间戳生成userId
 
  StringuserId=String.valueOf(System.currentTimeMillis());
 
  //new出用户表和用户角色表的对象
 
  SysUsersysUser=newSysUser();
 
  SysUserRolesysUserRole=newSysUserRole();
 
  //新增用户表
 
  sysUser.setUserId(userId);
 
  sysUser.setUserName("username_num"+i);
 
  sysUser.setPassWord("password_num"+i);
 
  sysUser.setEmail("email_num"+i+"@qq.com");
 
  sysUser.setSalt(i+"");
 
  sysUser.setRegTime(newDate());
 
  sysUserDao.save(sysUser);
 
  //暂时规定小于3的,角色为1,新建用户角色表
 
  if(i<3){
 
  sysUserRole.setId(i);
 
  sysUserRole.setUserId(userId);
 
  sysUserRole.setRoleId(1);
 
  sysUserRoleDao.save(sysUserRole);
 
  }else{
 
  //大于3的,角色为2
 
  sysUserRole.setId(i);
 
  sysUserRole.setUserId(userId);
 
  sysUserRole.setRoleId(2);
 
  sysUserRoleDao.save(sysUserRole);
 
  }
 
  }
 
  return"initdatasuccess";
 
  }
 
  /**
 
  *删除
 
  */
 
  //发送get请求:127.0.0.1:8081/user/delete/1562486017644
 
  @RequestMapping(value="/delete/{userId}",method=RequestMethod.GET)
 
  publicStringdeleteUser(@PathVariable("userId")StringuserId){
 
  sysUserDao.deleteByUserId(userId);
 
  return"deletesuccess";
 
  }
 
  /**
 
  *查询全部
 
  *@return
 
  */
 
  //发送get请求:127.0.0.1:8081/user/list
 
  @RequestMapping(value="/list",method=RequestMethod.GET)
 
  publicList<SysUser>getUsers(){
 
  returnsysUserDao.findAll();
 
  }
 
  /**
 
  *根据id查询
 
  */
 
  //发送get请求:127.0.0.1:8081/user/info/1562486017644
 
  @RequestMapping(value="/info/{userId}",method=RequestMethod.GET)
 
  publicOptional<SysUser>getUserById(@PathVariable("userId")StringuserId){
 
  returnsysUserDao.findByUserId(userId);
 
  }
 
  /**
 
  *更新
 
  */
 
  //发送post请求:127.0.0.1:8081/user/update
 
  //发送报文体如下
 
  /*
 
  {
 
  "userId":"1562486017551",
 
  "passWord":"231231231212312",
 
  "userName":"Tom",
 
  "email":"1111111@qq.com"
 
  }
 
  */
 
  @RequestMapping(value="/update",method=RequestMethod.POST)
 
  publicStringupdateAccount(@RequestBodyHashMap<String,String>map){
 
  //根据Id更新用户信息
 
  sysUserDao.updateOne(
 
  map.get("email"),
 
  map.get("userName"),
 
  map.get("passWord"),
 
  map.get("userId"));
 
  return"updatesuccess";
 
  }
 
  /**
 
  *关联查询用户的角色信息
 
  */
 
  //发送post请求:127.0.0.1:8081/user/getUserRole
 
  //发送报文体如下
 
  /*
 
  {
 
  "userId":"1562486017629"
 
  }
 
  */
 
  @RequestMapping(value="/getUserRole",method=RequestMethod.POST)
 
  publicList<SysUserInfo>getUserRole(@RequestBodyHashMap<String,String>map){
 
  returnsysUserDao.findUserRole(map.get("userId"));
 
  }
 
  /**
 
  *根据非主键username模糊查询
 
  */
 
  //发送post请求:127.0.0.1:8081/user/getUserByUserName
 
  //发送报文体如下
 
  /*
 
  {
 
  "userName":"username"
 
  }
 
  */
 
  @RequestMapping(value="/getUserByUserName",method=RequestMethod.POST)
 
  publicList<SysUser>getUserByUserName(@RequestBodyHashMap<String,String>map){
 
  returnsysUserDao.findUserName(map.get("userName"));
 
  }
 
  }
 
  代码有点多,只是我写的例子多了点
 
  6、补充Dao
 
  publicinterfaceSysUserDaoextendsJpaRepository<SysUser,Integer>{
 
  /**
 
  *根据userId删除数据
 
  */
 
  @Transactional
 
  @Query(value="deleteufromsys_useruwhereu.user_id=?1",nativeQuery=true)
 
  @Modifying
 
  voiddeleteByUserId(StringuserId);
 
  /**
 
  *根据UserId查询
 
  *@paramuserId
 
  *@return
 
  */
 
  @Query(value="selectu.*fromsys_useruwhereu.user_id=?1",nativeQuery=true)
 
  Optional<SysUser>findByUserId(StringuserId);
 
  /**
 
  *根据Id更新用户相关信息
 
  *nativeQuery=true添加该属性等于true则是原生SQL语句查询,不添加则是HQL语句
 
  */
 
  @Transactional
 
  @Query(value="updatesys_usersetemail=?1,user_name=?2,pass_word=?3whereuser_id=?4",nativeQuery=true)
 
  @Modifying
 
  publicvoidupdateOne(Stringemail,StringuserName,StringpassWord,StringuserId);
 
  /**
 
  *查询用户角色
 
  *@paramuserId
 
  *@return
 
  */
 
  @Query(value="SELECT"+
 
  "t.user_idASuserId,"+
 
  "t.user_nameASuserName,"+
 
  "t.emailASemail,"+
 
  "t.pass_wordASpassWord,"+
 
  "r.role_idASroleId"+
 
  "FROMsys_usertLEFTJOINsys_user_roler"+
 
  "ONr.user_id=t.user_id"+
 
  "WHEREt.user_id=?1",nativeQuery=true)
 
  List<SysUserInfo>findUserRole(StringuserId);
 
  /**
 
  *根据username查询用户信息
 
  *@return
 
  */
 
  @Query(value="selectu.*fromsys_useruwhereu.user_namelikeCONCAT('%',?1,'%')",nativeQuery=true)
 
  List<SysUser>findUserName(StringnickName);
 
  }
 
  这里需要注意的在findUserRole方法,是联表查询,其结果集在SysUserInfo中
 
  publicinterfaceSysUserInfo{
 
  StringgetUserId();
 
  StringgetUserName();
 
  StringgetEmail();
 
  StringgetPassWord();
 
  intgetRoleId();
 
  }

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56948.shtml