前言
正式开始系统地学习一下Hibernate/JPA框架,持续更新中。
今天讲解JPA的基本查询入门。
理解关系图
先上图理清一下JPA查询这一块的几个概念。
绑定参数
所谓的绑定参数法,就是条件查询。
参数绑定法的优点
防止SQL注入攻击:
通常,我们在编写一个条件查询时,常用的代码设计如下:
String searchString = "itemName"; (某个String类型的变量)
Query query =em.createQuery("select i from Item i where i.name = '"+ searchString +"'");
那么问题来了。
这种情况下如果用户输入一个未期望或不想要的数据库上执行代码,会造成不必要的错误。
分类
- 命名参数法
- 定位参数法
命名参数
代码设计
/*
* 参数绑定查询: 目的:防止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