(4) hibernate增删查改+批量操作+类似Mybatis动态sql

    xiaoxiao2021-08-22  104

     简介

    采用spring + hibernate + freemaker+ maven搭建起来的一个hibernate增删查改和

    类似mybatis动态sql查询的一个案例

     增删查改demo + 动态sql 

     数据库表(只有一张USER表)

    动态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测试增删查改和动态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; /** * 保存单个用户方法 * */ @Test public void testSave(){ User u = new User("zhangsan",new Date() ); this.userService.save(u); } /** * 批量保存多个用户方法 * */ @Test public 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); } /** * 根据多个id查询 * */ @Test public 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() ); } } /** * 取得对象的主键名. */ @Test public void testGetIdName() { String idName = this.userService.getIdName(User.class); System.out.println("idName = " + idName); } /** * 删除所有对象 * */ @Test public 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); } /** * 更新对象 * */ @Test public void testUpdate() { int id = 39100; User user = (User) this.userService.get(User.class,id); user.setName("update name"); this.userService.update(user); } /** * 根据id查询 * */ @Test public void testGetById() { int id = 39100; User user = (User) this.userService.get(User.class,id); System.out.println("name = " + user.getName() ); } /** * 更新所有对象 * */ @Test public 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); } /** * 保存或更新 * */ @Test public void testSaveOrUpdate(){ User u = new User("zhangsan2",new Date() ); u.setId(1); this.userService.saveOrUpdate(u); } /** * 保存或更新所有实体 * */ @Test public 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); } /** * 根据原生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... } * * */ @Test public 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") ); } } } /** * 根据原生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... } * * */ @Test public 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() ); } } } /** * 根据hql查询 * */ @Test public 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() ); } } } /** * 根据id查询 * */ @Test public 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() ); } /** * 根据Id更新对象指定的属性 * */ @Test public 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); } /** * 根据id更新多个属性 * */ @Test public void testUpdateOneByPropertys2() { int id = 39300; Map map = new HashMap(); map.put("name", "zhangsan222"); map.put("age", 1 ); this.userService.updateOneByPropertys(User.class, id, map); } /** * 动态命名查询,返回对象集合 * 返回格式 * map1 = { name=zhangsan,age=1 }, map2 = { name=zhangsan2,age=2 }, map3 = { name=zhangsan3,age=3 } * list = {map1,map2,map3} * * */ @Test public 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") ); } } /** * 动态命名查询,返回对象集合 * 返回格式 * map1 = { name=zhangsan,age=1 }, map2 = { name=zhangsan2,age=2 }, map3 = { name=zhangsan3,age=3 } * list = {map1,map2,map3} * * */ @Test public 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") ); } } /** * 动态命名查询,返回对象集合 * 返回格式 * list = {user1,user2,user3} * * */ @Test public 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() ); } } @Test public 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()); } } /** * 动态命名查询,返回对象集合 * final String queryName hql命名查询 * Class clazz 为类对象 * String[] fields 必需为查询字段 * Map<String, ?> parameters 为参数{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... } * * */ @Test public 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 数量可变的参数,按顺序绑定. */ @Test public 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} * */ @Test public 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} * */ @Test public 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") ); } } /** * 根据sql插入或者更新 * */ @Test public void testInsertOrUpdateBySql(){ String sql = " INSERT INTO USER(id,NAME,age)VALUES(2,'name',33) "; this.userService.insertOrUpdateBySql(sql); } }

     源码介绍

     案例结构图

     动态sql和hql

    实现原理参考以下博客

    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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://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数据源 --> <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内setdatasource提供数据源 --> <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> <!-- 业务逻辑层切面配置 --> <aop:config> <aop:pointcut id="servicePointcut" expression="execution( * com.business.service..*.*(..) )" /> <aop:advisor pointcut-ref="servicePointcut" advice-ref="txAdvice" /> </aop:config> <!-- 系统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()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会。 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的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); @Autowired private SessionFactory sessionFactory; @Autowired private HibernateTemplate hibernateTemplate; private final int BATCH_NUMBER = 100;//批量操作数 /** * 模板缓存 */ protected Map<String, StatementTemplate> templateCache; @Autowired protected DynamicHibernateStatementBuilder dynamicStatementBuilder; // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步 private ThreadLocal<Session> session = null; /** * 创建session,需要手动关闭 * */ public Session openSession() { return sessionFactory.openSession(); } /** * 根据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个数据作为一个处理单元 session.flush(); //保持与数据库数据的同步 session.clear();//清除内部缓存的全部数据,及时释放出占用的内存 } } 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 数量可变的Criterion. */ @SuppressWarnings("unchecked") public List find(Class clazz,final Criterion... criterions) { return createCriteria(clazz,criterions).list(); } /** * 根据Criterion条件创建Criteria. * 与find()函数可进行更加灵活的操作. * @param criterions 数量可变的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个数据作为一个处理单元 session.flush(); //保持与数据库数据的同步 session.clear();//清除内部缓存的全部数据,及时释放出占用的内存 } } 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个数据作为一个处理单元 session.flush(); //保持与数据库数据的同步 session.clear();//清除内部缓存的全部数据,及时释放出占用的内存 } } 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个数据作为一个处理单元 session.flush(); //保持与数据库数据的同步 session.clear();//清除内部缓存的全部数据,及时释放出占用的内存 } } 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(); } /** * 根据原生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); } /** * 根据原生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[]数组进行解析,并返回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[]数组进行解析,并返回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(); } } /** * 根据原生sql语句查询 entity必须为hibernate映射的实体 * */ public List<Object> findBySql(String sql, Class entity) { return this.getCurrentSession().createSQLQuery(sql).addEntity(entity).list(); } /** * 根据hql查询 * */ public List findByHql(String hql) { return this.hibernateTemplate.find(hql); } /** * 根据id查询 * */ public Object get(Class c, Serializable id) { if(c==null||id==null) return null; return (Object) this.hibernateTemplate.get(c, id); } /** * 根据id查询 * */ public Object load(Class c, Serializable id) { return (Object) this.hibernateTemplate.load(c, id); } /** * 根据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; } /** * 根据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; } /** * 根据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; } /** * 动态命名查询,返回对象集合 * 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 为参数{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); } } /** * 动态命名查询,返回对象集合 * final String queryName 为sql或者hql命名查询 * Class clazz 为类对象 * String[] fields 必需为查询字段 * Map<String, ?> parameters 为参数{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 数量可变的参数,按顺序绑定. */ @SuppressWarnings("unchecked") public List findByHQL(final String hql, final Object... values) { List list = createHQLQuery(hql, values).list(); return list; } /** * 按sql查询对象列表. * * @param values 命名参数,按名称绑定. */ @SuppressWarnings("unchecked") public List findBySql(final String sql, final Object... values) { return createSQLQuery(sql, values).list(); } /** * 根据查询SQL与参数列表创建Query对象. * 与find()函数可进行更加灵活的操作. * @param sqlQueryString sql语句 * * @param values 数量可变的参数,按顺序绑定. */ 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; } /** * 根据查询HQL与参数列表创建Query对象. * 与find()函数可进行更加灵活的操作. * * @param values 数量可变的参数,按顺序绑定. */ 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; } } @Override public 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; /** * 根据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 数量可变的Criterion. */ public List find(Class clazz, Criterion... criterions) { return this.baseDao.find(clazz, criterions); } /** * 根据Criterion条件创建Criteria. * 与find()函数可进行更加灵活的操作. * @param criterions 数量可变的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); } /** * 根据原生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); } /** * 根据原生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); } /** * 根据原生sql语句查询 entity必须为hibernate映射的实体 * */ public List findBySql(String sql, Class entity) { return this.baseDao.findBySql(sql, entity); } /** * 根据hql查询 * */ public List findByHql(String hql) { return this.baseDao.findByHql(hql); } /** * 根据id查询 * */ public Object get(Class c, Serializable id) { return this.baseDao.get(c, id); } /** * 根据id查询 * */ public Object load(Class c, Serializable id) { return this.baseDao.load(c, id); } /** * 根据Id更新对象指定的属性 * */ public boolean updateOneByProperty(Class clazz, Serializable id, String pName, Object pValue) { return this.baseDao.updateOneByProperty(clazz, id, pName, pValue); } /** * 根据Id更新指定的多个属性 * */ public boolean updateOneByPropertys(Class clazz, Serializable id, List<String> pName, List pValue) { return this.baseDao.updateOneByPropertys(clazz, id, pName, pValue); } /** * 根据id更新多个属性 * */ public boolean updateOneByPropertys(Class clazz, Serializable id, Map<String, Object> map) { return this.baseDao.updateOneByPropertys(clazz, id, map); } /** * 按HQL查询对象列表. * * @param values 数量可变的参数,按顺序绑定. */ public List findByHQL(String hql, Object... values) { return this.baseDao.findByHQL(hql, values); } /** * 根据sql查询 * */ public List findBySql(String sql, Object... values) { return this.baseDao.findBySql(sql, values); } /** * 动态命名查询,返回对象集合 * final String queryName 为sql或者hql命名查询 * Class clazz 为类对象 * String[] fields 必需为查询字段 * Map<String, ?> parameters 为参数{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); } /** * 动态命名查询,返回对象集合 * 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 为参数{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; /** * 动态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.java package com.system.hibernate; import java.io.IOException; import java.util.Map; /** * 动态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动态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; } } @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { // TODO Auto-generated method stub return null; } }

              Reflections.java

    package com.system.hibernate; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Reflections { /** * 通过反射,获得定义Class时声明的父类的范型参数的类型. * 如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时声明的父类的范型参数的类型. * 如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; /** * 动态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; }

     业务层

       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 "> 这个文件时用来定义动态参数语句,类似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

    转载请注明原文地址: https://ju.6miu.com/read-676900.html

    最新回复(0)