博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot-5-整合jpa
阅读量:6148 次
发布时间:2019-06-21

本文共 6596 字,大约阅读时间需要 21 分钟。

##########springboot-parent.version: 1.5.2## jdk 1.8## #######

 

在整合jpa之前, 先说下mysql

步骤: 

  1), 在application.properties中加入datasource配置

  2), 在pom.xml中加入mysql依赖

  3), 获取datasource的connection测试

 

 

然后, 配置连接池为druid

  1), pom.xml中引入依赖    

com.alibaba
druid
1.0.18

  2), 配置application.properties数据源类型

  3), 编写druid servlet和filter提供监控页面访问

 

 

jpa, 是一种规范, hibernate是他的一种实现方式

jpa是一种关于数据操作的 orm 对象/关系映射规范

 

1, 引入依赖

org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java

 

2, 在src/main/source创建配置文件

application.yml

##### jpa #######spring:   datasource:     url: jdbc:mysql://localhost:3306/test    username: root    password: 123    driver-class-name: com.mysql.jdbc.Driver  jpa:    database: MYSQL    show-sql: true    hibernate:      ddl-auto: update#      naming:#        implicit-strategy: org.hibernate.cfg.ImprovedNamingStrategy    properties:   # 默认      hibernate:         dialect: org.hibernate.dialect.MySQL5Dialect

 

3, 在实体类上加入@Entity, 就可以进行crud操作了

package com.iwhere.test.demo;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import javax.validation.constraints.NotNull; // 生成表结构@Entity // 表名, 不写默认为类名@Table(name="demo")public class Demo {
  // 主键 @Id   // 主键生成策略 @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; @NotNull private String name; @Column(nullable=false) private String sex; public Integer getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public void setId(Integer id) { this.id = id; } }

4, dao层继承接口即可

package com.iwhere.test.dao;import org.springframework.data.repository.CrudRepository;import com.iwhere.test.demo.Demo;/** * 使用crud接口的dao层 * @author 231 * */public interface DemoRepository extends CrudRepository
{}

5, service层调用

package com.iwhere.test.service;import javax.annotation.Resource;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.iwhere.test.dao.DemoRepository;import com.iwhere.test.demo.Demo;/** * service层 * @author 231 */@Servicepublic class DemoService {    @Resource    private DemoRepository demoRepository;        @Transactional    public void save(Demo demo)     {        demoRepository.save(demo);    }    }

6, controller层执行

package com.iwhere.test.web;import javax.annotation.Resource;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.iwhere.test.demo.Demo;import com.iwhere.test.service.DemoService;@RestController@RequestMapping("/demo")public class DemoController {    @Resource    private DemoService demoService;        /**     * 返回json格式数据     * @RestController     * @return     */    @RequestMapping("/getDemo")    public Demo getDemo() {        Demo demo = new Demo();        demo.setId(1);        demo.setName("Angel");        return demo;    }        /**     * 测试jpa的使用     * @return     */    @RequestMapping("/save")    public String saveDemo() {        Demo demo = new Demo();        demo.setId(1);        demo.setName("Angel");        demo.setSex("female");        demoService.save(demo);        return "ok";    }      /**测试自定义异常*///    @RequestMapping("/zeroExcetpion")//    public int zeroException() {//        System.err.println("zero");//        return 1/0;//    }}

此时运行, 既可以在数据库看到demo的存入了

 

 

然后,  介绍下repository接口: 

1, 空接口, 标记2, 继承Repository接口后, 会被IOC容器识别为一个bean3, 也可用@RepositoryDefinition注解来代替继承4, 方法名即sql语句5, 条件树形要用关键字链接6, 可以使用@Query实现自定义jpql语句

jpa操作为接口操作, 一个方法既一个sql语句, 常见的接口如下表:

具体的关键字,使用方法和生产成SQL如下表所示: 原文地址: http://www.cnblogs.com/ityouknow/p/5891443.html

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

 

分页查询

分页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable

,当查询中有多个参数的时候Pageable建议做为最后一个参数传入

Page
findALL(Pageable pageable); Page
findByUserName(String userName,Pageable pageable);

 

Pageable 是spring封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则

@Testpublic void testPageQuery() throws Exception {    int page=1,size=10;    Sort sort = new Sort(Direction.DESC, "id");    Pageable pageable = new PageRequest(page, size, sort);    userRepository.findALL(pageable);    userRepository.findByUserName("testName", pageable);}

 

 

 

 

 

 

 

 

你可能感兴趣的文章
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
Android源码学习之观察者模式应用
查看>>
416. Partition Equal Subset Sum
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
[TC13761]Mutalisk
查看>>