(4) hibernate增删查改+批量操作+类似Mybatis动态sql
生活随笔
收集整理的這篇文章主要介紹了
(4) hibernate增删查改+批量操作+类似Mybatis动态sql
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?簡介
采用spring + hibernate + freemaker+ maven搭建起來的一個hibernate增刪查改和
類似mybatis動態(tài)sql查詢的一個案例
?增刪查改demo + 動態(tài)sql?
?數(shù)據(jù)庫表(只有一張USER表)
動態(tài)sql的xml (test-dynamicHibernateSql.xml )
<?xml version="1.0" encoding="utf-8"?> <!-- <!DOCTYPE dynamic-hibernate-statement SYSTEM "http://localhost:8080/dynamic-hibernate-statement-1.0.dtd"> --> <!-- 這里采用了freemarker技術,賦值,集合,大小比較,if else都要遵守freemarker語法 --> <dynamic-hibernate-statement><sql-query name="user.findByAge"> <![CDATA[ select age from user where 1=1<#if (age>20) > and age > 20<#else> and age < 20</#if> ]]></sql-query><sql-query name="user.findByName"> <![CDATA[ SELECT age FROM USER WHERE NAME LIKE '${name}%' AND age > ${age}]]></sql-query><sql-query name="user.findByName2"> <![CDATA[ SELECT name,birthday,age,address FROM USER WHERE NAME LIKE '${name}%' AND age > ${age}]]></sql-query><sql-query name="user.findByName3"> <![CDATA[ SELECT name FROM USER WHERE NAME LIKE '${name}%' AND age > ${age}]]></sql-query><hql-query name="user.findByName4"> <![CDATA[ SELECT u.name FROM User u WHERE u.name LIKE '${name}%' AND u.age > ${age}]]></hql-query></dynamic-hibernate-statement>?user的映射xml文件 ( User.hbm.xml )
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><class table="user" name="com.business.entity.User" ><id column="id" name="id" type="java.lang.Integer"><generator class="native"/></id><property column="name" name="name" type="java.lang.String" /><property column="address" name="address" type="java.lang.String" /><property column="age" name="age" type="java.lang.Integer" /><property column="birthday" name="birthday" type="java.util.Date" /></class></hibernate-mapping>?junit測試增刪查改和動態(tài)sql (TestUserService.java )
package test;import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.business.entity.User; import com.business.service.UserService; import com.business.service.impl.UserServiceImpl; import com.system.hibernate.StatementTemplate;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext.xml"}) public class TestUserService {@Resource(name="userService")private UserServiceImpl userService;/*** 保存單個用戶方法* */@Testpublic void testSave(){User u = new User("zhangsan",new Date() );this.userService.save(u);}/*** 批量保存多個用戶方法* */@Testpublic void testSaveAll(){List list = new ArrayList();for(int i = 0 ; i < 20000 ; i++){User user = new User("zhansan"+i,new Date());list.add(user);}this.userService.saveAll(list);}/*** 根據(jù)多個id查詢* */@Testpublic void testGetByIds(){List idsList = new ArrayList();for(int i = 0 ; i < 100 ; i++){idsList.add(39100+i);}List<User> userList = this.userService.get(User.class, idsList);for(int i = 0 ; i < userList.size() ; i++){System.out.println(" i = "+i+" user name = " + userList.get(i).getName() );}}/*** 取得對象的主鍵名.*/@Testpublic void testGetIdName() {String idName = this.userService.getIdName(User.class);System.out.println("idName = " + idName);}/*** 刪除所有對象* */@Testpublic void testDeleteAll() {List idsList = new ArrayList();for(int i = 0 ; i < 100 ; i++){idsList.add(29100+i);}List<User> userList = this.userService.get(User.class, idsList);this.userService.deleteAll(userList);}/*** 更新對象* */@Testpublic void testUpdate() {int id = 39100;User user = (User) this.userService.get(User.class,id);user.setName("update name");this.userService.update(user);}/*** 根據(jù)id查詢* */@Testpublic void testGetById() {int id = 39100;User user = (User) this.userService.get(User.class,id);System.out.println("name = " + user.getName() );}/*** 更新所有對象* */@Testpublic void testUpdateAll(){List ids = new ArrayList();ids.add(1);ids.add(2);ids.add(3);ids.add(4);ids.add(5);ids.add(39101);ids.add(7);ids.add(39300);ids.add(1);ids.add(39400);List<User> userList = (List<User>) this.userService.get(User.class, ids);for(int i = 0 ; i < userList.size() ;i ++ ){User user = userList.get(i);user.setName("update username"+i );}this.userService.updateAll(userList);}/*** 保存或更新* */@Testpublic void testSaveOrUpdate(){User u = new User("zhangsan2",new Date() );u.setId(1);this.userService.saveOrUpdate(u);}/*** 保存或更新所有實體* */@Testpublic void testSaveOrUpdateAll(){List ids = new ArrayList();ids.add(1);ids.add(2);ids.add(3);ids.add(4);ids.add(5);ids.add(39101);ids.add(7);ids.add(39300);ids.add(1);ids.add(39400);List<User> userList = (List<User>) this.userService.get(User.class, ids);User newUser = new User("saveOrdate new user",new Date());for(int i = 0 ; i < userList.size() ; i++){User user = userList.get(i);user.setName("saveOrUpdateAll name"+i);}userList.add(newUser);this.userService.saveOrUpdateAll(userList);}/*** 根據(jù)原生sql語句進行查詢,返回對象集合 * String sql 原生sql語句* String[] fields 必需為對象字段屬性 * 例子: Sql : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */@Testpublic void testFindBySql1() {String sql = "SELECT name,birthday,age,address FROM USER WHERE NAME LIKE 'zhansan100%'";String[] fields = { "name","birthday","age","address" };List<Map<String, Object>> list = this.userService.findBySql(sql, fields);if(list!=null&&list.size()>0){for(int i = 0 ; i < list.size() ; i++ ){Map map = list.get(i);System.out.println("name = " + map.get("name") + " birthday = " + map.get("birthday") + " age = " + map.get("age") + " address = " + map.get("address"));}}}/*** 根據(jù)原生sql語句進行查詢,返回對象集合 * String sql 原生sql語句* Class clazz 為類 String[] fields* 必需為對象字段屬性 * 例子: Sql : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */@Testpublic void testFindBySql2() {String sql = "SELECT name,birthday,age,address FROM USER WHERE NAME LIKE 'zhansan100%'";String[] fields = { "name","birthday","age","address" };List<User> list = this.userService.findBySql(sql,User.class, fields);if(list!=null&&list.size()>0){for(int i = 0 ; i < list.size() ; i++ ){User user = list.get(i);System.out.println("name = " + user.getName()+ " birthday = " + user.getBirthday()+ " age = " + user.getAge()+ " address = " + user.getAddress());}}}/*** 根據(jù)hql查詢* */@Testpublic void testFindByHql1() {String hql = " from User u where u.name like 'zhansan100%' ";List<User> userList = this.userService.findByHql(hql);if( userList!=null && userList.size()>0 ){for(int i = 0 ; i < userList.size() ; i++){User user = userList.get(i);System.out.println("name = " + user.getName()+ " birthday = " + user.getBirthday()+ " age = " + user.getAge()+ " address = " + user.getAddress());}}}/*** 根據(jù)id查詢* */@Testpublic void testLoadById() {int id = 22114;User user = (User) this.userService.load(User.class, id);if(user==null) return ;System.out.println("name = " + user.getName()+ " birthday = " + user.getBirthday()+ " age = " + user.getAge()+ " address = " + user.getAddress());}/*** 根據(jù)Id更新對象指定的屬性* */@Testpublic void testUpdateOneByProperty1() {int id = 22114;List<String> pName = new ArrayList<String>();List pValue = new ArrayList();pName.add("name");pValue.add("zhangsan7259");pName.add("age");pValue.add(1);this.userService.updateOneByPropertys(User.class, id, pName, pValue);}/*** 根據(jù)id更新多個屬性* */@Testpublic void testUpdateOneByPropertys2() {int id = 39300;Map map = new HashMap();map.put("name", "zhangsan222");map.put("age", 1 );this.userService.updateOneByPropertys(User.class, id, map);}/*** 動態(tài)命名查詢,返回對象集合 * 返回格式* map1 = { name=zhangsan,age=1 }, map2 = { name=zhangsan2,age=2 }, map3 = { name=zhangsan3,age=3 }* list = {map1,map2,map3}* * */@Testpublic void testFindByNamedQuery1() {String queryName = "user.findByAge";String[] fields = {"age"};Map pramMap = new HashMap();pramMap.put("age", 50);List<Map<String, Object>> list = this.userService.findByNamedQuery(queryName, fields, pramMap);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){Map map = list.get(i);System.out.println( " i = "+i+" age = " + map.get("age") );}}/*** 動態(tài)命名查詢,返回對象集合 * 返回格式* map1 = { name=zhangsan,age=1 }, map2 = { name=zhangsan2,age=2 }, map3 = { name=zhangsan3,age=3 }* list = {map1,map2,map3}* * */@Testpublic void testFindByNamedQuery2() {String queryName = "user.findByName";String[] fields = {"age","name"};Map pramMap = new HashMap();pramMap.put("age", 50);pramMap.put("name", "zhansan");List<Map<String, Object>> list = this.userService.findByNamedQuery(queryName, fields, pramMap);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){Map map = list.get(i);System.out.println( " i = "+i+" age = " + map.get("age") );}}/*** 動態(tài)命名查詢,返回對象集合 * 返回格式* list = {user1,user2,user3}* * */@Testpublic void testFindByNamedQuery3() {String queryName = "user.findByName2";String[] fields = {"name","birthday","age","address"};Map pramMap = new HashMap();pramMap.put("age", 50);pramMap.put("name", "zhansan");List<Object> list = this.userService.findByNamedQuery(queryName, User.class,fields, pramMap);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){User user = (User) list.get(i);System.out.println("name = " + user.getName()+ " birthday = " + user.getBirthday()+ " age = " + user.getAge()+ " address = " + user.getAddress());}}@Testpublic void testFindByNamedQuery4() {String queryName = "user.findByName3";String[] fields = {"name"};Map pramMap = new HashMap();pramMap.put("age", 50);pramMap.put("name", "zhansan");List<Object> list = this.userService.findByNamedQuery(queryName, User.class,fields, pramMap);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){User user = (User) list.get(i);System.out.println( " name = " + user.getName());}}/*** 動態(tài)命名查詢,返回對象集合 * final String queryName hql命名查詢* Class clazz 為類對象* String[] fields 必需為查詢字段* Map<String, ?> parameters 為參數(shù){name=zhangsan,age=3}* 例子: queryName : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */@Testpublic void testfindByNamedQuery5() {String queryName = "user.findByName4";String[] fields = {"name"};Map pramMap = new HashMap();pramMap.put("age", 50);pramMap.put("name", "zhansan");List<Object> list = this.userService.findByNamedQuery(queryName, User.class,fields, pramMap);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){User user = (User) list.get(i);System.out.println( " name = " + user.getName());}}/*** 按HQL查詢對象列表.* * @param values 數(shù)量可變的參數(shù),按順序綁定.*/@Testpublic void testFindByHQL() {String hql = " from User u where u.name=? and u.age = ?";Object[] array = new Object[2];array[0]="zhangsan";array[1]=0;List<User> list = (List<User>)this.userService.findByHQL(hql, array);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){User user = (User) list.get(i);System.out.println("name = " + user.getName()+ " age = " + user.getAge());}}/*** 按sql查詢對象列表.* 返回list={user1,user2,user3}* */@Testpublic void testfindBySql(){String sql = " SELECT NAME,age FROM USER u WHERE u.name='zhangsan' ";String[] fields = { "name","age" };List<User> list = (List<User>)this.userService.findBySql(sql, User.class, fields);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){User user = (User) list.get(i);System.out.println("name = " + user.getName()+ " age = " + user.getAge());}}/*** 按sql查詢對象列表.* map1={name1=zhangsan1,age=1},map2={name2=zhangsan2,age=2},map3={name3=zhangsan3,age=3}* 返回list={map1,map2,map3}* */@Testpublic void testfindBySql2(){String sql = " SELECT NAME,age FROM USER u WHERE u.name='zhangsan' ";String[] fields = { "name","age" };List<Map<String,Object>> list = this.userService.findBySql(sql, fields);if(list==null||list.size()==0) return ;for(int i = 0 ; i < list.size() ; i++){Map map = list.get(i);System.out.println( " i = "+i+" age = " + map.get("age") +" name = " + map.get("name") );}}/*** 根據(jù)sql插入或者更新* */@Testpublic void testInsertOrUpdateBySql(){String sql = " INSERT INTO USER(id,NAME,age)VALUES(2,'name',33) ";this.userService.insertOrUpdateBySql(sql);}}?源碼介紹
?案例結構圖
?動態(tài)sql和hql
實現(xiàn)原理參考以下博客
http://blog.csdn.net/crazycoder2010/article/details/7414152
?詳細代碼
? ? ?maven 配置pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>02_curd</groupId><artifactId>curd</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>curd Maven Webapp</name><url>http://maven.apache.org</url><properties><spring.version>4.1.6.RELEASE</spring.version><hibernate.version>4.1.10.Final</hibernate.version><cglib.version>2.2.2</cglib.version></properties><dependencies><!-- log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- mail --><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.1</version></dependency><!--junit --> <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency> <!--hibernate-core --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version> </dependency><!-- spring-context-support --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><!-- spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency> <!-- spring-orm --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><!-- aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.5.4</version></dependency><!-- spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!-- spring-aop --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><!-- spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><!-- mysql-connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.18</version></dependency><!-- druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.14</version></dependency><!-- persistence-api --><dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0</version></dependency><!-- cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2</version></dependency><!-- freemarker --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.20</version></dependency><!-- ehcache --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>1.2.3</version></dependency><!-- jtds --><dependency><groupId>net.sourceforge.jtds</groupId><artifactId>jtds</artifactId><version>1.2.4</version></dependency><!-- org.slf4j --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.5.8</version></dependency><!-- commons-lang --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><!-- spring-test --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency></dependencies><build><finalName>curd</finalName><defaultGoal>compile</defaultGoal></build></project>? ? spring配置信息applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"><!-- 引入屬性文件 --> <context:property-placeholder location="db.properties" /> <!-- 自動掃描 --><context:component-scan base-package="com.system.hibernate"/><context:component-scan base-package="com.business.dao"/><context:component-scan base-package="com.business.service"/><!-- druid數(shù)據(jù)源 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${driver_class_name}" /><property name="url" value="${jdbc_url}" /><property name="username" value="${jdbc_username}" /><property name="password" value="${jdbc_password}" /></bean> <!-- sessionFactory --><bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="false"><!-- 注入datasource,給sessionfactoryBean內(nèi)setdatasource提供數(shù)據(jù)源 --><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:hibernate.cfg.xml" /></bean> <!-- hibernateTemplate --><bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"/></bean><!-- 事務的配置 --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean><!-- 業(yè)務邏輯層切面配置 --><aop:config> <aop:pointcut id="servicePointcut" expression="execution( * com.business.service..*.*(..) )" /> <aop:advisor pointcut-ref="servicePointcut" advice-ref="txAdvice" /> </aop:config><!-- 系統(tǒng)hibernate層切面配置 --><aop:config> <aop:pointcut id="hibernatePointcut" expression="execution( * com.system.hibernate..*.*(..) )" /> <aop:advisor pointcut-ref="hibernatePointcut" advice-ref="txAdvice" /> </aop:config> <!-- 配置事務傳播特性 --><tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/><tx:method name="add*" propagation="REQUIRED"/><tx:method name="del*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="find*" propagation="REQUIRED"/><tx:method name="get*" propagation="REQUIRED"/><tx:method name="*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice> <!-- dynamicStatementBuilder --><bean id="dynamicStatementBuilder" class="com.system.hibernate.DefaultDynamicHibernateStatementBuilder"> <property name="fileNames"> <list> <value>classpath*:com/business/dynamicXml/*-dynamicHibernateSql.xml</value><!--這里我們指定要加載某個文件夾下所有以-dynamicHibernateSql.xml結尾的文件 --> </list> </property> </bean> </beans>? ? hibernate配置信息hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!--聲明Hibernate配置文件的開始--> <hibernate-configuration><session-factory><!-- SQL dialect --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><!-- Drop and re-create the database schema on startup --><property name="hbm2ddl.auto">update</property><!-- <mapping resource="com/sunrise/jop/business/custmanager/reltemp/persistent/RelTemp.hbm.xml"/>--> <!-- 采用getCurrentSession()創(chuàng)建的session會綁定到當前線程中,而采用openSession()創(chuàng)建的session則不會。采用getCurrentSession()創(chuàng)建的session在commit或rollback時會自動關閉,而采用openSession()創(chuàng)建的session必須手動關閉。使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:* 如果使用的是本地事務(jdbc事務)<property name="hibernate.current_session_context_class">thread</property>* 如果使用的是全局事務(jta事務)<property name="hibernate.current_session_context_class">jta</property>如果采用的時Hibernate4,使用getCurrentSession()必須配置事務,否則無法取到session --><property name="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property><!-- 映射文件 --><mapping resource="com/business/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>? ? hibernate核心代碼
? ? ? ? ? ?BaseDaoImpl.java
package com.system.hibernate;import java.util.Collection; import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Field; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set;import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; import org.hibernate.metadata.ClassMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate4.HibernateTemplate; import org.springframework.stereotype.Repository; import org.springframework.beans.factory.InitializingBean;import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template;@Repository("baseDao") public class BaseDaoImpl implements InitializingBean{private static final Logger logger = LoggerFactory.getLogger(BaseDaoImpl.class);@Autowiredprivate SessionFactory sessionFactory;@Autowiredprivate HibernateTemplate hibernateTemplate;private final int BATCH_NUMBER = 100;//批量操作數(shù)/*** 模板緩存*/protected Map<String, StatementTemplate> templateCache;@Autowiredprotected DynamicHibernateStatementBuilder dynamicStatementBuilder;// ThreadLocal可以隔離多個線程的數(shù)據(jù)共享,因此不再需要對線程同步private ThreadLocal<Session> session = null;/*** 創(chuàng)建session,需要手動關閉* */public Session openSession() {return sessionFactory.openSession();}/*** 根據(jù)sql插入或者更新* */public void insertOrUpdateBySql(String sql){if(sql==null) return ;try{this.getCurrentSession().createSQLQuery(sql).executeUpdate();}catch(Exception e){e.printStackTrace();}}/*** 保存對象* */public boolean save(Object obj) {if(obj==null) return false;try {this.hibernateTemplate.save(obj);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 保存所有對象* */public boolean saveAll(Collection col) {if(col==null||col.size()==0) return false;Session session = this.openSession();Transaction tx = session.beginTransaction(); // 開啟事物int count = 0;try {Iterator iterator = col.iterator();while(iterator.hasNext()){count++;session.save(iterator.next());if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER個數(shù)據(jù)作為一個處理單元session.flush(); //保持與數(shù)據(jù)庫數(shù)據(jù)的同步session.clear();//清除內(nèi)部緩存的全部數(shù)據(jù),及時釋放出占用的內(nèi)存}}tx.commit(); // 提交事物 } catch (Exception e) {e.printStackTrace();tx.rollback();return false;}this.closeSession(session);return true;}/*** 刪除對象* */public boolean delete(Object obj) {try {this.hibernateTemplate.delete(obj);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 按id刪除對象.*/public boolean delete(Class clazz,Serializable id) {try {this.hibernateTemplate.delete( this.get(clazz, id) );return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 按id列表獲取對象列表.*/public List get(Class clazz,Collection ids) {if(clazz==null||ids==null||ids.size()==0) return null;return find(clazz,Restrictions.in(getIdName(clazz), ids));}/*** 按Criteria查詢對象列表.* * @param criterions 數(shù)量可變的Criterion.*/@SuppressWarnings("unchecked")public List find(Class clazz,final Criterion... criterions) {return createCriteria(clazz,criterions).list();}/*** 根據(jù)Criterion條件創(chuàng)建Criteria.* 與find()函數(shù)可進行更加靈活的操作.* @param criterions 數(shù)量可變的Criterion.*/public Criteria createCriteria(Class clazz,final Criterion... criterions) {Criteria criteria = this.getCurrentSession().createCriteria(clazz);for (Criterion c : criterions) {criteria.add(c);}return criteria;}/*** 取得對象的主鍵名.*/public String getIdName(Class clazz) {if(clazz==null) return null;ClassMetadata meta = this.sessionFactory.getClassMetadata(clazz);return meta.getIdentifierPropertyName();}/*** 刪除所有對象* */public boolean deleteAll(Collection col) {if(col==null||col.size()==0) return false;Session session = this.openSession();Transaction tx = session.beginTransaction(); // 開啟事物int count = 0;try {Iterator iterator = col.iterator();while(iterator.hasNext()){count++;session.delete(iterator.next());if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER個數(shù)據(jù)作為一個處理單元session.flush(); //保持與數(shù)據(jù)庫數(shù)據(jù)的同步session.clear();//清除內(nèi)部緩存的全部數(shù)據(jù),及時釋放出占用的內(nèi)存}}tx.commit(); // 提交事物 } catch (Exception e) {e.printStackTrace();tx.rollback();return false;}this.closeSession(session);return true;}/*** 更新對象* */public boolean update(Object obj) {if(obj==null) return false;try {this.hibernateTemplate.update(obj);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 更新所有對象* */public boolean updateAll(Collection col) {if(col==null||col.size()==0) return false;Session session = this.openSession();Transaction tx = session.beginTransaction(); // 開啟事物int count = 0;try {Iterator iterator = col.iterator();while(iterator.hasNext()){count++;session.update(iterator.next());if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER個數(shù)據(jù)作為一個處理單元session.flush(); //保持與數(shù)據(jù)庫數(shù)據(jù)的同步session.clear();//清除內(nèi)部緩存的全部數(shù)據(jù),及時釋放出占用的內(nèi)存}}tx.commit(); // 提交事物 } catch (Exception e) {e.printStackTrace();tx.rollback();return false;}this.closeSession(session);return true;}/*** 保存或更新* */public boolean saveOrUpdate(Object obj) {try {this.hibernateTemplate.saveOrUpdate(obj);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 保存或更新所有實體* */public boolean saveOrUpdateAll(Collection col) {Session session = this.openSession();Transaction tx = session.beginTransaction(); // 開啟事物int count = 0;try {Iterator iterator = col.iterator();while(iterator.hasNext()){count++;session.saveOrUpdate(iterator.next());if(count%this.BATCH_NUMBER==0){ //以每BATCH_NUMBER個數(shù)據(jù)作為一個處理單元session.flush(); //保持與數(shù)據(jù)庫數(shù)據(jù)的同步session.clear();//清除內(nèi)部緩存的全部數(shù)據(jù),及時釋放出占用的內(nèi)存}}tx.commit(); // 提交事物 } catch (Exception e) {e.printStackTrace();tx.rollback();return false;}this.closeSession(session);return true;}/*** 得到Session ,spring自動管理session,不需要手動關閉* */public Session getCurrentSession() throws HibernateException { // return this.hibernateTemplate.getSessionFactory().getCurrentSession();return this.hibernateTemplate.getSessionFactory().openSession();}/*** 根據(jù)原生sql語句進行查詢,返回對象集合 * String sql 原生sql語句* Class clazz 為類 String[] fields* 必需為對象字段屬性 * 例子: Sql : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */public List<Object> findBySql(String sql, Class clazz, String[] fields) {return parseObjectToList(this.getCurrentSession().createSQLQuery(sql).list(), clazz, fields);}/*** 根據(jù)原生sql語句進行查詢,返回對象集合 * String sql 原生sql語句 * String[] fields 可以不為對象字段屬性 * 例子:* Sql : select username ,userage from user; * fields = { "name","age" }; * 返回* map1 = { name="張三",age=30}; map2 = { name="李四",age=18}; * list = { map1 ,map2}* * */public List<Map<String,Object>> findBySql(String sql, String[] fields) {return parseObjectToMap(this.getCurrentSession().createSQLQuery(sql).list(), fields);}/*** 對hibernate查詢到object[]數(shù)組進行解析,并返回List<Map>集合* */private List parseObjectToMap(List dataList, String[] fields) {if (dataList == null || dataList.size() == 0 || fields == null|| fields.length == 0)return null;try {List list = new ArrayList();if (dataList != null && dataList.size() > 0) {for (int i = 0; i < dataList.size(); i++) {Map map = new HashMap();if(! dataList.get(i).getClass().isArray() ){for (int j = 0; j < fields.length; j++) {map.put(fields[j], dataList.get(i));}}else{Object[] dataObj = (Object[]) dataList.get(i);for (int j = 0; j < fields.length; j++) {String currentValue = null;try {currentValue = dataObj[j] + "";} catch (Exception e) {currentValue = null;}if (fields.length > j && fields[j] != null) {map.put(fields[j], currentValue);}}}list.add(map);}}return list;} catch (Exception e) {e.printStackTrace();return null;}}/*** 對hibernate查詢到object[]數(shù)組進行解析,并返回List<clazz>集合* */private List parseObjectToList(List dataList, Class clazz, String[] fields) {if(dataList==null||dataList.size()==0||clazz==null||fields==null||fields.length==0) return null;try {List list = new ArrayList();if (dataList != null && dataList.size() > 0) {for (int i = 0; i < dataList.size(); i++) {Object clazzObj = clazz.newInstance();if(! dataList.get(i).getClass().isArray() ){Field field = clazz.getDeclaredField(fields[0]);field.setAccessible(true);Object currentValue = null;try {currentValue = dataList.get(i);} catch (Exception e) {currentValue = null;}this.setFiled(clazzObj, field, currentValue);}else{Object[] dataObj = (Object[]) dataList.get(i);for (int j = 0; j < fields.length; j++) {Field field = clazz.getDeclaredField(fields[j]);field.setAccessible(true);Object currentValue = null;try {currentValue = dataObj[j];} catch (Exception e) {currentValue = null;} // if (field.getGenericType().toString().equals("class java.lang.String")) { // field.set(clazzObj, currentValue + ""); // } else if (field.getGenericType().toString().equals("class java.lang.Integer")) { // field.set(clazzObj, currentValue == null ? null: Integer.parseInt(currentValue + "")); // } else if (field.getGenericType().toString().equals("class java.lang.Double")) { // field.set(clazzObj, currentValue == null ? null: Double.parseDouble(currentValue + "")); // } else if (field.getGenericType().toString().equals("class java.util.Date")) { // field.set(clazzObj,currentValue == null ? null: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(currentValue.toString())); // } else if (field.getGenericType().toString().equals("class java.lang.Short")) { // field.set(clazzObj, currentValue == null ? null: Short.parseShort(currentValue.toString())); // } else { // field.set(clazzObj, currentValue); // }this.setFiled(clazzObj, field, currentValue);}}list.add(clazzObj);}}return list;} catch (Exception e) {e.printStackTrace();return null;}}private void setFiled(Object clazzObj,Field field,Object value){if(clazzObj==null||field==null) return ;try{if (field.getGenericType().toString().equals("class java.lang.String")) {field.set(clazzObj, value + "");} else if (field.getGenericType().toString().equals("class java.lang.Integer")) {field.set(clazzObj, value == null ? null: Integer.parseInt(value + ""));} else if (field.getGenericType().toString().equals("class java.lang.Double")) {field.set(clazzObj, value == null ? null: Double.parseDouble(value + ""));} else if (field.getGenericType().toString().equals("class java.util.Date")) {field.set(clazzObj,value == null ? null: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value.toString()));} else if (field.getGenericType().toString().equals("class java.lang.Short")) {field.set(clazzObj, value == null ? null: Short.parseShort(value.toString()));} else {field.set(clazzObj, value);}}catch(Exception e ){e.printStackTrace();}}/*** 根據(jù)原生sql語句查詢 entity必須為hibernate映射的實體* */public List<Object> findBySql(String sql, Class entity) {return this.getCurrentSession().createSQLQuery(sql).addEntity(entity).list();}/*** 根據(jù)hql查詢* */public List findByHql(String hql) {return this.hibernateTemplate.find(hql);}/*** 根據(jù)id查詢* */public Object get(Class c, Serializable id) {if(c==null||id==null) return null;return (Object) this.hibernateTemplate.get(c, id);}/*** 根據(jù)id查詢* */public Object load(Class c, Serializable id) {return (Object) this.hibernateTemplate.load(c, id);}/*** 根據(jù)Id更新對象指定的屬性* */public boolean updateOneByProperty(Class clazz, Serializable id,String pName, Object pValue) {String hql = "update " + clazz.getName() + " entity set entity."+ pName + " = '" + pValue + "' where entity.id = " + id;try {this.hibernateTemplate.bulkUpdate(hql);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 根據(jù)Id更新指定的多個屬性* */public boolean updateOneByPropertys(Class clazz, Serializable id,List<String> pName, List pValue) {if(clazz==null||id==null||pName==null||pName.size()==0||pValue==null||pValue.size()==0) return false;String hql = "update " + clazz.getName() + " entity set entity.";int maxIndex = pName.size() - 1;for (int i = 0; i < maxIndex; i++) {hql += pName.get(i) + " = '" + pValue.get(i) + "', entity.";}hql += pName.get(maxIndex) + " = '" + pValue.get(maxIndex)+ "'where entity.id = " + id;try {this.hibernateTemplate.bulkUpdate(hql);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 根據(jù)id更新多個屬性* */public boolean updateOneByPropertys(Class clazz, Serializable id,Map<String,Object> map) {if(clazz==null||id==null||map==null||map.size()==0) return false; // String[] clazzNameArray = clazz.getName().replace(".", "#").split("#"); // String clazzName = clazzNameArray[clazzNameArray.length-1];String hql = "update " + clazz.getName() + " entity set entity.";Set set = map.entrySet();if (set != null) {Iterator iterator = set.iterator();int i = 0;while (iterator.hasNext()) {Entry entry = (Entry) iterator.next();Object key = entry.getKey();Object value = entry.getValue();hql += key + " = '" + value + "' , entity.";i++;if(i==set.size()-1) break;}Entry entry = (Entry) iterator.next();Object key = entry.getKey();Object value = entry.getValue();hql += key + " = '" + value + "' ";}hql += " where entity.id = " + id;try {this.hibernateTemplate.bulkUpdate(hql);} catch (Exception e) {e.printStackTrace();return false;}return true;} /*** 動態(tài)命名查詢,返回對象集合 * final String queryName 為sql或者hql命名查詢* String[] fields 必需為查詢字段* 例子: queryName : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * Map<String, ?> parameters 為參數(shù){name=zhangsan,age=3}* 返回格式* map1 = { name=zhangsan,age=1 }, map2 = { name=zhangsan2,age=2 }, map3 = { name=zhangsan3,age=3 }* list = {map1,map2,map3}* * */public List<Map<String, Object>> findByNamedQuery(final String queryName, final String[] fields,final Map<String, ?> parameters) {if( queryName==null || parameters==null || parameters.size()==0 ||fields==null||fields.length == 0) return null;StatementTemplate statementTemplate = templateCache.get(queryName);String statement = processTemplate(statementTemplate,parameters);if(statementTemplate.getType() == StatementTemplate.TYPE.HQL){return this.parseObjectToMap(this.findByHQL(statement), fields) ;}else{return this.parseObjectToMap(this.findBySql(statement),fields);}}/*** 動態(tài)命名查詢,返回對象集合 * final String queryName 為sql或者hql命名查詢* Class clazz 為類對象* String[] fields 必需為查詢字段* Map<String, ?> parameters 為參數(shù){name=zhangsan,age=3}* 例子: queryName : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */public List<Object> findByNamedQuery(final String queryName,Class clazz, final String[] fields,final Map<String, ?> parameters) {if( queryName==null || clazz==null || fields==null || fields.length ==0 || parameters==null || parameters.size()==0 ) return null;StatementTemplate statementTemplate = templateCache.get(queryName);String statement = processTemplate(statementTemplate,parameters);if(statementTemplate.getType() == StatementTemplate.TYPE.HQL){return this.parseObjectToList(this.findByHQL(statement), clazz, fields);}else{return this.parseObjectToList(this.findBySql(statement), clazz, fields);}}private String processTemplate(StatementTemplate statementTemplate,Map<String, ?> parameters){StringWriter stringWriter = new StringWriter();try {statementTemplate.getTemplate().process(parameters, stringWriter);} catch (Exception e) {e.printStackTrace();}return stringWriter.toString();}/*** 按HQL查詢對象列表.* * @param values 數(shù)量可變的參數(shù),按順序綁定.*/@SuppressWarnings("unchecked")public List findByHQL(final String hql, final Object... values) {List list = createHQLQuery(hql, values).list();return list;}/*** 按sql查詢對象列表.* * @param values 命名參數(shù),按名稱綁定.*/@SuppressWarnings("unchecked")public List findBySql(final String sql, final Object... values) {return createSQLQuery(sql, values).list();}/*** 根據(jù)查詢SQL與參數(shù)列表創(chuàng)建Query對象.* 與find()函數(shù)可進行更加靈活的操作.* @param sqlQueryString sql語句* * @param values 數(shù)量可變的參數(shù),按順序綁定.*/private Query createSQLQuery(final String sqlQueryString, final Object... values) {Query query = this.getCurrentSession().createSQLQuery(sqlQueryString);if (values != null) {for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}}return query;}/*** 根據(jù)查詢HQL與參數(shù)列表創(chuàng)建Query對象.* 與find()函數(shù)可進行更加靈活的操作.* * @param values 數(shù)量可變的參數(shù),按順序綁定.*/private Query createHQLQuery(final String queryString, final Object... values) {Query query = this.getCurrentSession().createQuery(queryString);if (values != null) {for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}}return query;}/*** 關閉session* */public void closeSession(Session session) {if (session != null) {try {session.close();} catch (Exception e) {e.printStackTrace();}session = null;}}@Overridepublic void afterPropertiesSet() throws Exception {templateCache = new HashMap<String, StatementTemplate>();if(this.dynamicStatementBuilder == null){this.dynamicStatementBuilder = new DefaultDynamicHibernateStatementBuilder();}dynamicStatementBuilder.init();Map<String,String> namedHQLQueries = dynamicStatementBuilder.getNamedHQLQueries();Map<String,String> namedSQLQueries = dynamicStatementBuilder.getNamedSQLQueries();Configuration configuration = new Configuration();configuration.setNumberFormat("#");StringTemplateLoader stringLoader = new StringTemplateLoader();for(Entry<String, String> entry : namedHQLQueries.entrySet()){stringLoader.putTemplate(entry.getKey(), entry.getValue());templateCache.put(entry.getKey(), new StatementTemplate(StatementTemplate.TYPE.HQL,new Template(entry.getKey(),new StringReader(entry.getValue()),configuration)));}for(Entry<String, String> entry : namedSQLQueries.entrySet()){stringLoader.putTemplate(entry.getKey(), entry.getValue());templateCache.put(entry.getKey(), new StatementTemplate(StatementTemplate.TYPE.SQL,new Template(entry.getKey(),new StringReader(entry.getValue()),configuration)));}configuration.setTemplateLoader(stringLoader);} }? ? ? ? ? BaseServiceImpl.java
package com.system.hibernate;import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map;import javax.annotation.Resource;import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Criterion; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;@Service("baseService") public class BaseServiceImpl {@Resource(name="baseDao")private BaseDaoImpl baseDao;/*** 根據(jù)sql插入或者更新* */public void insertOrUpdateBySql(String sql){this.baseDao.insertOrUpdateBySql(sql);}/*** 保存對象* */public boolean save(Object obj) {return this.baseDao.save(obj);}/*** 保存所有對象* */public boolean saveAll(Collection col) {return this.baseDao.saveAll(col);}/*** 刪除對象* */public boolean delete(Object obj) {return this.baseDao.delete(obj);}/*** 按id刪除對象.*/public boolean delete(Class clazz, Serializable id) {return this.baseDao.delete(clazz, id);}/*** 按id列表獲取對象列表.*/public List get(Class clazz, Collection ids) {return this.baseDao.get(clazz, ids);}/*** 按Criteria查詢對象列表.* * @param criterions 數(shù)量可變的Criterion.*/public List find(Class clazz, Criterion... criterions) {return this.baseDao.find(clazz, criterions);}/*** 根據(jù)Criterion條件創(chuàng)建Criteria.* 與find()函數(shù)可進行更加靈活的操作.* @param criterions 數(shù)量可變的Criterion.*/public Criteria createCriteria(Class clazz, Criterion... criterions) {return this.baseDao.createCriteria(clazz, criterions);}/*** 取得對象的主鍵名.*/public String getIdName(Class clazz) {return this.baseDao.getIdName(clazz);}/*** 刪除所有對象* */public boolean deleteAll(Collection col) {return this.baseDao.deleteAll(col);}/*** 更新對象* */public boolean update(Object obj) {return this.baseDao.update(obj);}/*** 更新所有對象* */public boolean updateAll(Collection col) {return this.baseDao.updateAll(col);}/*** 保存或更新* */public boolean saveOrUpdate(Object obj) {return this.baseDao.saveOrUpdate(obj);}/*** 保存或更新所有實體* */public boolean saveOrUpdateAll(Collection col) {return this.baseDao.saveOrUpdateAll(col);}/*** 根據(jù)原生sql語句進行查詢,返回對象集合 * String sql 原生sql語句* Class clazz 為類 String[] fields* 必需為對象字段屬性 * 例子: Sql : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */public List findBySql(String sql, Class clazz, String[] fields) {return this.baseDao.findBySql(sql, clazz, fields);}/*** 根據(jù)原生sql語句進行查詢,返回對象集合 * String sql 原生sql語句 * String[] fields 可以不為對象字段屬性 * 例子:* Sql : select username ,userage from user; * fields = { "name","age" }; * 返回* map1 = { name="張三",age=30}; map2 = { name="李四",age=18}; * list = { map1 ,map2}* * */public List<Map<String,Object>> findBySql(String sql, String[] fields) {return this.baseDao.findBySql(sql, fields);}/*** 根據(jù)原生sql語句查詢 entity必須為hibernate映射的實體* */public List findBySql(String sql, Class entity) {return this.baseDao.findBySql(sql, entity);}/*** 根據(jù)hql查詢* */public List findByHql(String hql) {return this.baseDao.findByHql(hql);}/*** 根據(jù)id查詢* */public Object get(Class c, Serializable id) {return this.baseDao.get(c, id);}/*** 根據(jù)id查詢* */public Object load(Class c, Serializable id) {return this.baseDao.load(c, id);}/*** 根據(jù)Id更新對象指定的屬性* */public boolean updateOneByProperty(Class clazz, Serializable id,String pName, Object pValue) {return this.baseDao.updateOneByProperty(clazz, id, pName, pValue);}/*** 根據(jù)Id更新指定的多個屬性* */public boolean updateOneByPropertys(Class clazz, Serializable id,List<String> pName, List pValue) {return this.baseDao.updateOneByPropertys(clazz, id, pName, pValue);}/*** 根據(jù)id更新多個屬性* */public boolean updateOneByPropertys(Class clazz, Serializable id,Map<String, Object> map) {return this.baseDao.updateOneByPropertys(clazz, id, map);}/*** 按HQL查詢對象列表.* * @param values 數(shù)量可變的參數(shù),按順序綁定.*/public List findByHQL(String hql, Object... values) {return this.baseDao.findByHQL(hql, values);}/*** 根據(jù)sql查詢* */public List findBySql(String sql, Object... values) {return this.baseDao.findBySql(sql, values);}/*** 動態(tài)命名查詢,返回對象集合 * final String queryName 為sql或者hql命名查詢* Class clazz 為類對象* String[] fields 必需為查詢字段* Map<String, ?> parameters 為參數(shù){name=zhangsan,age=3}* 例子: queryName : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * 返回格式 list = { user1,user2,user3... }* * */public List<Object> findByNamedQuery(String queryName,Class clazz, String[] fields, Map<String, ?> parameters) {return this.baseDao.findByNamedQuery(queryName, clazz, fields, parameters);}/*** 動態(tài)命名查詢,返回對象集合 * final String queryName 為sql或者hql命名查詢* String[] fields 必需為查詢字段* 例子: queryName : select username as name ,userage as age from user;* User : private String name , private int age * clazz = User.class * fields ={ "name","age" }; //注意 sql和fields必需一致,并且fields為User的字段屬性 * Map<String, ?> parameters 為參數(shù){name=zhangsan,age=3}* 返回格式* map1 = { name=zhangsan,age=1 }, map2 = { name=zhangsan2,age=2 }, map3 = { name=zhangsan3,age=3 }* list = {map1,map2,map3}* * */public List<Map<String, Object>> findByNamedQuery(String queryName,String[] fields, Map<String, ?> parameters) {return this.baseDao.findByNamedQuery(queryName, fields, parameters);}}? ? ? ? ? ?DefaultDynamicHibernateStatementBuilder.java
package com.system.hibernate;import java.io.IOException; import java.util.Map;/*** 動態(tài)sql/hql語句組裝器* @author WangXuzheng**/ public interface DynamicHibernateStatementBuilder {/*** hql語句map* @return*/public Map<String,String> getNamedHQLQueries();/*** sql語句map* @return*/public Map<String,String> getNamedSQLQueries();/*** 初始化* @throws IOException */public void init() throws IOException; }DynamicHibernateStatementBuilder.javapackage com.system.hibernate;import java.io.IOException; import java.util.Map;/*** 動態(tài)sql/hql語句組裝器* @author WangXuzheng**/ public interface DynamicHibernateStatementBuilder {/*** hql語句map* @return*/public Map<String,String> getNamedHQLQueries();/*** sql語句map* @return*/public Map<String,String> getNamedSQLQueries();/*** 初始化* @throws IOException */public void init() throws IOException; }? ? ? ? ???DynamicStatementDTDEntityResolver.java
package com.system.hibernate;import java.io.IOException; import java.io.InputStream; import java.io.Serializable;import org.hibernate.internal.util.ConfigHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException;/*** hibernate動態(tài)sql dtd解析器* @author WangXuzheng**/ public class DynamicStatementDTDEntityResolver implements EntityResolver, Serializable{private static final long serialVersionUID = 8123799007554762965L;private static final Logger LOGGER = LoggerFactory.getLogger( DynamicStatementDTDEntityResolver.class );private static final String HOP_DYNAMIC_STATEMENT = "http://localhost:8080/dtd/"; // // public InputSource resolveEntity(String publicId, String systemId) { // InputSource source = null; // returning null triggers default behavior // if ( systemId != null ) { // LOGGER.debug( "trying to resolve system-id [" + systemId + "]" ); // if ( systemId.startsWith( HOP_DYNAMIC_STATEMENT ) ) { // LOGGER.debug( "recognized hop dyanmic statement namespace; attempting to resolve " ); // source = resolveOnClassPath( publicId, systemId, HOP_DYNAMIC_STATEMENT ); // } // } // return source; // } // // private InputSource resolveOnClassPath(String publicId, String systemId, String namespace) { // InputSource source = null; // String path = systemId.substring( namespace.length() ); // InputStream dtdStream = resolveInHibernateNamespace( path ); // if ( dtdStream == null ) { // LOGGER.debug( "unable to locate [" + systemId + "] on classpath" ); // if ( systemId.substring( namespace.length() ).indexOf( "2.0" ) > -1 ) { // LOGGER.error( "Don't use old DTDs, read the Hibernate 3.x Migration Guide!" ); // } // } // else { // LOGGER.debug( "located [" + systemId + "] in classpath" ); // source = new InputSource( dtdStream ); // source.setPublicId( publicId ); // source.setSystemId( systemId ); // } // return source; // }protected InputStream resolveInHibernateNamespace(String path) {return this.getClass().getClassLoader().getResourceAsStream( path );}protected InputStream resolveInLocalNamespace(String path) {try {return ConfigHelper.getUserResourceAsStream( path );}catch ( Throwable t ) {return null;}}@Overridepublic InputSource resolveEntity(String publicId, String systemId)throws SAXException, IOException {// TODO Auto-generated method stubreturn null;} }? ? ? ? ? Reflections.java
package com.system.hibernate;import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;public class Reflections {/** * 通過反射,獲得定義Class時聲明的父類的范型參數(shù)的類型. * 如public BookManager extends GenricManager<Book> * * @param clazz The class to introspect * @return the first generic declaration, or <code>Object.class</code> if cannot be determined */ public static Class getSuperClassGenricType(Class clazz) { return getSuperClassGenricType(clazz, 0); } /** * 通過反射,獲得定義Class時聲明的父類的范型參數(shù)的類型. * 如public BookManager extends GenricManager<Book> * * @param clazz clazz The class to introspect * @param index the Index of the generic ddeclaration,start from 0. */ public static Class getSuperClassGenricType(Class clazz, int index) throws IndexOutOfBoundsException { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { return Object.class; } if (!(params[index] instanceof Class)) { return Object.class; } return (Class) params[index]; } }? ? ? ? ? StatementTemplate.java
package com.system.hibernate; import freemarker.template.Template;public class StatementTemplate {private Template template;private TYPE type;public StatementTemplate(TYPE type, Template template) {this.template = template;this.type = type;}public TYPE getType() {return type;}public void setType(TYPE type) {this.type = type;}public Template getTemplate() {return template;}public void setTemplate(Template template) {this.template = template;}public static enum TYPE {HQL,SQL}}? ? ? ? ?DynamicHibernateStatementBuilder.java
package com.system.hibernate;import java.io.IOException; import java.util.Map;/*** 動態(tài)sql/hql語句組裝器* @author WangXuzheng**/ public interface DynamicHibernateStatementBuilder {/*** hql語句map* @return*/public Map<String,String> getNamedHQLQueries();/*** sql語句map* @return*/public Map<String,String> getNamedSQLQueries();/*** 初始化* @throws IOException */public void init() throws IOException; }?業(yè)務層
? ?Dao層
? ? ? ? UserDao.java
package com.business.dao;import java.util.Collection; import java.util.List;import com.business.entity.User;public interface UserDao {}? ? ? ? UserDaoImpl.java
package com.business.dao.impl;import org.springframework.stereotype.Repository;import com.business.dao.UserDao; import com.business.entity.User; import com.system.hibernate.BaseDaoImpl;@Repository("userDao") public class UserDaoImpl extends BaseDaoImpl implements UserDao {}? ? Service層
? ? ? ? ? UserService.java
package com.business.service;import java.io.Serializable; import java.util.Collection; import java.util.List;import com.business.entity.User;public interface UserService {}UserServiceImpl.java
package com.business.service.impl;import java.io.Serializable; import java.util.Collection; import java.util.List;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.business.dao.UserDao; import com.business.dao.impl.UserDaoImpl; import com.business.entity.User; import com.business.service.UserService; import com.system.hibernate.BaseServiceImpl;@Service("userService") public class UserServiceImpl extends BaseServiceImpl implements UserService {@Resource(name="userDao")private UserDao userDao;}? ? 實體映射
? ? ? ? User.java
package com.business.entity;import java.util.Date;public class User {private int id;private String name; //姓名private Date birthday; //生日private String address ; //地址private int age ; //年齡public User(String name, Date birthday) {this.name = name;this.birthday = birthday;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}User.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><class table="user" name="com.business.entity.User" ><id column="id" name="id" type="java.lang.Integer"><generator class="native"/></id><property column="name" name="name" type="java.lang.String" /><property column="address" name="address" type="java.lang.String" /><property column="age" name="age" type="java.lang.Integer" /><property column="birthday" name="birthday" type="java.util.Date" /></class></hibernate-mapping>? ? Dtd校驗文件(dynamic-hibernate-statement-1.0.dtd)
<!-- HOP Hibernate Dynamic Statement Mapping DTD.<!DOCTYPE dynamic-hibernate-statement SYSTEM ">這個文件時用來定義動態(tài)參數(shù)語句,類似itabis--><!--The document root.--><!ELEMENT dynamic-hibernate-statement ((hql-query|sql-query)* )><!-- default: none --><!-- The query element declares a named Hibernate query string --><!ELEMENT hql-query (#PCDATA)><!ATTLIST hql-query name CDATA #REQUIRED><!-- The sql-query element declares a named SQL query string --><!ELEMENT sql-query (#PCDATA)><!ATTLIST sql-query name CDATA #REQUIRED>案例源碼下載地址
http://download.csdn.net/detail/jianfpeng241241/9686192
總結
以上是生活随笔為你收集整理的(4) hibernate增删查改+批量操作+类似Mybatis动态sql的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (3) Hibernate的查询 标准(
- 下一篇: (5)hibernate多对一,一对多,