已经有很长一段时间没有更新了,年底了比较忙,最近很多新加入的朋友在问jdbc这段,今天抽点空讲一下osmp-jdbc的封装。
osmp的jdbc相比其它框架的来讲主要有以下几点不同。
- 基于druid的多数据源管理
- 支持多种类型的数据库,目前支持mysql,oracle,mssql。
- 提供数据源动态创建和消毁
- 提供基于动态sql管理和解析
- 提供类似于mybaties的springTemplate的dao封装
最开始的时候我的想法很简单,给我一个数据库链接,给我一个sql语句,我就能给你想要的数据,结合osgi的动态性来实现。
先从动态数据源来说,从resources/META-INF/spring/jdbc-context.xml 配置文件当中我们可以看到,spring配置文件加载后,我们实例化了 com.osmp.jdbc.service.SqlStatementManager, com.osmp.jdbc.service.SqlStatementMonitor, com.osmp.jdbc.service.DataSourceManager, com.osmp.jdbc.service.DataSourceMonitor这四个类,分别为sql语句管理,sql语句监控,数据源管理,数据源监控。
DataSourceMonitor(数据源监控)实现spring 的 InitializingBean和 DisposableBean接口,实例化传入了数据源配置目录和数据源管理两个参数,bean初始时通过传入的数据源配置目录获取所有配置并解析后实例化DruidDataSource 添加到DataSourceManager中。 同时启了一个线程监控数据源配置目录,如果一旦有新增的配置后解析并添加到数据源管理里。代码如下
@Override public void afterPropertiesSet() throws Exception { Assert.notNull(dataSourceDir, "dataSource文件目录不能为空..."); Assert.notNull(dataSourceManager, "dataSourceManager未初始化..."); final File resFile = new File(dataSourceDir); Assert.isTrue(resFile.exists(), "dataSource文件目录不存在..."); filepath2datasourceNameMap.clear(); for(File file : resFile.listFiles()){ addDataSource(file.getName()); } new Thread(){ public void run(){ try { monitor(resFile); } catch (Exception e) { e.printStackTrace(); } } }.start(); }
文件监控使用的是jdk1.7的 WatchService 服务,这里不作详细介绍 ,有兴趣的同学自己百度吧。
private void monitor(File file) throws Exception{ watchService = FileSystems.getDefault().newWatchService(); file.toPath().register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE); while(running){ WatchKey watchKey = watchService.take(); List<WatchEvent<?>> events = watchKey.pollEvents(); if(events != null){ for(WatchEvent<?> e : events){ //事件处理 final WatchEvent<Path> watchEventPath = (WatchEvent<Path>)e; final Path filename = watchEventPath.context(); if(e.kind() == StandardWatchEventKinds.ENTRY_CREATE){ addDataSource(filename.toString()); }else if(e.kind() == StandardWatchEventKinds.ENTRY_DELETE){ removeDataSource(filename.toString()); } } } if(!watchKey.reset()){ watchKey.cancel(); logger.error("移除dataSource文件目录监控服务"); break; } } running = false; watchService.close(); }
只要数据源配置目录一旦有文件添加、删除、修改事件发生,都会进行相应的处理,新增、删除、修改数据源,这也是动态数据源的核心部分,我相信同学们看了后,在以后的项目当中也可以使用 WatchService 服务实现更多动态功能吧。切记WatchService 服务是 JDK1.7以后才提供的功能。
有了数据源后,我们更进一步的将数据源与springTemplate结合,通过JdbcTemplateManager来管理模板,通过 JdbcTemplateManager 的 addDataSource方法,根据数据库类型实例化不同数据库的模板并添加到JdbcTemplateManager里。
com.osmp.jdbc.service.JdbcTemplateManager
//添加数据源信息 public void addDataSource(DataSource ds,String catalog,DBType dbType){ if(ds == null || catalog == null || dbType == null) return; BaseTemplate jdbcTemplate = null; if(dbType.equals(DBType.SQLSERVER)){ jdbcTemplate = new MSSQLTemplate(); }else if(dbType.equals(DBType.MYSQL)){ jdbcTemplate = new MysqlTemplate(); }else{ jdbcTemplate = new OracleTemplate(); } jdbcTemplate.setOwnJdbcTemplate(new NamedParameterJdbcTemplate(ds)); jdbcTemplate.setTransactionManager(new DataSourceTransactionManager(ds)); //dsTransactionManager.setGlobalRollbackOnParticipationFailure(false); //指定主事务决定回滚 templates.put(catalog.toUpperCase(), jdbcTemplate); }
com.osmp.jdbc.support.JdbcTemplate 封装了大量的C,R,U,D操作,方便业务开发直接调用。
现在我们只需要一个数据源的标识加一句sql,我们就可以执行C,R,U,D操作了。
上面我们介绍了动态数据源这部分,下面我们该聊一聊动态sql了。我大概记得当时我是想直接在osgi环境下集成mybaties来着,好像研究了两周最后我放弃了,基于mybaties的开发习惯,自己写了一套类似于东东,有点儿重复造轮子吧。
其实实现也很简单:
sql配置文件 + 一个sql配置文件解析器 + 一个RowMapper实现类
首先我们定义了一个dtd文件用以限定sql 配置文件。
我们通过动态数据的方式,SqlStatementMonitor监听一个目录作为sql脚本xml的目录。当有sql配置脚本xml添加的时候就解析xml文件并保存到SqlStatmentManager里。
一旦有新的sql配置xml被添加后,就会进入SqlStatementMonitor.SqlUpdateTask.run() 方法被解析后加载到SqlStatementManager 里。
//sql文件更新任务 private class SqlUpdateTask implements Runnable { private File file; private boolean isDelete; public SqlUpdateTask(File file,boolean isDelete){ this.file = file; this.isDelete = isDelete; } public void run() { if(file == null) return; String filename = file.getAbsolutePath(); if(!filename.endsWith(".xml")){ return; } sqlStatementManager.removeSqls(filename); if(isDelete) return; sqlStatementManager.putSql(filename, SqlParserUtils.parse(file)); } }
SQL配置是类mybaties的配置。最开始想直接mybaties的解析部分,看了一下很难,还不如自己写了,所以基本上myabties支持的。osmp也基本支持,甚至支持更多的高级特性,比如include advanced等,有待同学们自己发掘,当时你也可以自己扩充。这部有兴趣的同学可以重构,将数据源与sql解析剥离出来。
osmp同时提供 JdbcDao封装,只需要sql配置xml里的 id + 数据源名称就可以返回数据了。这也对应上面提到的需求,给一个sql + 数据源链接 我返给你结果。。。
随便提一下。对于实体bean 和 ResultSet之间的转换是通过定义 Column注解来进行的。获取数据的时候 需要传入一个 实体.class 通过反射解析@Column 从 ResultSet里获取数据 详见 com.osmp.jdbc.define.tool.ToolsRowMapper
最后看一下 sql xml的定义例子
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!DOCTYPE sqls SYSTEM "osmp_sql.dtd"> <sqls> <select id="demo.queryuser"> select * from demo_user <where> <if test="name not empty"> and name=:name </if> <if test="age not empty"> and age=:age </if> </where> </select> <insert id="demo.adduser"> insert into demo_user(id,name,age,remark) values(:id,:name,:age,:remark) </insert> <delete id="demo.deluser"> delete demo_user where id=:id </delete> <update id="demo.upuser"> update demo_user set <if test="name not empty"> name = :name </if> <if test="age not empty"> name = :age </if> <if test="remark not empty"> remark = :remark </if> <where> id = :id </where> </update> <select id="demo.choose.when"> select x,y,z from xxx WITH ( NOLOCK ) where x in ( select x,y,z from yyy with(nolock) where ISNULL(x, '') != '' <choose> <when test="acctype == 0"><![CDATA[ and x=:x ]]></when> <when test="acctype == 1">and y=:y</when> </choose> ) </select> </sqls>
sql更多高级动态特性还有待朋友们自己去发掘,我们开发的时候只需要将 此sql的配置xml和 数据源的properties配置 分别放到 ${servicemix_home}/etc/sqls 和 ${servicemix_home}/etc/datasources 目录下,就会被动态解析保存和动态创建数据源。
最后一步,我们将JdbcFinderManager发布为一个osgi的服务供其它的bundle调用。
resource/META-INF/spring/jdbc-context.xml
<osgi:service interface="com.osmp.jdbc.support.JdbcFinderManager" ref="osmp.JdbcFinderManager"> </osgi:service>
接下来我们只需要写一个简单的demo调用他们就行了。
下一讲我们实战讲解怎么demo开发一个用户的增删改查。
相关推荐
《 OSGi实战》是学习OSGi的全面指导,利用与架构和开发人员相关的示例清楚地讲解OSGi概念,同时探讨了很多实践场景和技术,阐述了开发人员有多需要OSGi,怎么将OSGi嵌入其他容器中,将遗留系统移入OSGi的最佳实践,...
在OSGI实战教程中,首先需要了解OSGI(Open Services Gateway Initiative)是一个由众多IT公司共同制定的Java模块化标准规范,旨在实现软件组件的热插拔和服务动态管理。OSGI技术允许应用程序通过动态地安装、启动、...
### OSGI实战知识点概述 #### 一、序言与背景介绍 - **背景与动机**:作者在工作之初便对插件体系结构产生了浓厚兴趣,尤其关注ant、maven等构建工具及其插件系统。这表明作者对于软件模块化、可扩展性的重视。 - ...
为了弥补OSGi规范在应用指导方面的不足,四位活跃在OSGi开发第一线的技术专家联手打造了《OSGi实战》。《OSGi实战》面向OSGi规范的使用者,系统、全面、深入地阐述OSGi的重要特性及其使用方法。《OSGi实战》还介绍了...
6. **社区与资源**:介绍OSGI社区,相关的开源项目,以及获取更多帮助和信息的渠道。 7. **案例研究**:分析实际项目中的OSGI应用,展示其在解决特定问题上的效果。 通过这两本书的学习,读者不仅能掌握OSGI的基本...
资源名称:OSGi实战内容简介:为了弥补OSGi规范在应用指导方面的不足,四位活跃在OSGi开发第一线的技术专家联手打造了《OSGi实战》。《OSGi实战》面向OSGi规范的使用者,系统、全面、深入地阐述OSGi的重要特性及其...
四、OSGI在实际项目中的应用 1. 大型企业级应用:OSGI用于构建复杂的分布式系统,如Eclipse IDE、Apache Karaf等,通过模块化降低系统复杂度。 2. 云计算环境:在云环境中,OSGI可以实现资源的有效管理和弹性扩展,...
1. **开发环境搭建**:如何使用Eclipse和Equinox等工具创建和管理OSGI项目。 2. **案例分析**:通过具体的应用场景,如构建可插拔的Web服务器、数据库连接池等,展示OSGI的优势。 3. **部署与打包**:学习如何将OSGI...
**OSGI实战中文版** OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为独立的、可热插拔的模块,称为服务。这些服务可以互相发现并交互,提供了灵活的组件化开发环境。...
通过学习和实践《OSGI实战及源码》,开发者可以提高构建可扩展、灵活且易于维护的Java应用的能力,尤其在大型企业级项目中,OSGI的应用可以显著提升软件的可维护性和复用性。对于想要深入了解和应用OSGI的开发者来说...
网上收集的OSGI资料. 包括: OSGi原理与最佳实践(精选版).pdf OSGI实战和源码.rar osgi进阶.pdf Introduce.OSGi.ppt OSGi.in.action.ppt r4.cmpn.pdf r4.core.pdf r4.enterprise.pdf
在"OSGI实战"中,你将学习到如何使用OSGI来开发模块化的Java应用。实战部分通常会涵盖以下几个关键知识点: 1. **模块系统**:OSGI的基础是模块化,每个模块称为一个Bundle,它们有自己的类路径和生命周期。理解...
1. **构建OSGi应用**:使用Maven或Gradle的OSGi插件,可以方便地构建符合OSGi规范的模块化项目。 2. **Spring与OSGi集成**:Spring Dynamic Modules (SDM) 提供了将Spring应用与OSGi环境结合的工具,使Spring应用...
OSGI实战这本书是面向对OSGI技术感兴趣的Java开发者的入门资料,旨在提供全面的OSGI知识体系,帮助读者理解和应用OSGI框架。 在OSGI中,每个bundle都是一个独立的运行单元,有自己的类加载器,可以加载自己的类和...
1. Equinox:由Eclipse基金会开发,是OSGI参考实现之一,广泛用于Eclipse IDE和其他企业级项目。 2. Oscar:Apache Felix项目的一部分,也是一个流行的开源OSGI实现。 3. Knopflerfish:轻量级且功能丰富的OSGI框架...
- **5.1 Equinox**:作为Eclipse项目的一部分,Equinox是当前最流行的OSGi实现之一。这部分详细介绍了Equinox的核心功能、特点以及应用场景。 - **5.2 Oscar**:虽然提到Oscar,但未给出更多细节。通常,Oscar指的是...
《OSGI实战》这本书主要...通过《OSGI实战》这本书,读者将深入理解OSGI技术,并能将其应用于实际项目中,解决开发过程中的各种挑战。无论是初学者还是经验丰富的开发者,都能从中受益匪浅,提升Java开发的效率和质量。
《OSGi实战》一书由BlueDavy撰写,是一份详尽的OSGi入门与实战指南,适合初学者和有经验的开发者深入了解OSGi框架及其应用。以下是对该书籍核心知识点的总结: ### OSGi简介 OSGi(Open Service Gateway Initiative...
这个“OSGi实战 实例源代码”是BlueDavy的opendoc《OSGi实战》一书中的配套实践代码,为初学者提供了深入理解OSGi机制的宝贵资源。通过这些源代码,读者可以更好地掌握OSGi的核心概念,包括服务、模块化、依赖管理和...