一、命名查询

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. 自动打怪 c#

    其中思路很简单,单线程的一个乱七八糟的游戏 预计会更新背包,背包这个估计会用一个vector来存 图形的话,我得催催我的美工大人,她会帮我弄吧,哇哈哈 界面: namespace auttompk { ...

  2. 获取数据库连接对象(线程ThreadLocal)

    /** * 负责数据库连接定义的程序类 * 该类可以负责所有操作线程的数据库连接,利用get()方法可以获得连接对象 */ public class DatabaseConnection { priv ...

  3. Latest SQLite binary for January 2015

    Latest SQLite binary for January 2015 Well I went through quite a few threads to find an updated, de ...

  4. SCSI Pass-Through Interface Tool

    http://code.msdn.microsoft.com/SCSI-Pass-Through-a906ceef/sourcecode?fileId=59048&pathId=1919073 ...

  5. jquery的closest方法和parents方法的区别

    今天第一次看到closest方法,以前也从来没用过. 该方法从元素本身开始往上查找,返回最近的匹配的祖先元素. 1.closest查找开始于自身,parents开始于元素父级 2.closest向上查 ...

  6. 各种SSD SMART 信息 转

    intel SSD Toolbox SMART信息 解释:03 – Spin Up Time (磁头加载时间)The average time it takes the spindle to spin ...

  7. Apache Mina入门

    Mina第一次听到这个名称的时候,我以为是个MM的名字米娜,后来才知道… Apache MINA(Multipurpose Infrastructure for Network Application ...

  8. [转载] C# matlab联合编程简介

    原作者  文月 主要操作说明: 1. 找到matlab安装目录下的MCRInstaller.exe安装 MCRInstaller.exe 在安装目录下的 ..\MATLAB7\toolbox\comp ...

  9. Java 8 的新特性和改进总览

    这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2013年9月份发布. 在写这篇文章的时候,Java 8的开发工作仍然在紧张有序的进行中,语言特新和API ...

  10. git跟踪远程分支,查看本地分支追踪和远程分支的关系

    跟踪远程分支 如果用git push指令时,当前分支没有跟踪远程分支(没有和远程分支建立联系),那么就会git就会报错 There is no tracking information for the ...