SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页详解
一、使用Springboot+Jpa实现对mysql数据库的增删改查和分页功能
JPA是JavaPersistenceAPI的简称,中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
使用Springboot和jpa对数据库进行操作时,能够大大减少我们的工作量,在jpa中,已经在底层封装好了增删查的功能和sql语句,可以使我们进行快速开发
二、项目过程和配置文件
1、applaction.properties文件配置
#数据源配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver #注意test是你要连接的数据库的名字见下图 spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.initialSize=20 spring.datasource.minIdle=50 spring.datasource.maxActive=500 #上下文配置 server.port=8888 server.servlet.context-path=/kude #配置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.enable_lazy_load_no_trans=true
2、pom.xml文件配置
org.springframework.boot spring-boot-starter-parent 2.1.4.RELEASE com.example kudesoft 0.0.1-SNAPSHOT kudesoft DemoprojectforSpringBoot 1.8 org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test com.alibaba druid 1.1.10 com.github.pagehelper pagehelper-spring-boot-starter 1.2.10 org.springframework.boot spring-boot-maven-plugin
3、项目结构
4、实体类Student
packagecom.example.kudesoft.entity; importjavax.persistence.*; /** *Student实体类 *@Entity表示该类是一个实体类 *@Table(name="student")表示该类对应数据库中的student表 *@Id表明该属性是一个主键 *@GeneratedValue(strategy=GenerationType.IDENTITY)表示该主键自增 */ @Entity @Table(name="student") publicclassStudent{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) privateIntegerid; privateStringsname; privateStringspassword; publicStudent(){ } @Override publicStringtoString(){ return"Student{"+ "id="+id+ ",sname='"+sname+'\''+ ",spassword='"+spassword+'\''+ '}'; } publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicStringgetSname(){ returnsname; } publicvoidsetSname(Stringsname){ this.sname=sname; } publicStringgetSpassword(){ returnspassword; } publicvoidsetSpassword(Stringspassword){ this.spassword=spassword; } }
5、DAO层
packagecom.example.kudesoft.dao; importcom.example.kudesoft.entity.Student; importorg.springframework.data.jpa.repository.JpaRepository; importorg.springframework.data.jpa.repository.Query; importorg.springframework.data.repository.query.Param; importjava.util.List; publicinterfaceStudentDAOextendsJpaRepository{ //根据id查 StudentfindStudentById(Integerid); //根据名字查询 @Query(name="findStudentBySname",nativeQuery=true, value="select*fromstudentwheresname=:sname") List findStudentBySname(@Param("sname")Stringsname); //登录功能 StudentfindStudentBySnameAndSpassword(@Param("sname")Stringsname,@Param("spassword")Stringspassword); }
在jpa中封装有查询功能、添加功能、删除功能,但是没有修改功能以及一些特定的查询功能,所以在编程过程中,我们需要根据需求来增加一些功能函数。如果要是根据id来进行查询或其他操作时,数据库中的主键id一定要设为id,不要设置为sid、uid等其他的主键名。
6、Service层
packagecom.example.kudesoft.service; importcom.example.kudesoft.entity.Student; importorg.springframework.data.domain.Page; importjava.util.List; publicinterfaceStudentService{ //查询所有 ListfindAll(); //根据id查询单个 StudentfindStudentById(Integerid); //根据name查询 List findStudentByName(Stringsname); //登录 StudentfindStudentByNameAndPassword(Stringsname,Stringspassword); //添加一个 Studentsave(Studentstudent); //删除一个 voiddeleteStudentById(Integerid); //修改 Studentupdate(Studentstudent); //分页 Page findAll(intpage,intpageSize); }
在编写分页功能时,一定要注意Page所在的包是importorg.springframework.data.domain.Page,不是其他的包,如果包导错了,就会出现错误。
7、ServiceImpl
packagecom.example.kudesoft.service; importcom.example.kudesoft.dao.StudentDAO; importcom.example.kudesoft.entity.Student; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.data.domain.Page; importorg.springframework.data.domain.PageRequest; importorg.springframework.data.domain.Pageable; importorg.springframework.stereotype.Service; importjava.util.List; /** *Service实现 */ @Service publicclassStudentServiceImplimplementsStudentService{ @Autowired privateStudentDAOstudentDAO; /** *查询所有 *@return */ @Override publicListfindAll(){ returnstudentDAO.findAll(); } /** *根据id查询 *@paramid *@return */ @Override publicStudentfindStudentById(Integerid){ returnstudentDAO.findStudentById(id); } /** *根据名字查询 *@paramsname *@return */ @Override publicList findStudentByName(Stringsname){ returnstudentDAO.findStudentBySname(sname); } /** * *查询name和password进行登录 *@paramsname *@paramspassword *@return */ @Override publicStudentfindStudentByNameAndPassword(Stringsname,Stringspassword){ returnstudentDAO.findStudentBySnameAndSpassword(sname,spassword); } /** *添加信息 *@paramstudent *@return */ @Override publicStudentsave(Studentstudent){ returnstudentDAO.save(student); } /** *根据id来删除 *@paramid */ @Override publicvoiddeleteStudentById(Integerid){ studentDAO.deleteById(id); } /** *修改 *@paramstudent *@return */ @Override publicStudentupdate(Studentstudent){ returnstudentDAO.save(student); } /** *分页操作 *@parampage *@parampageSize *@return */ @Override publicPage findAll(intpage,intpageSize){ Pageablepageable=PageRequest.of(page,pageSize); return(Page )studentDAO.findAll(pageable); } }
在进行分页操作的时候,由于Jpa中封装有很多的findAll()函数,所以一定要看清楚要用哪一个findAll()函数,如上代码片:查询所有的studentDAO.findAll()和分页的studentDAO.findAll()函数一样,但是内部参数不一样,所以就会产生不一样的结果。
8、Controller层
packagecom.example.kudesoft.controller; importcom.example.kudesoft.entity.Student; importcom.example.kudesoft.service.StudentService; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.data.domain.Page; importorg.springframework.web.bind.annotation.*; importjavax.servlet.http.HttpServletResponse; importjava.util.List; /** *控制层 *@Autowired用于类中的属性注入 *@RestController注解底层包括了@ResponseBody和@Controller两个注解 *@ResponseBody将数据以json格式返回 *@RequestMapping("/XXXX")请求路径 *@GetMapping("/xxxx")Get请求 *@PostMapping("/XXX")Post请求 */ @RestController @RequestMapping("/student") publicclassStudentController{ @Autowired privateStudentServicestudentService; /** *查询所有 *@return */ @GetMapping("/findAll") publicListfindAll(){ returnstudentService.findAll(); } /** *根据id查询 *@paramid *@return */ @GetMapping("/findById") publicStudentfingById(Integerid){ returnstudentService.findStudentById(id); } /** *根据名字查询 *@paramname *@return */ @GetMapping("/findByName") publicList findByName(Stringname){ returnstudentService.findStudentByName(name); } /** *登录功能 *@paramsname *@paramspassword *@return */ @PostMapping("/login") publicStudentlogin(Stringsname,Stringspassword){ returnstudentService.findStudentByNameAndPassword(sname,spassword); } /** *添加信息 *@paramstudent *@return */ @PostMapping("/add") publicStudentsave(Studentstudent){ returnstudentService.save(student); } /** *删除信息 *@paramid *使用RESTful规范 */ @GetMapping("/delete/{id}") publicStringdeleteById(@PathVariableIntegerid){ studentService.deleteStudentById(id); return" 删除成功
"; } /** *更新信息 *@paramstudent *@return */ @PostMapping("/update") publicStudentupdate(Studentstudent){ returnstudentService.update(student); } /** *分页操作 * */ @GetMapping("/query") publicPagefindByPage(Integerpage,HttpServletResponsehttpServletResponse){ httpServletResponse.setHeader("Access-Control-Allow-Origin","*"); if(page==null||page<=0){ page=0; }else{ page=page-1; } returnstudentService.findAll(page,5); } }
在controller层中,我们对于各个功能的实现一定要明白使用Get方式还是Post方式进行操作,否则就会出现服务器内部错误等等。
三、注意
在项目的各个功能实现过程中,由于其中含有很多的同名方法和jar包,所以我们在编程过程中一定要注意用对jar包,不要因为导错jar包而给我们增加工作量
本文介绍了SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页如果想了解更多相关内容请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。