一、命名查询

HQL语句混杂在代码之间将破坏代码的可读性

Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询

二、建立数据表和持久化类

建立数据表

create table login
(
username varchar2(32) primary key,
password varchar2(32) not null ,
age number(3)
); insert into login
select '张三','123456',21 from dual union
select 'Tom','123123',34 from dual union
select 'Jack','12345678',34 from dual union
select '李四','qwerty',23 from dual;
commit;

建立持久化类和配置文件

Hibernate.cfg.xml配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="entity/Login.hbm.xml" /> </session-factory> </hibernate-configuration>

持久化类和配置文件

package entity;

public class Login implements java.io.Serializable {

    // Fields

    /**
*
*/
private static final long serialVersionUID = 1L;
private String username;
private String password;
private int age; // Constructors /** default constructor */
public Login() {
} /** minimal constructor */
public Login(String username, String password) {
this.username = username;
this.password = password;
} /** full constructor */
public Login(String username, String password, int age) {
this.username = username;
this.password = password;
this.age = age;
} // Property accessors 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 getAge() {
return this.age;
} public void setAge(int age) {
this.age = age;
} }

配置文件Login.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="entity.Login" table="LOGIN" schema="ROOT">
<id name="username" type="java.lang.String">
<column name="USERNAME" length="32" />
<generator class="assigned" />
</id>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="32" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="AGE" precision="3" scale="0" />
</property>
</class>
<query name="loginUser">
<!--HQL查询语句 -->
<![CDATA[
from Login login where login.username=:username and login.password=:password
]]>
</query>
</hibernate-mapping>

测试类:

package demo;

import java.util.Iterator;
import java.util.List; import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import entity.Login; public class Demo5 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//
//初始化以上对象
//创建一个用户对象
Login lo=new Login();
lo.setUsername("Tom");
lo.setPassword("123123");
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//创建Query 参数为配置文件中的name
Query query=session.getNamedQuery("loginUser");
//将对象作为参数传为
query.setProperties(lo); //查询使用list方法
result=query.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
//判断结果是否为空
Iterator<Login> iterator=result.iterator();
//如果有内容,--不为空
if(iterator.hasNext()){
//输出结果
Login login=iterator.next();
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
}else{
System.out.println("没有这个用户");
} } }

二、NativeSQL本地化SQL

2.1、执行本地SQL

package demo;

import java.util.Iterator;
import java.util.List; import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import entity.Login; public class Demo6 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
String uname="Tom";
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
String sql="select {l.*} from login l where l.username=? ";
//创建SQLQuery对象,传入2个参数,第一个参数为数据库表的别名,第二个为实体类的类
SQLQuery sqlQuery=session.createSQLQuery(sql).addEntity("l", Login.class);
sqlQuery.setParameter(0, uname); //查询使用list方法
result=sqlQuery.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
Iterator<Login> iterator=result.iterator();
//输出结果
while(iterator.hasNext()){
Login login=iterator.next();
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }

2.2、执行本地SQL命名查询

首先配置类的配置文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="entity.Login" table="LOGIN" schema="ROOT">
<id name="username" type="java.lang.String">
<column name="USERNAME" length="32" />
<generator class="assigned" />
</id>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="32" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="AGE" precision="3" scale="0" />
</property>
</class>
<query name="loginUser">
<!--HQL查询语句 -->
<![CDATA[
from Login login where login.username=:username and login.password=:password
]]>
</query>
<!-- 本地SQL命名查询-->
<sql-query name="findUser">
<![CDATA[
select {l.*} from login l where l.username=?
]]>
<!--指定与实体类的关联 -->
<return alias="l" class="entity.Login" />
</sql-query>
</hibernate-mapping>

测试类

package demo;

import java.util.Iterator;
import java.util.List; import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import entity.Login; public class Demo7 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
String uname="Tom";
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
Query query=session.getNamedQuery("findUser");
query.setParameter(0, uname); //查询使用list方法
result=query.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
Iterator<Login> iterator=result.iterator();
//输出结果
while(iterator.hasNext()){
Login login=iterator.next();
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }

三、定制SQL

可以执行自己写的SQL语句来替代Hibernate的SQL,主要有3个保存,插入,删除,时就会执行我们自己写的SQL

  • Insert和update语句,中的字段必须与映射文件中声明的相对应,一个都不能少
  • Insert和update语句,中的属性出现的顺序必须与映射文件中声明的的顺序一致
  • Insert语句,中的主键的顺序永远是在最后出现的

如果插入或者是更新时,不想插入或者更新一些字段只需要在映射文件中相应的字段后面加下insert="false",update="false";

四、指量处理数据

配置:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="myeclipse.connection.profile">orcl</property>
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<mapping resource="entity/Login.hbm.xml" /> </session-factory> </hibernate-configuration>

测试类

package demo;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import entity.Login; public class Demo8 { /**
* 批量插入数据
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//声明事务
Transaction tran=null;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
tran=session.beginTransaction();
for(int i=0;i<100;i++){
Login login=new Login();
login.setUsername(Integer.toString(i+100000));
login.setPassword(Integer.toString(i+100000));
login.setAge(i);
session.save(login); //保存
if(i%20==0){ //单次处理的数据为20,与配置文件中设置的JDBC数量一样
session.flush(); //清理缓存
session.clear(); //清空缓存中的Login对象
}
}
tran.commit(); }catch(HibernateException e){
e.printStackTrace(); }finally{
session.close();
factory.close();
} } }

五、调用存储过程

调用插入

更新

删除

建立带输出参数的存储过程

命名SQL调用

配置文件中添加配置

调用

调用带输出结果集的存储过程

Hibernate(十三)命名查询-批量处理和调用存储过程的更多相关文章

  1. IBatis.Net学习笔记十三:在IBatis.Net中调用存储过程

    其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PR ...

  2. asp.net(c#)中如何在前端用js写条件查询,且不用调用存储过程

    前端页面(源): <dx:ASPxButton ID="ASPxButton_Select" runat="server" Text="查询&q ...

  3. hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询

    在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询..... 1.hql聚合函数,先大致列一下hql的聚合函数有哪些吧: 在 ...

  4. Hibernate异常之命名查询节点未找到

    异常信息: java.lang.IllegalArgumentException: No query defined for that name [salaryEmps] at org.hiberna ...

  5. Hibernate 命名查询

    1.定义 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式被称为命名查询. 2.创建表结构并添加测试数据 create table `student` ( `id` dou ...

  6. [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. 使用Hibernate命名查询

    HQL查询支持将查询所用的HQL语句放入配置文件中,而不是代码中,在Hibernate映射文件的<hibernate-mapping>元素中使用<query>子元素来定义命名查 ...

  8. Hibernate 命名查询NamedQuery (转)

    转自:http://blog.163.com/ksm19870304@126/blog/static/374552332011993942391/ 配置方式: static List namedQue ...

  9. 12.hibernate命名查询

    1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding=" ...

随机推荐

  1. Linux性能监控分析命令(五)—free命令介绍

    性能监控分析的命令包括如下:1.vmstat2.sar3.iostat4.top5.free6.uptime7.netstat8.ps9.strace10.lsof 命令介绍:free命令是监控Lin ...

  2. JDK环境变量的配置说明

    一.Linux下的JDK安装及配置: 1. 使用命令uname –a查看系统的版本确定系统的位数,然后去JDK官网下载相应位数的安装程序,进行安装. 2.  使用rz命令将下载的JDK上传至Linux ...

  3. [Asp.Net web api]基于自定义Filter的安全认证

    摘要 对第三方开放的接口,处于安全的考虑需要对其进行安全认证,是否是合法的请求.目前在项目中也遇到这种情况,提供的接口因为涉及到客户铭感数据,所以在调用的时候,不能直接暴露,需要有一个认证的机制.所以 ...

  4. golang slice切片的原理以及内置函数cap, len

    golang中slice(切片)是常用的类型, slice是对数组进行封装 package main import ( "fmt" "strconv") fun ...

  5. CentOS6.5和RedHat6.5下以rpm方式安装mysql-5.6.20

    转帖;http://blog.csdn.net/mw08091020/article/details/39234207 a.检查下linux是不是已经安装了mysql rpm -qa | grep - ...

  6. unity 质量设置 Quality Settings

    Unity allows you to set the level of graphical quality it will attempt to render. Generally speaking ...

  7. 阿里巴巴分布式服务框架 Dubbo

    1.Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源 ...

  8. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),G ...

  9. 服务信息块协议 SMB(Server Message Block protocol)

    SMB(Server Message Block)是协议名,它能被用于Web连接和客户端与服务器之间的信息沟通. SMB协议 SMB最初是IBM的贝瑞·费根鲍姆(Barry Feigenbaum)研制 ...

  10. react random key generator;react如何产生随机不重复的key

    1.<div key={+new Date() + Math.random()}> 2.使用数组的索引 3.使用uuid:https://www.npmjs.com/package/uui ...