文档章节

Querydsl:Java查询框架

YuanyuanL
 YuanyuanL
发布于 2017/01/23 14:50
字数 1203
阅读 524
收藏 0

参考文章:http://xiexiejiao.cn/java/querydsl-1-9-5-release-download.html

Querydsl 4.1.0 API:http://www.querydsl.com/static/querydsl/4.1.0/reference/html_single/

Querydsl是什么?

与Hibernate等ORM工具不同的是: 1.Querydsl仅仅是一个通用的查询框架;

2.只专注于通过Java API构建类型安全的SQL查询。

3.Querydsl可以通过一组通用的查询api为用户构建出适合不同类型ORM框架或者是SQL的查询语句。也就是说 Querydsl是基于各种ORM框架以及SQL至上的一个通用的查询框架。

4.借助Querydsl可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前Querydsl支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。

注意:ORM框架是什么?待回答。

Querydsl的优势

  1. Querydsl支持代码自动完成(因为用纯Java API编写查询,因此主流Java IDE对它的代码自动完成功能支持几乎可以发挥到极致) ;
  2. Querydsl几乎可以避免所有的SQL语法错误(当然用错了Querydsl API除外,因为不直接写SQL了所以不会出现语法错误);
  3. Querydsl采用Domain类型的对象和属性来构建查询,因此查询绝对是类型安全的,不会因为条件类型而出现问题;
  4. Querydsl采用纯Java API作为SQL构建的实现可以让代码重构发挥到另一个高度(这也是Criteria让笔者十分喜爱的主要原因之一);
  5. Querydsl的另一个优势就是可以更轻松的进行增量查询的定义;

应用开发调试过程中Querydsl生成的sql语句的查看和性能检测 1.可以通过在配置文件中配置JPA是否ShowSQL(如Spring是ApplicationContext),在程序运行过程中,可以查看生成的具体SQL语句, 但语句不带参数。

@Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactory()
   {
       HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
       jpaVendorAdapter.setDatabase(Database.valueOf(env.getProperty("jpa.database")));
       jpaVendorAdapter.setGenerateDdl(env.getProperty("jpa.generateDdl", Boolean.class));
       jpaVendorAdapter.setShowSql(env.getProperty("jpa.showSql", Boolean.class));
       
       LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
       emf.setJpaVendorAdapter(jpaVendorAdapter);
       emf.setDataSource(dataSource());
       
       return emf;
   }

2.通过配置log4jdbc,在程序运行过程中,可以查看生成的sql(带参数),以及sql执行所使用的时间。 如:postgresql数据库需要:postgresql的驱动jar包,log4jdbc.jar 在log4j.properties中配置:

# Log4Jdbc
log4j.logger.jdbc.sqlonly=ERROR, stdout
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=ERROR, stdout
log4j.logger.jdbc.resultset=ERROR, stdout
log4j.logger.jdbc.connection=ERROR, stdout

示例:

package com.lyy.project.entity;

import java.io.Serializable;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;
/**
 * The persistent class for the "user_info" database table.
 */
@Entity
@Table(name="user_info")
@NamedQuery(name="UserInfo.findAll", query="SELECT u FROM UserInfo u")
public class UserInfo implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id")
	private long id;

	@Column(name="create_time", insertable=false, updatable=false, 
			columnDefinition="timestamp without time zone DEFAULT now()")
	private Timestamp createTime;

        @Column(name="username")
	private String username;

	@Column(name="password")
	private String password;

	@Column(name="role", insertable=false)//, columnDefinition="integer default '0'"
	private int role;

	@GeneratedValue(strategy=GenerationType.TABLE)
	@Column(name="status", insertable=false)//, columnDefinition="integer default '0'"
	private int status;
	
	@OneToOne(mappedBy="userInfo",fetch=FetchType.LAZY, 
			cascade={CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
	private UserThreshold userThreshold;	
	
	public UserInfo() 
	{
		//define default value
		role = 0;
		status = 0;	
	}
	
	public long getId() {
		return this.id;
	}
	public void setId(long id) {
		this.id = id;
	}


	public Timestamp getCreateTime() {
		return this.createTime;
	}
	public void setCreateTime(Timestamp createTime) {
		this.createTime = createTime;
	}

        public String getUsername() {
		return this.username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	
	public String getPassword() {
		return this.password;
	}
	public void setPassword(String password) {
		this.password = password;
	}


	public int getRole() {
		return this.role;
	}
	public void setRole(int role) {
		this.role = role;
	}

	public int getStatus() {
		return this.status;
	}
	public void setStatus(int status) {
		this.status = status;
	}

	
	public List<DataGuard> getDgDataguards() {
		return this.dgDataguards;
	}
	public void setDgDataguards(List<DataGuard> dgDataguards) {
		this.dgDataguards = dgDataguards;
	}

	public UserThreshold getUserThreshold() {
		return userThreshold;
	}
	public void setUserThreshold(UserThreshold userThreshold) {
		this.userThreshold = userThreshold;
	}
}


package com.lyy.project.entity.q;

import static com.querydsl.core.types.PathMetadataFactory.*;
import com.lyy.project.entity.UserInfo;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.PathInits;
/**
 * QUserInfo is a Querydsl query type for UserInfo
 */
@Generated("com.querydsl.codegen.EntitySerializer")
public class QUserInfo extends EntityPathBase<UserInfo> {

    private static final long serialVersionUID = 1239090079L;

    private static final PathInits INITS = PathInits.DIRECT2;

    public static final QUserInfo userInfo = new QUserInfo("userInfo");

    public final DateTimePath<java.sql.Timestamp> createTime = createDateTime("createTime", java.sql.Timestamp.class);

    public final NumberPath<Long> id = createNumber("id", Long.class);
    
    public final StringPath username = createString("username");

    public final StringPath password = createString("password");

    public final NumberPath<Integer> role = createNumber("role", Integer.class);

    public final NumberPath<Integer> status = createNumber("status", Integer.class);

    public final QUserThreshold userThreshold;
   
    public QUserInfo(String variable) {
        this(UserInfo.class, forVariable(variable), INITS);
    }

    public QUserInfo(Path<? extends UserInfo> path) {
        this(path.getType(), path.getMetadata(), path.getMetadata().isRoot() ? INITS : PathInits.DEFAULT);
    }

    public QUserInfo(PathMetadata metadata) {
        this(metadata, metadata.isRoot() ? INITS : PathInits.DEFAULT);
    }

    public QUserInfo(PathMetadata metadata, PathInits inits) {
        this(UserInfo.class, metadata, inits);
    }

    public QUserInfo(Class<? extends UserInfo> type, PathMetadata metadata, PathInits inits) {
        super(type, metadata, inits);
        this.userThreshold = inits.isInitialized("userThreshold") ? new QUserThreshold(forProperty("userThreshold"), inits.get("userThreshold")) : null;
    }

}

package com.lyy.project.dao;

import java.util.List;
import com.lyy.project.entity.UserInfo;
public interface UserInfoDAO
{
    UserInfo getUserInfoByName(String username);
	void addUserInfo(UserInfo user);	
	void removeUserInfo(UserInfo user);
	UserInfo getUserInfoByID(long userID);
	List<UserInfo> getAllUsers();
}



package com.lyy.project.dao.Impl;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import com.lyy.project.dao.UserInfoDAO;
import com.lyy.project.entity.UserInfo;
import com.lyy.project.entity.q.QUserInfo;
import com.querydsl.jpa.impl.JPAQuery;
@Repository
public class UserInfoDAOImpl implements UserInfoDAO
{
    private final Logger logger = LoggerFactory.getLogger(getClass());
    
    @PersistenceContext
    private EntityManager em;
    
    @Override
    public UserInfo getUserInfoByName(String username)
    {
        logger.debug("Enter, username = " + username);
        
        QUserInfo ui = QUserInfo.userInfo;
        JPAQuery<UserInfo> query = new JPAQuery<>(em);        
        query.from(ui).where(ui.username.eq(username));
        UserInfo user = query.fetch().get(0);//with threshold
        
        logger.debug("return");
        return user;
    }
    
    @Override
    public UserInfo getUserInfoByID(long userID)
    {
        logger.debug("Enter, userid = " + userID);
        
        QUserInfo ui = QUserInfo.userInfo;
        JPAQuery<UserInfo> query = new JPAQuery<>(em);        
        query.from(ui).where(ui.id.eq(userID));//注意,查询中引用的字段是QUserInfo中定义的public类型字段。
        UserInfo user = query.fetch().get(0);//with threshold
        
        logger.debug("return");
        return user;
    }
    
    @Override
    public void addUserInfo(UserInfo user)
    {
    	logger.debug("Enter:username="+user.getUsername());    	
		
    	em.persist(user);
    	
    	logger.debug("Return:userid="+user.getId());
    }
    
    @Override
    public void removeUserInfo(UserInfo user)
   {
		logger.debug("Enter:username=" + user.getUsername());		
		try 
		{
			em.remove(em.merge(user));
		} catch (Exception re) 
		{
			logger.error(re.getMessage());
		}
		
		logger.debug("Return");
	}
    
    
    @Override
    public  List<UserInfo> getAllUsers()
    {
        logger.debug("Enter");
        
        QUserInfo ui = QUserInfo.userInfo;
        JPAQuery<UserInfo> query = new JPAQuery<>(em);        
        query.from(ui);
        List<UserInfo> users = query.fetch();//with threshold
        
        logger.debug("return:size="+users.size());
        return users;
    }
    
}


© 著作权归作者所有

共有 人打赏支持
YuanyuanL

YuanyuanL

粉丝 153
博文 325
码字总数 190992
作品 0
济南
部门经理
私信 提问
加载中

评论(2)

YuanyuanL
YuanyuanL

引用来自“李嘉图”的评论

属于java持久层中的dsl类型,个人感觉也是一个非常优秀的方案,比写xml更简单,方便,类型安全更不易出错
😊
李嘉图
李嘉图
属于java持久层中的dsl类型,个人感觉也是一个非常优秀的方案,比写xml更简单,方便,类型安全更不易出错
Querydsl 3.4.2 更新,SQL 查询构建工具

Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句。它采用API代替拼凑字符串来构造查询语句。可跟 Hibernate 和 JPA 等框架结合使用。 github: https://github.com/querydsl/quer...

稻草鸟人
2014/08/17
3.3K
5
kotlin使用spring data jpa(三)

使用QueryDSL集成查询 QueryDSL是什么? QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。 Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架...

weidedong
2018/11/01
0
0
非spring框架下使用querydsl

Querydsl是一个采用API代替拼凑字符串来构造查询语句,可跟 Hibernate 和 JPA 等框架结合使用。网上很多教程都是结合spring JPA框架下使用的教程,本文介绍的是非spring环境下querydsl JPA整...

penngo
01/07
0
0
jOOQ 项目存在的原因

Featured article by oschina reproduced with permission by Data Geekery GmbH. English content copyright © 2013 by Data Geekery GmbH. 以下段落摘自 jOOQ用户手册的前言部分。值得思考......

oschina
2013/02/22
8.3K
14
Querydsl 1.9.5 发布,SQL查询构建

Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句。它采用API代替拼凑字符串来构造查询语句。可跟 Hibernate 和 JPA 等框架结合使用。 该版本改进了 Bean 的生成以及外键的处理问题...

红薯
2010/09/06
384
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 世界的源代码

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小鱼丁 :#今日歌曲推荐# 分享Jason Mraz的单曲《Prettiest Friend (Demo)》: 《Prettiest Friend (Demo)》- Jason Mraz 手机党少年们想听歌...

小小编辑
3分钟前
0
0
java框架学习日志-13(Mybatis基本概念和简单的例子)

在mybatis初次学习Mybatis的时候,遇到了很多问题,虽然阿里云的视频有教学,但是视频教学所使用的软件和我自己使用的软件不用,我自己用的数据库是oracle数据库,开发环境是idea。而且视频中...

白话
今天
4
0
Java基础:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: /** The value is used for character storage. */private final cha...

watermelon11
今天
3
0
mogodb服务

部署MongoDB 官网: https://www.mongodb.com/download-center/community 创建mongo数据目录 mkdir /data/mongodb 二进制部署 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x8......

以谁为师
昨天
5
0
大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞。在敦促每位用户尽快升级系统的同时,Debian团队还发布了Debian ...

linux-tao
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部