2019独角兽企业重金招聘Python工程师标准>>> hot3.png

什么是JPA

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA的宗旨是为POJO提供持久化标准规范,其持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。Hibernate是它的一种实现。除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实现而不必改动太多代码。

JPA——Hibernate

添加依赖

<!-- 添加mysql数据库驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 添加spring-data-jpa依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency> 

添加配置文件

091719_Qytt_3669094.png


spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username= root
spring.datasource.password= 123
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active = 20
spring.datasource.max-idle = 8
spring.datasource.min-idle = 8
spring.datasource.initial-size = 10#JPA Configuration:
spring.jpa.database=MYSQL
# Show or not log for each sql query
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
#spring.jpa.database=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

创建实体类

/*** 创建了一个实体类* @Entity 注解 进行持久化 当jpa检测到该注解时,会在数据库中生成相应的表结构信息  * @author Administrator**/
@Entity
public class Cat {/*** 使用@Id指定主键* @GeneratedValue(strategy=GenerationType.AUTO)指定主键的生成策略,mysql默认是自增长*/@Id@GeneratedValue(strategy=GenerationType.AUTO)private  int id;@Column(nullable=false,length=500)//指定数据库该字段非空,长度为500private String catName;private int catAge;get/set()...
}

创建jpa接口继承CrudRepository

public interface CatReposity extends CrudRepository<Cat, Integer>{}

创建service,并绑定事务

@Service
public class CatService {@Resourceprivate CatReposity catReposity;/*** save update delete 需要绑定事务 使用@Transactional进行事务的绑定* @param cat*/@Transactionalpublic void save(Cat cat){catReposity.save(cat);}@Transactionalpublic void delete(int id) {catReposity.delete(id);}public Iterable<Cat> getAll(){return catReposity.findAll();}
}

创建controller类

@RestController
@RequestMapping("/cat")
public class CatController {@Resourceprivate CatService catService;@RequestMapping("/save")public String save(){Cat cat = new Cat();cat.setCatName("小花");cat.setCatAge(2);catService.save(cat );return "save.ok";}@RequestMapping("/delete")public String delete(){catService.delete(1);return  "delete ok.";}@RequestMapping("/getAll")public Iterable<Cat> getAll(){return catService.getAll();}
}

启动服务,页面访问

JPA——Spring Data JPA

Spring data JPA提供了一个核心接口 Repository,它不提供任何方法,是一个空接口。

若我们定义的接口继承了repository,则该接口会被IOC容器识别为一个RepositoryBean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。实际上也可以通过@RepositoryDefinition注解来替代继承Repository接口。查询方法以find/read/get开头。涉及查询条件时,条件的属性同条件关键字连接,要注意的是条件属性首字母大写,使用@Query注解可以自定义JPQL语句实现更灵活的查询。

CrudRepository接口提供了最基本的对实体类的增删改查操作:

  • S save(S entity);   保存单个实体
  • Iterable<S> save(Iterable<S> entities);  保存集合
  • T findOne(ID id);  根据id查找实体
  • boolean exists(ID id);  根据id判断实体是否存在
  • Iterable<T> findAll();  查询所有实体,不用或慎用
  • Iterable<T> findAll(Iterable<ID> ids);   根据id集合查询实体集合
  • long count();   查询实体数量
  • void delete(ID id);   根据id删除实体
  • void delete(T entity);  直接删除一个实体
  • void delete(Iterable<? extends T> entities);删除实体集合
  • void deleteAll();    删除所有实体,不用或慎用

PagingAndSortingRepository接口:该接口提供了排序与分页的功能

  • Iterable<T> findAll(Sort sort);  排序
  • Page<T> findAll(Pageable pageable);  分页查询(含排序功能)

JpaRepository接口:查找所有实体,排序、查找所有实体 ,执行缓存与数据库同步

JpaSpecificationExecutor接口:不属于Repository体系,实现一组JPA Criteria查询相关的方法,封装JPA criteria查询条件,通常使用匿名内部类的方式来创建该接口的对象。

自定义Repository:可以自定义死一个MyRepository接口。

以上接口均可按照规则添加自己新加入的方法

public interface Cat2Repository extends Repository<Cat, Integer>{/*** 查询方法以find/read/get开头* 涉及查询条件时,条件的属性同条件关键字连接,要注意的是条件属性首字母大写*///根据catName查询public Cat findByCatName(String catName);/*** 如何编写JPQL语句* JPQL语句与HQL语句类似*/@Query("from Cat where catName=:name")public Cat findByJpql(@Param("name")String catName);
}

JPA——jdbcTemplate

添加依赖

<!-- 添加spring-data-jdbc依赖 如果已经 加入jpa依赖该依赖则不用再次添加--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> 

编写dao

/***@Repository 使用该注解是表明是一个持久化 * @author Administrator**/
@Repository
public class CatDao {/*** 定义一个sql* 定义一个RowMapper* 执行查询方法*/@Resourceprivate JdbcTemplate jdbcTemplate;public Cat selectByCatName(String catName) {String sql = "select * from cat where cat_name = ?";RowMapper<Cat> rowMapper = new BeanPropertyRowMapper<>(Cat.class);Cat cat=jdbcTemplate.queryForObject(sql, new Object[]{catName},rowMapper );return cat;}
}
//service编写@Service
public class CatService {@Resourceprivate CatDao catDao;public Cat selectByCatName(String catName) {return  catDao.selectByCatName(catName);}
}
//controller编写
@RequestMapping("/selectByCatName")public Cat selectByCatName(String catName) {return catService.selectByCatName(catName);}

全局异常捕捉

/*** 新建一个类并注解@ControllerAdvice* 在方法上注解@ExceptionHandler(value=Exception.class)* 添加一个方法,并在上面添加@ExceptionHandler(value=Exception.class)拦截相应的异常信息* 若果放回的是view,方法的返回值是ModelAndView* 若返回的是String或者json,需要在方法上添加注解@ResponseBody* @author Administrator**/
@ControllerAdvice
public class GlobalDefaultExceptionHandler {@ResponseBody@ExceptionHandler(value=Exception.class)public String defaultExceptionHandler(HttpServletRequest request,Exception e) {return "服务器异常,请稍后再试!sorry";}
}

SpringBoot使用theymeleaf

添加依赖

<!-- 添加thymeleaf依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf    </artifactId></dependency>

关闭thymeleaf缓存

########################################################
###THYMELEAF (ThymeleafAutoConfiguration)
########################################################
#spring.thymeleaf.prefix=classpath:/templates/
#spring.thymeleaf.suffix=.html
#spring.thymeleaf.mode=HTML5
#spring.thymeleaf.encoding=UTF-8
# ;charset=<encoding> is added
#spring.thymeleaf.content-type=text/html
# set to false for hot refresh  spring.thymeleaf.cache=false  

创建html

194343_B7l0_3669094.png

<body><h1>hello, thymeleaf !<br /> This is my first thymeleaf demo !<hr />welcome  <span th:text="${name}"></span> </h1>
</body>

编写controller

/*** 在Thymeleaf 模板文件中 3.0之前是要求标签必须闭合的* @author Administrator**/
@Controller
@RequestMapping("/templates")
public class TemplatesController {/*** 映射地址是:/templates/hello* @return*/@RequestMapping("/hello")public String hello(Map<String, Object> map){map.put("name", "zhangsan");//返回的黑丝ModelAndViewreturn "hello";}
}

页面测试

SpringBoot使用freemarker

添加依赖

<!-- 添加freemarker依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>

关闭freemarker缓存

########################################################
###freemarker
########################################################
spring.freemarker.allow-request-override=false
spring.freemarker.cache=false
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
#spring.freemarker.prefix=
#spring.freemarker.request-context-attribute=
#spring.freemarker.settings.*=
#spring.freemarker.suffix=.ftl
#spring.freemarker.template-loader-path=classpath:/templates/
#comma-separated list
#spring.freemarker.view-names= # whitelist of view names that can be resolved

编写模板文件 .ftl

200855_iYfk_3669094.png

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Insert title here</title>
</head>
<body>hello , freemarker !hello , ${name} !
</body>
</html>

TemplatesController添加方法

 @RequestMapping("/helloFtl")public String helloHtl(Map<String, Object> map){map.put("name", "lisi");return "helloFtl";}

页面测试

SpringBoot添加jsp支持

创建Maven Web project

在pom.xml中添加依赖

<!-- Spring父节点依赖,引入后相关的依赖不再需要添加版本信息,spring boot会选择合适的依赖版本 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.1.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 指定jdk版本 1.7 默认1.6 --><java.version>1.7</java.version></properties><dependencies><!-- springboot启动依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope></dependency><!-- jstl标签库 --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId></dependency><!-- tomca支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope></dependency></dependencies>

配置application.properties支持jsp

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

编写controller


@Controller
public class HelloController {@RequestMapping("/index")public String hello(){return "index";}@RequestMapping("/index2")public String hello2(Map<String, Object> map){map.put("name","张三");return "index2";}
}

编写jsp页面

<body><h2>hello ,jsp page !</h2>
</body><body><h2>hello , ${name}!</h2>
</body>

编写启动类App.java

@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}

启动项目,页面测试

SpringBoot集成Mybatis

创建maven project

在pom.xml中添加依赖

<!-- Spring父节点依赖,引入后相关的依赖不再需要添加版本信息,spring boot会选择合适的依赖版本 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.1.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 指定jdk版本 1.7 默认1.6 --><java.version>1.7</java.version></properties><dependencies><!-- springboot启动依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 添加mysql数据库驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--springboot mybatis 依赖 不要使用1.0.0版本,因为还不支持拦截器插件 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency><!-- mybatis的分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.0</version></dependency></dependencies>

创建启动类  注意@MapperScan("com.px.*")注解添加

/*** springboot启动类*/
@SpringBootApplication
@MapperScan("com.px.*")//扫描该包下相应的mybatis持久化类
public class App{public static void main(String[] args) {SpringApplication.run(App.class, args);}}

编写实体类

public class Student {private long id;private String name;
set/get方法。。。
}

编写Mapper  注解@select @Insert @Options

public interface StudentMapper {/*** #{name}参数占位符* @param name* @return*/@Select("select * from Student where name = #{name}")public List<Student> likeName (String name);@Select("select * from Student where id = #{id}")public Student getById(long id);@Select("select name from Student where id = #{id}")public String getNameById(long id);@Insert("insert into Student (name) values( #{name})")@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id") //返回自增主键public void save(Student student );
}

编写Service

@Service
public class StudentService {@Autowiredprivate StudentMapper studentMapper;public  List<Student> likeName(String name){return studentMapper.likeName(name);}@Transactionalpublic void save(Student student ){studentMapper.save(student);};
}

编写Controller

@RestController
public class StudentController {@Autowiredprivate StudentService studentService;@RequestMapping("/studentName")public List<Student> likeName(String name){PageHelper.startPage(1, 2);return studentService.likeName(name);}@RequestMapping("/save")public Student save(){Student student = new Student();student.setName("zhangsan");studentService.save(student);return student;}
}

加入pageHelper配置

@Configuration
public class MyBatisConfiguration {@Beanpublic PageHelper pageHelper() {PageHelper pageHelper = new PageHelper();Properties p = new Properties();p.setProperty("offsetAsPageNum", "true");p.setProperty("rowBoundsWithCount", "true");p.setProperty("reasonable", "true");pageHelper.setProperties(p);return pageHelper;}
}

页面测试

转载于:https://my.oschina.net/px828261/blog/1604070

SpringBoot(二)——JPA相关推荐

  1. (二)SpringBoot 整合 JPA

    一.JPA简介 JPA(java persistence api)并不是一个框架,而是一组规范.Hibernate.TopLink.OpenJPA都实现了JPA规范,不过Hinernate最成功).所 ...

  2. 带你搭一个SpringBoot+SpringData JPA的环境

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...

  3. Java项目:考试管理系统(java+Springboot+Maven+Jpa+Vue+Mysql)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统功能包括: 支持单选题.多选题.判断题支持学生(student).教师(teacher).管理员(admin)三种角色学 ...

  4. spring-boot(二)

    学习文章来自:http://www.ityouknow.com/spring-boot.html web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters. ...

  5. 基于vue2+element+springboot+mybatis+jpa+mysql的学籍管理系统

    目录 整套系统源码下载 一.开发背景 二.用到的技术 三.开发使用的IDE 四.搭建开发环境 五.启动项目 六.学籍管理系统使用说明 七.结语 八.源码下载 基于vue2+element+spring ...

  6. SpringBoot 中JPA集成PostgreSql(详细步骤)避坑!

    SpringBoot 中JPA集成PostgreSql(详细步骤) 什么是JPA?(Java Persistence API) Spring Data JPA, part of the larger ...

  7. 基于vue2+element+springboot+mybatis+jpa+mysql的幼儿园幼儿信息管理系统

    目录 整套系统源码下载 一.开发背景 二.用到的技术 三.开发使用的IDE 四.搭建开发环境 五.启动项目 六.幼儿园幼儿信息管理系统使用说明 七.结语 八.整套系统源码下载 整套系统源码下载 基于v ...

  8. SpringBoot实现JPA的save操作

      在一次参与公司的技术讨论会上,一位同事在演示SpringBoot的JPA的操作时,发现SpringBoot的JPA的save操作时,发现会先有select再insert,然后老板说,我们在网关已经 ...

  9. 基于vue2+element+springboot+mybatis+jpa+mysql的小区物业管理系统

    目录 一.开发背景 二.用到的技术 三.开发使用的IDE 四.搭建开发环境 五.启动项目 六.物业管理系统使用说明 七.结语 八.整套项目源码下载 一.开发背景 本系统作为vue2初学者的入门系统,通 ...

  10. 【SpringBoot Data JPA】多表关联查询

    SpringBoot Data JPA 多表关联查询 前言 一.数据库架构设计 1.1 数据表结构 2.2 建立数据库表: 二.SpringBoot整合JPA多表查询 2.1 环境配置 2.2 建立数 ...

最新文章

  1. Win7 任务栏影藏、显示速度提升
  2. 网站发布问题及使用Web Deployment Projects
  3. Docker Compose安装Registry后配置WebUI与客户端
  4. Nginx的http块自定义服务日志
  5. 火狐浏览器所有的快捷键
  6. 用provide/inject来实现简单的vuex状态管理功能
  7. python有多少种语法_这20个常规Python语法你都搞明白了吗?
  8. PhoneClean(iOS设备清理)下载安装,软件介绍
  9. 美团云、苏宁云相继停止运营,公有云市场大洗牌
  10. ESP8285 sdkconfig
  11. java文档生成器_最好用的数据库文档生成工具
  12. MCAL配置-Cdd_Ipc
  13. SU-03T语音模块的使用(小智语音控制LED灯)
  14. android 11.0 12.0添加系统字体并且设置为默认字体
  15. INS-06101 IP adress of localhost could not be determined
  16. 广告投放相关专业名词整理
  17. 【iOS底层】11:消息转发
  18. Mysql入门技能树-使用数据库
  19. phonegap打包
  20. 小i机器人发布新一代智能Bot开放平台:让AI唾手可得

热门文章

  1. SAP MM 启用了Advanced Return Management之后采购订单上的一些变化
  2. SAP RETAIL 参考PO创建分配表之二
  3. 强化学习在机器人装配工艺中的应用
  4. 为了读懂你,AI究竟有多努力?
  5. 令AI费解的图像层出不穷 计算机视觉远未达到完美
  6. SAP HU上面的'Obj.to Which HU Belongs'栏位初探
  7. 论文荐读 | NLP之Attention从入门到精通
  8. 哪些特征对我的机器学习模型影响最大?
  9. 深度好文丨区块链将彻底改变人工智能
  10. Pytorch中用于深度学习常见的激活函数