Hibernate(十三)命名查询-批量处理和调用存储过程
一、命名查询
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(十三)命名查询-批量处理和调用存储过程的更多相关文章
- IBatis.Net学习笔记十三:在IBatis.Net中调用存储过程
其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PR ...
- asp.net(c#)中如何在前端用js写条件查询,且不用调用存储过程
前端页面(源): <dx:ASPxButton ID="ASPxButton_Select" runat="server" Text="查询&q ...
- hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询
在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询..... 1.hql聚合函数,先大致列一下hql的聚合函数有哪些吧: 在 ...
- Hibernate异常之命名查询节点未找到
异常信息: java.lang.IllegalArgumentException: No query defined for that name [salaryEmps] at org.hiberna ...
- Hibernate 命名查询
1.定义 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式被称为命名查询. 2.创建表结构并添加测试数据 create table `student` ( `id` dou ...
- [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 使用Hibernate命名查询
HQL查询支持将查询所用的HQL语句放入配置文件中,而不是代码中,在Hibernate映射文件的<hibernate-mapping>元素中使用<query>子元素来定义命名查 ...
- Hibernate 命名查询NamedQuery (转)
转自:http://blog.163.com/ksm19870304@126/blog/static/374552332011993942391/ 配置方式: static List namedQue ...
- 12.hibernate命名查询
1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding=" ...
随机推荐
- Codeforces Round #288 (Div. 2) E. Arthur and Brackets 贪心
E. Arthur and Brackets time limit per test 2 seconds memory limit per test 128 megabytes input stand ...
- Charles基本使用—http抓包、手机抓包、数据篡改
本文主要介绍如下内容: 1.Charles如何抓取HTTP报文 2.Charles如何抓取手机上的HTTP包 3.使用Charles篡改数据信息 一.Charles抓取HTTP包 1.Charles的 ...
- Jmeter实现webservice的接口测试
前提条件 测试的URL:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx 测试接口:getSupportCityString 获取城市的编码:htt ...
- asp.net 判断日期是否为空
if (Birthday == DateTime.MinValue) { //u can do something here } 首先确保Birthday是不可为null的日期类型.如果可为null就 ...
- Is there a way to detect if call is in progress? Phone Event
First you need 3 profiles to monitor the phone state: Event: Phone IdleVariable Clear %Phoning Event ...
- node.js第11课(HTTPclient)
一.http模块提供了两个函数http.request和http.get,功能是作为client向HTTPserver发起请求. Ext.Ajax.request({},function ...
- 光速 React
光速 React Vixlet 团队优化性能的经验教训 在过去一年多,我们 Vixlet 的 web 团队已经着手于一个激动人心的项目:将我们的整个 web 应用迁移到 React + Redux 架 ...
- transform,transition,animation 的混合使用——进阶
今天我们来讲述css3能够做成动画的最小独立单元,并且讲述如何使用这些独立的单元来构成一个‘高大尚’的组合动画. 这是我在网上找的一个案例,修改后的效果图,虽说不是特别的‘高大尚’,但我认为这也跟高大 ...
- 压缩 js/css 的工具
最近检测服务器,发现js/css文件都没有压缩过,动手解决此问题先. 本次压缩采用 yui compress (2.4.8) 压缩脚本: #!/bin/sh echo "########## ...
- UIView 精要概览(持续更新)
--1-- 知识点:为UIView 设置圆角 前提:layer 属性需要 <QuartzCore/QuartzCore.h> 静态库的支持,所以需要提前导入到项目中,并在你的文件中包含#i ...