当前位置: 代码迷 >> SQL >> tiny-sql地图1.0.1发布,用来弥补hibernate原生sql查询的不足
  详细解决方案

tiny-sql地图1.0.1发布,用来弥补hibernate原生sql查询的不足

热度:428   发布时间:2016-05-05 12:13:44.0
tiny-sqlmap1.0.1发布,用来弥补hibernate原生sql查询的不足

tiny-sqlmap的由来

最近给一个项目的框架做一些优化工作,该项目使用的是SSH这一套东西。似乎SSH在某些人眼里已经形成了一种惯性,做个web应用如果不用这SSH一套东西他都觉得那里不舒服似的,从不考虑自身应用的特点而选择合适的技术框架。不从实际出发乱选不合符本应用的技术框架必定带来不好的后果。对于我优化的这个项目而言,hibernate并没有给项目的开发效率提高,因为很多的查询都是使用了jdbcTemplate,导至以下问题:

?

1)??做个列表查询,用if判断查询条件,用StringBuffer拼装sql语句这样的代码占用整个业务方法,使得代码变得臃肿不可读。

2)??Sql写在程序文件里,用StringBuffer 拼装,这好比看了被压缩了得js代码一样难理解。

3)??SQL StringBuffer 拼装在应用随处可见,在Action,Service,Dao都有。

4)??SQL 注入得不到统一的控制。

?

Hibernate在对数据表的修改确实体现了极佳的开发效率,对上面这些问题的优化,我并没有选择推翻重来,而是在ibatis的基础上开发了个查询框架来解决上述的问题。

?

什么是tiny-sqlmap

?

tiny-sqlmap框架是从ibatis框架中剥离出来的,它非常的轻巧,也好扩冲。它仅提供sql的查询功能,对sql的查询操作,它支持SQL结果集映射、sql参数映射、动态sql的等功能。

?

tiny-sqlmap使用场景

如果你在便用hibernate的过程中也遇到像我这样的问题,你可以将其整合到你的项目中。

?

如果整合tiny-sqlmap

?

tiny-sqlmap通过SqlMapExecutor 接口向外部程序提供访问,先看看这个接口所提供的方法

?


?

它只提供了相关的数据查询方法。SqlMapExecutor对象由SqlMapExecutorFactoryBean工厂类,这是个spring的FactoryBean,所以要求在spring的环境中运行,SqlMapExecutorFactoryBean的配置如下:

?

?

Xml代码??收藏代码
  1. <bean?id="sqlMapExecutor"?class="org.jorgie.dal.tinysqlmap.client.SqlMapExecutorFactoryBean">??
  2. ??<property?name="dataSource">??
  3. ????<ref?bean="dataSource"/>??
  4. ??</property>??
  5. ??<property?name="sqlMapExecutorProperties">??
  6. ?????<props>??
  7. ???????<prop?key="sql_executor_class"?>org.jorgie.dal.tinysqlmap.engine.execution.LimitSqlExecutor</prop>??
  8. ???????<prop?key="dialect_class"?>org.jorgie.dal.tinysqlmap.engine.dialects.MySQLDialect</prop>??
  9. ?????</props>??
  10. ??</property>??
  11. ??<property?name="sqlMapConfigLocation">??
  12. ?????<list>??
  13. ???????<value>test/entity/sqlMap/testSqlMap.xml</value>??
  14. ???????<value>test/entity/sqlMap/demoSqlMap.xml</value>??
  15. ?????</list>??
  16. ??</property>??
  17. </bean>??

?

?

?

dataSource是spring中配置的数据源对象。在sqlMapExecutorProperties中配置两个属性的作用是为了实现List queryForList(String id, Object parameterObject, int startIndex, int limit)实现分页功能。对于sqlmap xml文件的配置,配置方法和ibatis是一致的,只不过它只支持select语句的配置。

?

? ? ? 如果保证与hibernate的事务一致?把tiny-sqlmap整合到你的应用中,你需要把你的事务管理器改成DataSourceTransactionManager,同时需要为配置在spring容器的LocalSessionFactoryBean对象将其useTransactionAwareDataSource属性设为true。 SqlMapExecutorFactoryBean内部会对数据源进行包装,通过使用TransactionAwareDataSourceProxy数据源来保证与hibernate在同一个事务中使用的是同一个Connection对象。

?

?

下面是具休的配置代码:LocalSessionFactoryBean

?

Xml代码??收藏代码
  1. <bean?id="sessionFactory"??
  2. ????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">??
  3. ??<property?name="dataSource">??
  4. ????<ref?bean="dataSource"?/>??
  5. ??</property>??
  6. ??<property?name="hibernateProperties">??
  7. ????<props>??
  8. ??????<prop?key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>??
  9. ??????<prop?key="hibernate.show_sql">true</prop>??
  10. ??????<prop?key="hibernate.generate_statistics">true</prop>??
  11. ??????<prop?key="hibernate.connection.release_mode">auto</prop>??
  12. ??????<prop?key="hibernate.autoReconnect">true</prop>??
  13. ??????<prop?key="hibernate.jdbc.batch_size">30</prop>??
  14. ????</props>??
  15. ??</property>??
  16. ??<property?name="mappingDirectoryLocations">???
  17. ?????<list>??
  18. ????????<value>classpath:test/entity/</value>??
  19. ?????</list>???
  20. ??</property>??
  21. ??<!--让hibernate?Session使用TransactionAwareDataSourceProxy数据源?-->???
  22. ??<property?name="useTransactionAwareDataSource"?value="true"></property>??
  23. </bean>??

?

? ? 事务管理器,将HibernateTransactionManager改为DataSourceTransactionManager

?

Xml代码??收藏代码
  1. <bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
  2. ????<property?name="dataSource"?ref="dataSource"?/>????
  3. </bean>???

?

?

?

?

? ?SqlMapExecutorFactoryBean对数据源的包装代码,这里的useTransactionAwareDataSource属生默认为true

?

Java代码??收藏代码
  1. if?(this.dataSource?!=?null)?{??
  2. ????DataSource?dataSourceToUse?=?this.dataSource;??
  3. ????if?(this.useTransactionAwareDataSource??
  4. ????????&&?!(this.dataSource?instanceof?TransactionAwareDataSourceProxy))?{??
  5. ????????dataSourceToUse?=?new?TransactionAwareDataSourceProxy(??
  6. ????????????????????????this.dataSource);??
  7. ????}??
  8. ????state.setDataSource(dataSourceToUse);??
  9. ????state.getConfig().getSqlMapExecutorImpl().setDataSource(dataSourceToUse);??
  10. }??

?

?

?

附上源码及库文件,欢迎便用!

?

转载(http://www.iteye.com/topic/1130793)?

?

?

?

  相关解决方案