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