极简Querydsl入门

1 数据库准备

使用MySQL数据库。

1.1 创建名为learnsql的数据库

建库语句

create datebase learnsql;

使用刚刚创建的learnsql数据库

use learnsql;
1.2 建表

数据表使用常用的职员信息表,分别为:

  • 部门表:dept
  • 职员表: emp
  • 薪水等级表: salgrade
1.2.1 创建部门表
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(10) NOT NULL,
  `dname` varchar(14) DEFAULT NULL,
  `loc` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `dept` WRITE;
INSERT INTO `dept` VALUES (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCHING','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');
UNLOCK TABLES;
1.2.2 创建职员表
DROP TABLE IF EXISTS `emp`;

CREATE TABLE `emp` (
  `empno` int(4) NOT NULL,
  `ename` varchar(10) DEFAULT NULL,
  `job` varchar(9) DEFAULT NULL,
  `mgr` int(4) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `sal` double(7,2) DEFAULT NULL,
  `comm` double(7,2) DEFAULT NULL,
  `deptno` int(2) DEFAULT NULL,
  PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `emp` WRITE;
INSERT INTO `emp` VALUES (7369,'SIMITH','CLERK',7902,'1980-12-17',800.00,NULL,20),(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600.00,300.00,30),(7521,'WARD','SALESMAN',7698,'1981-02-22',1250.00,500.00,30),(7566,'JONES','MANAGER',7839,'1981-04-02',2975.00,NULL,20),(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250.00,1400.00,30),(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850.00,NULL,30),(7782,'CLARK','MANAGER',7839,'1981-06-09',2450.00,NULL,10),(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000.00,NULL,20),(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000.00,NULL,10),(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500.00,NULL,30),(7876,'ADAMS','CLERK',7788,'1987-05-23',1100.00,NULL,20),(7900,'JAMES','CLERK',7698,'1981-12-03',950.00,NULL,30),(7902,'FORD','ANALYST',7566,'1981-12-03',3000.00,NULL,20),(7934,'MILLER','CLERK',7782,'1982-01-23',1300.00,NULL,10);
UNLOCK TABLES;
1.2.3 创建薪水等级表
DROP TABLE IF EXISTS `salgrade`;

CREATE TABLE `salgrade` (
  `grade` int(11) DEFAULT NULL,
  `losal` int(11) DEFAULT NULL,
  `hisal` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `salgrade` WRITE;
INSERT INTO `salgrade` VALUES (1,700,1200),(2,1201,1400),(3,1401,2000),(4,2001,3000),(5,3001,5000);
UNLOCK TABLES;

2 编写Java代码

2.1 配置文件
#数据源地址
spring.datasource.url=jdbc:mysql://localhost:3306/learnsql?characterEncoding=utf8
#用户名
spring.datasource.username=root
#密码
spring.datasource.password=123456

spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto=update
#端口
server.port=8089
2.2 创建实体

首先创建与数据表对应的实体。

2.2.1 部门表实体
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name="dept")
public @Data class Dept {
    
    @Id
    @Column(name="deptno")
    private Long deptno;
    
    @Column(name="dname")
    private String dname;
    
    @Column(name="loc")
    private String loc;
}
2.2.2 职员表实体
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 lombok.Data;

@Entity
@Table(name="emp")
public @Data class Emp {
    @Id
    @Column(name="empno")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long empno;
    
    @Column(name="ename")
    private String ename;
    
    @Column(name="job")
    private String job;
    
    @Column(name="mgr")
    private String mgr;
    
    @Column(name="hiredate")
    private Date hireDate;
    
    @Column(name="sal")
    private Double sal;
    
    @Column(name="comm")
    private Double comm;
    
    @Column(name="deptno")
    private Long deptno;
}
2.2.3 薪水等级表实体
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="salgrade")
public class SalGrade {

    @Id
    @Column(name="grade")
    private Long grade;
    
    @Column(name="losal")
    private Long losal;
    
    @Column(name="hisal")
    private Long hisal;
}
2.3 创建repository

要使用Querydsl在创建repository时,一定要继承QueryDslPredicateExecutor接口。

2.3.1 部门表对应的repository
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;

import com.cha.querydsl.entity.Dept;

public interface DeptRepository extends JpaRepository<Dept, Long>, QueryDslPredicateExecutor<Dept>{

}
2.3.2 职员表对应的repository
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;

import com.cha.querydsl.entity.Emp;

public interface EmpRepository extends JpaRepository<Emp, Long>,QueryDslPredicateExecutor<Emp>{

}
2.3.3 薪水等级表对应的repository
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;

import com.cha.querydsl.entity.SalGrade;

public interface SalGradeRepository extends JpaRepository<SalGrade, Long>, QueryDslPredicateExecutor<SalGrade>{

}
2.4 创建service
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Service;

import com.cha.querydsl.entity.Emp;
import com.cha.querydsl.repository.DeptRepository;
import com.cha.querydsl.repository.EmpRepository;
import com.cha.querydsl.repository.SalGradeRepository;
import com.cha.querydsl.entity.QEmp;
import com.querydsl.core.types.Predicate;
import com.querydsl.jpa.impl.JPAQueryFactory;

@Service
public class DESService {
    @Autowired
    private DeptRepository deptRepository;
    
    @Autowired
    private EmpRepository empRepository;
    
    @Autowired
    private SalGradeRepository salGradeRepository;
    
    @PersistenceContext
    private EntityManager entityManager;
    
    private JPAQueryFactory queryFactory;
    
    @PostConstruct
    public void init() {
        queryFactory = new JPAQueryFactory(entityManager);
    }
    
    public Emp findEmp(String userName) {
        QEmp qEmp = QEmp.emp;
        //这一句是核心
        return queryFactory.selectFrom(qEmp).where(qEmp.ename.eq(userName)).fetchOne();
    }
}
2.5 创建controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cha.querydsl.entity.Emp;
import com.cha.querydsl.service.DESService;

@RestController
@RequestMapping("/index")
public class DESController {
    
    @Autowired
    private DESService service;
    
    @RequestMapping("/sal")
    public Emp findEmp() {
        String userName = "KING";
        Emp emp = service.findEmp(userName);
        return emp;
    }
}
2.6 在浏览器调用接口

在浏览器中输入

http://localhost:8089/index/sal

浏览器显示如下图


querydsl.PNG
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,938评论 2 89
  • 薄雨轻风秋渐凉 贪黑起早打工忙 红果熟了枝头挂 没有时间去品尝 夜里多少思乡事 无人来讲自收藏 直到雪花飘飘落 背...
    沧海桑田_bc60阅读 351评论 1 3
  • 且以真伪衡人品,不以成败论英雄
    MisDora阅读 202评论 0 0