Hibernate3.1.3使用自定义实体类实现对SQL查询语句的映射
2014-12-21 11:55
591 查看
Hibernate3.1.3使用自定义实体类实现映射
前言:
在使用Hibernate操作数据库时, 特别是进行查询时,往往要使用存储过程或一些不方便使用实体类映射的SQL语句。这时就要用到hibernate的自定义SQL语句映射类。下面来介绍一下该过程的实现。
1.下载Hibernate3.1.3(比较老的版本了,不过能实现就可以,而且这个版本能实现,那么更新的版本当然也能实现), 一般可以到sourceforge.net下载。如果你上不了这个网站也没关系,我的百度网盘共享有了,直接下载并解压两个包。还有hibernate-jpa-2.0-api-1.0.0.Final.jar也需要下载。
链接:http://pan.baidu.com/s/1sjNnqeL 密码:yq4q
2.在IDE(一般是Eclipse或Netbeans,一样的了)里建立两个库hibernate3.1.3和hibernate3.1.x-annotation。
下面我以netbeans为例说明:在netbeans主菜单里,工具-->库-->新建库(N)(按钮),命名"Hibernate3.1.3",“确定”;这时“库(L)”列表中就多出了一个"Hibernate3.1.3"的库,单击选择这个库,在右边点按钮“添加JAR/文件夹”,选择上面第一步解压出来的.../hibernate3.1/hibernate3.jar, 确认添加后。再次点右边点按钮“添加JAR/文件夹”,添加”...hibernate-3.1/lib/“下面的所有jar文件。至此完成hibernate3.1.3库的添加,如下图。
3.断续上面第2步,新“hibernate3.1.x-annotation”库,过程和第2步基本一样,不过只要添加两个jar包:.../hibernate-annotations-3.1.0.Beta10/hibernate-annotations.jar 和 hibernate-jpa-2.0-api-1.0.0.Final.jar。如下图:
4.库创建完了之后新建一个测试项目,我建的项目名为“JA01”。添加已经建立好的库: hibernate3.1.3和hibernate3.1.x-annotation, 另外为了连接数据库,再导入mysl jdbc驱动程序ja包,因为netbeans本身就带有,直接导入即可。然后按以下结构建立文件结构。
其中,log4j.properties直接复制../hibernate-3.1/etc目录下的文件过来。HibernateUtil.java直接复制.../hibernate-3.1/doc/reference/tutorial/src/util目录下的文件。不过为了读取hibernate.mysql.cfg.xml, 需要修改HibernateUtil.java的代码,如下:
修改hibernate.mysql.cfg.xml内容如下:
BlogAreaMapping.java内容如下:
主程序JA01.java内容:
在mysql里(用户名root, 密码123)新建一个数据库glweb,编码设为bgk, 新建表gl_blog_area表的sql语句如下,测试数据可以自行录入:
以上工作都做完成后,就可以直接运行"JA01.java"进行测试了,测试结果如下:
这样基本完工了。
注意事项:
1.hibernate.mysql.cfg.xml中, 把<property name="hbm2ddl.auto"/>设置为none, 这是因为我所做的映射在数据库中这些表本来就不存在,所以不必要新建一个。在这个例子中,如果把值设置为update或者update,那么数据库里就会新建一个新的"blogareamapping"的表。这样做有点风险,那就是如果不小心这个数据库中"xxxxxxxxmapping"表本来就存在,而程序又要新建或更新一个这样的表,那很容易造成数据丢失。
2.运行结果里有一大堆INFO信息, 这个在开发时很有用,但放入到项目中,就不必要显示那么多了。为了不显示这些不必要的信息,可以修改log4j.properties文件, 把该文件中的“log4j.logger.org.hibernate=info”这行,改为“log4j.logger.org.hibernate=error”。这样就不显示info信息了,只显示error信息
前言:
在使用Hibernate操作数据库时, 特别是进行查询时,往往要使用存储过程或一些不方便使用实体类映射的SQL语句。这时就要用到hibernate的自定义SQL语句映射类。下面来介绍一下该过程的实现。
1.下载Hibernate3.1.3(比较老的版本了,不过能实现就可以,而且这个版本能实现,那么更新的版本当然也能实现), 一般可以到sourceforge.net下载。如果你上不了这个网站也没关系,我的百度网盘共享有了,直接下载并解压两个包。还有hibernate-jpa-2.0-api-1.0.0.Final.jar也需要下载。
链接:http://pan.baidu.com/s/1sjNnqeL 密码:yq4q
2.在IDE(一般是Eclipse或Netbeans,一样的了)里建立两个库hibernate3.1.3和hibernate3.1.x-annotation。
下面我以netbeans为例说明:在netbeans主菜单里,工具-->库-->新建库(N)(按钮),命名"Hibernate3.1.3",“确定”;这时“库(L)”列表中就多出了一个"Hibernate3.1.3"的库,单击选择这个库,在右边点按钮“添加JAR/文件夹”,选择上面第一步解压出来的.../hibernate3.1/hibernate3.jar, 确认添加后。再次点右边点按钮“添加JAR/文件夹”,添加”...hibernate-3.1/lib/“下面的所有jar文件。至此完成hibernate3.1.3库的添加,如下图。
3.断续上面第2步,新“hibernate3.1.x-annotation”库,过程和第2步基本一样,不过只要添加两个jar包:.../hibernate-annotations-3.1.0.Beta10/hibernate-annotations.jar 和 hibernate-jpa-2.0-api-1.0.0.Final.jar。如下图:
4.库创建完了之后新建一个测试项目,我建的项目名为“JA01”。添加已经建立好的库: hibernate3.1.3和hibernate3.1.x-annotation, 另外为了连接数据库,再导入mysl jdbc驱动程序ja包,因为netbeans本身就带有,直接导入即可。然后按以下结构建立文件结构。
其中,log4j.properties直接复制../hibernate-3.1/etc目录下的文件过来。HibernateUtil.java直接复制.../hibernate-3.1/doc/reference/tutorial/src/util目录下的文件。不过为了读取hibernate.mysql.cfg.xml, 需要修改HibernateUtil.java的代码,如下:
package com.utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { <span style="color:#cc0000;">//sessionFactory = new Configuration().configure("/com/config/hibernate.mysql2.cfg.xml").buildSessionFactory(); sessionFactory = new AnnotationConfiguration().configure("/com/config/hibernate.mysql.cfg.xml").buildSessionFactory(); </span> } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
修改hibernate.mysql.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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <!--c3p0连接器--> <!-- <property name="hibernate.connection.provider_class">net.sf.hibernate.connection.C3P0ConnectionProvider</property> --> <!--最大连接数--> <property name="hibernate.c3p0.max_size">20</property> <!--最小连接数--> <property name="hibernate.c3p0.min_size">1</property> <!--连接数据连接多长时间就超时--> <property name="hibernate.c3p0.timeout">120</property> <!-- 指定连接池里最大缓存多少个Statement对象 --> <property name="hibernate.c3p0.max_statements">100</property> <!--连接空闲时长多久时(秒),检查连接是否有效--> <property name="hibernate.c3p0.idle_test_period">120</property> <!--连接超 过最大连接数时每次c3p0同时获得多少个连接--> <property name="hibernate.c3p0.acquire_increment">2</property> <!--测试连接是否有效--> <property name="hibernate.c3p0.validate">true</property> <!-- 根据需要自动操作数据库 --> <property name="hbm2ddl.auto">none</property> <!-- 显示Hibernate持久化操作所生成的SQL --> <property name="show_sql">true</property> <!-- 将SQL脚本进行格式化后再输出--> <!--<property name="hibernate.format_sql">true</property>--> <!--把注解放入session-factory中--> <mapping class="com.project.mapping.BlogAreaMapping"/> </session-factory> </hibernate-configuration>
BlogAreaMapping.java内容如下:
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.project.mapping; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.Id; import javax.persistence.SqlResultSetMapping; /** * * @author lcs * @Email 1125271180@qq.com */ @Entity @SqlResultSetMapping(name = "BlogAreaMapping", entities = {@EntityResult(entityClass = BlogAreaMapping.class)}) public class BlogAreaMapping { @Id private long fid; private String name; private int sons; /** * @return the fid */ public long getFid() { return fid; } /** * @param fid the fid to set */ public void setFid(long fid) { this.fid = fid; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the sons */ public int getSons() { return sons; } /** * @param sons the sons to set */ public void setSons(int sons) { this.sons = sons; } }
主程序JA01.java内容:
package ja01; import com.project.mapping.BlogAreaMapping; import com.utils.HibernateUtil; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; /** * * @author Administrator */ public class JA01 { /** * @param args the command line arguments */ public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); List list = session.createSQLQuery("SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10").setResultSetMapping("BlogAreaMapping").list(); tx.commit(); session.close(); if ( list.size() > 0 ) { for(int i = 0; i < list.size(); i++) { BlogAreaMapping blogAreaMapping = (BlogAreaMapping) list.get(i); System.out.println("fid:" + blogAreaMapping.getFid() + " -- name:" + blogAreaMapping.getName()); } } // TODO code application logic here System.out.println("ja 你好。"); } }
在mysql里(用户名root, 密码123)新建一个数据库glweb,编码设为bgk, 新建表gl_blog_area表的sql语句如下,测试数据可以自行录入:
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for gl_blog_area -- ---------------------------- DROP TABLE IF EXISTS `gl_blog_area`; CREATE TABLE `gl_blog_area` ( `fid` mediumint(7) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL DEFAULT '', `sons` smallint(4) NOT NULL DEFAULT '0' PRIMARY KEY (`fid`) ) ENGINE=MyISAM AUTO_INCREMENT=538 DEFAULT CHARSET=gbk;
以上工作都做完成后,就可以直接运行"JA01.java"进行测试了,测试结果如下:
run: 12:18:58,037 INFO Version:15 - Hibernate Annotations 3.1.0.Beta10b 12:18:58,053 INFO Environment:479 - Hibernate 3.1.3 12:18:58,053 INFO Environment:509 - hibernate.properties not found 12:18:58,053 INFO Environment:525 - using CGLIB reflection optimizer 12:18:58,053 INFO Environment:555 - using JDK 1.4 java.sql.Timestamp handling 12:18:58,115 INFO Configuration:1308 - configuring from resource: /com/config/hibernate.mysql.cfg.xml 12:18:58,115 INFO Configuration:1285 - Configuration resource: /com/config/hibernate.mysql.cfg.xml 12:18:58,318 INFO Configuration:1419 - Configured SessionFactory: null 12:18:58,365 INFO AnnotationBinder:336 - Binding entity from annotated class: com.project.mapping.BlogAreaMapping 12:18:58,396 INFO EntityBinder:324 - Bind entity com.project.mapping.BlogAreaMapping on table BlogAreaMapping 12:18:58,427 INFO ResultsetMappingSecondPass:51 - Binding resultset mapping: BlogAreaMapping 12:18:58,474 INFO C3P0ConnectionProvider:50 - C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk 12:18:58,474 INFO C3P0ConnectionProvider:51 - Connection properties: {user=root, password=****} 12:18:58,474 INFO C3P0ConnectionProvider:54 - autocommit mode: false 12:18:59,160 INFO SettingsFactory:77 - RDBMS: MySQL, version: 5.6.15-log 12:18:59,160 INFO SettingsFactory:78 - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.23 ( Revision: ${bzr.revision-id} ) 12:18:59,160 INFO Dialect:103 - Using dialect: org.hibernate.dialect.MySQLDialect 12:18:59,160 INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions) 12:18:59,176 INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) 12:18:59,176 INFO SettingsFactory:125 - Automatic flush during beforeCompletion(): disabled 12:18:59,176 INFO SettingsFactory:129 - Automatic session close at end of transaction: disabled 12:18:59,176 INFO SettingsFactory:136 - JDBC batch size: 15 12:18:59,176 INFO SettingsFactory:139 - JDBC batch updates for versioned data: disabled 12:18:59,176 INFO SettingsFactory:144 - Scrollable result sets: enabled 12:18:59,176 INFO SettingsFactory:152 - JDBC3 getGeneratedKeys(): enabled 12:18:59,176 INFO SettingsFactory:160 - Connection release mode: auto 12:18:59,176 INFO SettingsFactory:184 - Maximum outer join fetch depth: 2 12:18:59,176 INFO SettingsFactory:187 - Default batch fetch size: 1 12:18:59,176 INFO SettingsFactory:191 - Generate SQL with comments: disabled 12:18:59,176 INFO SettingsFactory:195 - Order SQL updates by primary key: disabled 12:18:59,176 INFO SettingsFactory:338 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory 12:18:59,176 INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory 12:18:59,176 INFO SettingsFactory:203 - Query language substitutions: {} 12:18:59,176 INFO SettingsFactory:209 - Second-level cache: enabled 12:18:59,176 INFO SettingsFactory:213 - Query cache: disabled 12:18:59,176 INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider 12:18:59,192 INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled 12:18:59,192 INFO SettingsFactory:237 - Structured second-level cache entries: disabled 12:18:59,192 INFO SettingsFactory:257 - Echoing all SQL to stdout 12:18:59,192 INFO SettingsFactory:264 - Statistics: disabled 12:18:59,192 INFO SettingsFactory:268 - Deleted entity synthetic identifier rollback: disabled 12:18:59,192 INFO SettingsFactory:283 - Default entity-mode: pojo 12:18:59,207 INFO SessionFactoryImpl:154 - building session factory 12:18:59,223 WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/Frameworks/JAVA/Hibernate/3.1.x/hibernate-3.1/lib/ehcache-1.1.jar!/ehcache-failsafe.xml 12:18:59,379 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured Hibernate: SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10 fid:1 -- name:北京市 fid:2 -- name:上海市 fid:3 -- name:天津市 fid:4 -- name:重庆市 fid:5 -- name:河北省 fid:6 -- name:山西省 fid:7 -- name:内蒙古自治区 fid:8 -- name:辽宁省 fid:9 -- name:吉林省 fid:10 -- name:黑龙江省 ja 你好。 成功构建 (总时间: 1 秒)
这样基本完工了。
注意事项:
1.hibernate.mysql.cfg.xml中, 把<property name="hbm2ddl.auto"/>设置为none, 这是因为我所做的映射在数据库中这些表本来就不存在,所以不必要新建一个。在这个例子中,如果把值设置为update或者update,那么数据库里就会新建一个新的"blogareamapping"的表。这样做有点风险,那就是如果不小心这个数据库中"xxxxxxxxmapping"表本来就存在,而程序又要新建或更新一个这样的表,那很容易造成数据丢失。
2.运行结果里有一大堆INFO信息, 这个在开发时很有用,但放入到项目中,就不必要显示那么多了。为了不显示这些不必要的信息,可以修改log4j.properties文件, 把该文件中的“log4j.logger.org.hibernate=info”这行,改为“log4j.logger.org.hibernate=error”。这样就不显示info信息了,只显示error信息
相关文章推荐
- Hibernate之使用sql语句查询多个表,返回多种字段,将返回结果映射到自定义的普通pojo类中
- Hibernate使用sql语句实现多表关联查询
- Hibernate使用sql语句实现多表关联查询
- 关于hibernate使用SQL查询,结果集无法映射到实体类上
- Hibernate使用sql语句实现多表关联查询
- Hibernate使用sql语句查询
- 使用反射让linq实现动态查询, 类似拼接sql语句的where 条件
- Hibernate使用sql语句查询
- 实现用SQL语句分页查询操作hibernate
- 在Excel中使用SQL语句实现精确查询
- hibernate查询SQL语句返回自定义实体对象
- hibernate使用hql和sql查询总记录数语句
- 关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
- 在Excel中使用SQL语句实现精确查询
- Hibernate查询时,使用HQL和SQL的区别(SUM语句)
- hibernate查询SQL语句返回自定义实体对象
- Hibernate中使用SQL处理复杂的查询语句(on calsue)
- sql 自定义函数 ,where后拼接条件跳转语句,实现可变参数查询
- 使用addScala将SQLQuery自定义查询映射到pojo中
- hibernate查询SQL语句返回自定义实体对象