JPA基础查询--开篇

前言

正式开始系统地学习一下Hibernate/JPA框架,持续更新中。
今天讲解JPA的基本查询入门。

理解关系图

先上图理清一下JPA查询这一块的几个概念。
JPA

绑定参数

所谓的绑定参数法,就是条件查询。

参数绑定法的优点

防止SQL注入攻击
通常,我们在编写一个条件查询时,常用的代码设计如下:

String searchString = "itemName"; (某个String类型的变量)
Query query =em.createQuery("select i from Item i where i.name = '"+ searchString +"'");

那么问题来了。
这种情况下如果用户输入一个未期望或不想要的数据库上执行代码,会造成不必要的错误。

分类

  1. 命名参数法
  2. 定位参数法

命名参数

代码设计

    /*
     * 参数绑定查询: 目的:防止SQL注入攻击 例如常用的: 
     * String searchString = getValueEnteredByItem(); 
     * Query query =em.createQuery("select i from Item i where i.name = '"+ searchString +"'");
     *
     * 命名参数法
     * 
     */
    public void bindlingQuery() {
        // 其中itemName表示命名参数,再使用setPerameter()方法将itemName赋值即可
        Query query = em.createQuery("select i from Item i where i.name = :itemName").setParameter("itemName", "PHP");

        Item result = (Item) query.getSingleResult();// 强制类型转换

        System.out.println("打印Item的Code:   " + result.getCode() + "打印Item的Status:   " + result.getStatus());
    }

解析

1.设定命名参数

在这里,后面跟着一个参数名称的冒号表示一个命名参数,这里是itemName;

2.给命名参数赋值

将一个值绑定到命名参数itemName,注意类型统一。

类型安全的参数绑定

代码设计
/**
     * 使用ParameterExpression类型安全的查询.
     * 
     * 优点:不必绑定占位符,并且参数的绑定是类型安全的
     * 
     */
    public void parameterExpressionQuery() {
        CriteriaBuilder criterabuilder = em.getCriteriaBuilder();
        // Object.class作为参数,不同于Query语句查询
        CriteriaQuery<Item> criteria = criterabuilder.createQuery(Item.class);
        Root<Item> i = criteria.from(Item.class);

        // 类型安全设定
        ParameterExpression<Integer> itemNameParameter = criterabuilder.parameter(Integer.class);

        Query query = em.createQuery(criteria.select(i).where(criterabuilder.equal(i.get("id"), itemNameParameter)))
                .setParameter(itemNameParameter, 1);

        Item result = (Item) query.getSingleResult();

        System.out.println("ParameterExpression打印id为1的Name:   " + result.getName());
    }

定位参数

代码设计

Query query = em.createQuery("select i from Item i where i.name like ?1 and i.auctionEnd> ?2");
query.setParameter(1, "PHP");

源代码

本部分的源码请前往Github上自行获取:https://github.com/GaoZiqiang/labManagement/blob/master/src/main/java/cn/edu/sdut/softlab/controller/HibernatePractice.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值