南通最专业的开锁公司 南通最好的开锁公司 君威遥控器电池 君威专用汽车钥匙电池雷诺科雷傲汽车钥匙遥控器电池更换方法 南通开锁公司电话_南通修锁 换锁芯 开汽车锁 崇川区 港闸区 如皋 如东开锁 南通开锁公司电话 南通金钥匙开锁服务部-专业开修锁 换锁芯(正规公安工商备案) 南通开锁公司电话 南通开锁公司修锁 装锁电话|崇川区开锁|港闸区开锁 led吸顶灯光源 吸顶灯32w 吸顶灯 灯管 吸顶灯 节能灯泡 led吸顶灯灯泡 三头吸顶灯 led吸顶灯灯管 欧普圆形吸顶灯 55w吸顶灯 吸顶灯光源 旅游壶 真空保温 汉方养生壶 美的电热水壶15s08a2 半球牌电饭煲 美的 mg123-d hd2 飞科 三洋洗衣机全自动 新安怡 学饮杯 黑苦荞黄酮软胶囊 苦荞糖安胶囊 五彩凉山苦荞茶 苦荞茶250g 全胚芽黑苦荞茶500 内蒙特产苦荞茶 富贵康苦荞茶 苦荞面包邮 正中苦荞茶包邮 正中苦荞茶 包邮 苦荞香茶西部 苦荞香茶 西部 轩庆苦荞玫瑰鲜花饼 苦荞真空 苦荞500克 苦荞茶120 苦荞 真空 0.02安全套包邮0.2大力马鱼线0.4mm0.4鱼线0.5l氮纤维高压瓶007sh充电器007电子请柬00高达xn-raiser01102400018401背囊0-25微米千分尺03g101系列全套图集0-3个月婴儿连体哈衣05-08本田奥德赛05ffc23套机05版河南动感地带0603贴片电阻包06年款英派斯06斯巴鲁森林人cd机07军衔07军用水壶07款福克斯两厢07数码迷彩07速腾大灯总成 泰好大门锁 泰好豪华大门锁 cei超b级锁芯 玻璃橱门锁 指纹锁耶鲁4109 耶鲁凯特曼指纹锁 防盗挂锁包邮 包挂锁 包梁挂锁 新君威门锁 新君威门锁扣 指纹锁木门 太空铝黑色门锁 泰好浴室铜门锁 浴室门锁不锈钢 1178冷库门锁 南通配新桑塔纳2000 3000 时代超人 志俊汽车钥匙_配帕桑塔纳钥匙遥控器_帕萨特钥匙全丢重配崇川区 南通配宝来汽车钥匙_配宝来遥控器_宝来钥匙全丢如皋 南通配帕萨特汽车钥匙_配帕萨特遥控器_帕萨特钥匙全丢通州 南通配凯越汽车钥匙_配凯越遥控器_凯越钥匙全丢如东

  • 格子衬衣女 长袖 秋
  • t男恤 短袖 韩版包邮
  • 男士职业衬衫
  • 衬衫 女 长袖点点
  • 衬衫 素色 男 宽松 休闲
  • 职场气质衬衫女
  • t恤男短袖加大码不掉色
  • 帅T 小西装
  • 裤子棕色长裤男
  • 衬衣 女 灯芯绒
  • 衬衣 女商务
  • 女士职业衬衫短袖
  • 休闲裤 男 修身
  • jamesearl纯棉休闲长裤
  • 占姆士女式长袖衬衫
  • 男黑色商务休闲棉长裤
  • 女士长袖衬衫
  • 男士绿色休闲长裤
  • 全棉短袖衬衫 男 薄
  • 女士长袖纯棉衬衫
  • 秋裤男直筒
  • 马自达3汽车挂件吊坠饰品 高档琉璃汽车挂饰品蒙迪欧致胜汽车挂件吊坠饰品 高档琉璃汽车挂饰品 启辰D50汽车挂件吊坠饰品 高档琉璃汽车挂饰品起亚K2汽车挂件吊坠饰品 高档琉璃汽车挂饰品索纳塔汽车挂件吊坠饰品 高档琉璃汽车挂饰品天籁汽车挂件吊坠饰品 高档琉璃汽车挂饰品 天语SX4汽车挂件吊坠饰品 高档琉璃汽车挂饰品英朗GT汽车挂件吊坠饰品 高档琉璃汽车挂饰品英伦SC7汽车挂件吊坠饰品 高档琉璃汽车挂饰品自由舰汽车挂件吊坠饰品 高档琉璃汽车挂饰品雨燕汽车挂件吊坠饰品 高档琉璃汽车挂饰品雪佛兰迈锐宝汽车挂件吊坠饰品 高档琉璃汽车挂饰品

    秋冬季现代瑞纳 宝马5系 帕萨特 日产骐达专用汽车毛绒方向盘套 江苏省盐城市地图2014 最新版 江苏省卫星地图2014 最新版 百度地图-谷歌地图-中国地图-北京地图-搜狗地图google地图 广本凌派汽车座垫 凌派秋冬季汽车坐垫 四季通用 长安福特福克斯油耗详解 宝来汽车遥控钥匙电池 更换方法 图解宝来遥控钥匙的电池换法 宝骏630车钥匙遥控器电池更换步骤 更换方法 迈腾车钥匙电池 迈腾更换遥控器电池详解逍客汽车钥匙电池 遥控器逍客智能钥匙的电池更换步骤 新天籁智能遥控钥匙电池 新天籁智能钥匙如何更换纽扣电池 golf6 汽车钥匙遥控器换电池 图解高尔夫6遥控钥匙的电池换法 长安福特福克斯加速时间详解[图] 福克斯汽车钥匙电池 福克斯钥匙电池更换作业 Q5车钥匙更换电池方法 图解新凯越车钥匙更换电池
  • 汽车坐垫 可爱
  • wrc汽车坐垫
  • 汽车坐垫套四季通用
  • 明锐冰丝 汽车坐套
  • 骐达汽车脚垫全包围
  • 三菱蓝瑟汽车坐垫
  • 捷达汽车脚垫 3d
  • 奥迪S7坐垫
  • 别克荣御坐垫
  • Jeep指南者坐垫
  • 力帆320坐垫
  • 路虎卫士坐垫
  • 双龙爱腾坐垫
  • 斯柯达Yeti坐垫
  • 现代途胜坐垫
  • 一汽威乐坐垫
  • 哈飞路宝汽车坐垫
  • 吉利远景汽车坐垫
  • 吉利全球鹰汽车坐垫
  • 房门锁执手锁 防盗挂锁
  • 运动短裤
  • 短裤 男
  • 半裙
  • 手工拖鞋鞋底
  • iphone4皮套 手机套
  • 机油滤清器扳手工具
  • 桑塔纳3000机油
  • 家居摆件现代
  • 玻璃摆件
  • 瓷器摆件
  • 马到成功摆件
  • 高档瓷器摆件
  • 宝马山地自行车包邮
  • 根雕工艺品摆件
  • 家居摆件吊脚娃娃
  • 泰国佛像摆件工艺品
  • 美利达儿童自行车
  • 天鹅摆件结婚
  • 龙龟摆件纯铜
  • 金摆件聚宝盆
  • 亲子自行车 女式
  • 客厅卧室装饰摆件
  • 贵宾狗摆件
  • 木摆件
  • 羚羊头摆件
  • 招财兔摆件
  • 自行车前包
  • 牛仔短裤
  • 短裤 男 休闲
  • 高腰短裤
  • 夏季短裤
  • 蕾丝短裤
  • 连体短裤
  • 裙裤
  • 裤裙
  • 拖鞋 海外
  • 拖鞋 浴室
  • 拖鞋 防滑
  • 拖 鞋 男
  • 拖鞋 女
  • 浴室拖鞋
  • 家居拖鞋
  • 凉拖鞋
  • 夏天拖鞋
  • 香菇丸
  • 韩国饮料
  • 打草绳小松打草绳二手挖掘机小松 小松割灌机配件 钢木书桌办公桌钢木桌玻璃杯子水壶钢化玻璃水壶钢木办公桌钢木电脑桌进口玻璃水壶玻璃水成份防冻玻璃水包邮防冻玻璃水车用 环保果皮箱环保垃圾袋环保垃圾桶小松120-6常州小松割草机小松打草头小松割灌机小松割灌机配件 咖啡厅员工制服_咖啡厅服务员制服_西餐咖啡服务员制服_咖啡馆制服_咖啡店西餐
  • 5号充电电池8节套装
  • 5-7号电池充电器
  • 充电电池5号正品
  • 可充电电池5号
  • 7号充电电池批发
  • 7号电池包邮
  • 1.5v充电电池5号
  • 5号充电器电池免邮
  • 双鹿电池5号正品
  • 双鹿9v电池
  • 双鹿电池批发
  • 双鹿7号电池
  • 双鹿1号电池
  • 双鹿碱性电池
  • 三星s4电池原装正品
  • 三星s4原装电池后盖
  • n7100原装电池
  • 小米2s原装电池
  • galaxy s4大容量电池
  • galaxy s4原装电池
  • galaxy s3电池
  • galaxy nexus电池
  • 三星galaxy s4电池后盖
  • 品胜小米2s电池
  • 品胜手机电池
  • 小米2a电池品胜
  • 背夹电池iphone4s
  • note2背夹电池
  • 三星s4背夹电池皮套
  • 自行车fixedgear 自行车眼镜 近视 婴儿推车小自行车 自行车骑行眼镜风镜 钻石自行车 山地自行车立管 led自行车气嘴专用灯 三鼎自行车坐椅儿童 自行车线管 金镶玉玉器挂件 自行车脚踏双轴承 铬钼钢架自行车 邦德自行车女式 山地公路自行车 自行车骑行手电筒 自行车灯架 灯夹包邮 自行车水壶支架 自行车 组装 mosso 自行车载mp3 26自行车 男生单车 自行车 折叠 复古 giant山地车 自行车 炫彩自行车 七彩马亲子自行车 ucc山地车 自行车 贝嘉琦 女孩自行车 zxc自行车配件码表 自行车前置安全椅 女童自行车 小龙哈比 自行车碳纤维垫圈 自行车骑行用品 装饰木板板材 美式壁挂装饰 家具装饰配件 衣服装饰亮片 婚礼礼品实用 公司开业庆典礼品 婴儿衣柜 儿童欧式公主床 床围栏护栏嵌入式 床靠背套 派克圆珠笔芯 卧室台灯床头灯现代 个性笔袋 派克im签字笔 彩色铅笔包邮 派克宝珠笔芯 派克笔芯正品 百乐摩可擦笔笔芯 斑马油笔 微型钢笔钓鱼竿 电子教鞭遥控笔 镭射灯激光笔 彩色水笔芯 黑色水笔笔芯 公爵宝珠笔芯 touch3代马克笔 韩国文具笔包邮 水溶性彩色铅笔 马可 sgp触控笔 礼品创意笔筒 铂金 项链 pt950 男 老竹笔筒 竹雕笔筒 六福珠宝铂金手镯 8.9寸笔记本电脑 三菱签字笔1.0 华硕游戏笔记本 插座面板

    基于 Spring 和 iBATIS 的动态可更新多数据源持久层

    前言

    我们时常会遇到一些 web 项目,需要从不同的数据源中抓取数据来进行分析,而这些数据源是有可能变化的,需要用户来进行动态的维护和添加。可是,大多数的 web 程序使用了应用服务器或者容器中间件来管理数据源的生命周期,因此数据源的变化自然不能够独立于程序,而需要由专业人士去进行维护,必要时还需要重新发布 程序来适应数据源的变化,而且数据源的个数、数据库的类型也都会有所限制。

    那么怎样才可以突破以上这些局限,彻底实现由用户远程对数据源进行维护和管理的需求呢?本文提出了一个有效的解决方案,该方案的大体思路如 下:将数据源的配置信息保存在一个地址相对固定的数据库或本地文件系统中,系统将依据这些配置信息自动生成数据源(每当数据信息发生变化时,系统将重新生 成新数据源),然后通过工厂模式的持久层将这些数据源自动分配给对应的类对象使用。如此,只需要一个用户界面,来对此数据源的配置信息进行管理,就可以实 现由用户自主维护数据源系统的目的了。下文将以一个 Spring+iBATIS 框架的实例,来详细描述该解决方案的实现。

    回页首

    相关技术介绍

    iBATIS

    Apache iBATIS 是 Clinton Begin 开发,现在由 Apache 基金会支持的用于加快 JDBC 编程的经过泛化的框架,是当前 IT 项目中使用很广泛的一个半自动 ORM 框架,区别于 Hibernate 之类的全自动框架,iBATIS 对数据库的操作拥有更加灵活的控制,对于那些经常需要调用本地数据库函数自定义 SQL 语句,或是喜欢自己优化 SQL 执行效率的开发者来说,iBATIS 是一个非常不错的选择。而得到广泛应用的开源企业架构 Spring Framework,也很好的将 iBATIS 进行了集成,使得 iBATIS 在 Spring 中的使用更加便利、快捷。下面是 iBATIS 的一些关键组件:

    • SqlMapClient:是 iBATIS 的重要接口,是线程安全的。这个接口涉及到对 SQL 映射的执行和批处理。
    • Sqlmap-config.xml:是使用 iBATIS 的起点,负责把所有的 SQL 映射文件(sqlmap.xml)组合在一起。该配置文件可以告诉 iBATIS 如何连接数据库,以及获取哪些 SQL 映射文件(sqlmap.xml)。
    • sqlmap.xml包含了我们将要运行的 SQL 语句,被 Sqlmap-config.xml 文件所引用。

    图 1.iBATIS 架构图
    图 1.iBATIS 架构图

    我们之所以选用 iBATIS 而不是 Hibernate 来作为本解决方案的开发框架,主要是因为相比 Hibernate 来说 iBATIS 更具灵活性,可以更为方便地对其结构进行改写。尤其是在对不同数据库结构的封装方面,iBATIS 更适用于对实现相同逻辑的不同数据库结构的支持。反观 Hibernate 则需要对数据库结构进行封装,这就意味着对不同的数据库结构要生成不同的 PO 类,这会使开发工作变得繁琐。当然用户也可以选择使用 Hibernate 来作为框架,其理念是相同的,不同的只是实现手段。

    Spring 对 iBATIS 的支持

    Spring 通过 DAO 模式,提供了对 iBATIS 的良好支持。

    • SqlMapClient:是 iBATIS 中的主要接口,通过 xml 配置文件可以让 Spring 容器来管理 SqlMapClient 对象的创建,Spring 提供了 SqlMapClientFactoryBean 来生成该对象。
    • SqlMapClientFactoryBean:SqlMapClientFactoryBean 是由 Spring 所提供的,用来生成 SqlMapClient 对象的一个工厂类。当使用 Spring 配置文件将 SqlMapClientFactoryBean 作为一个 SqlMapClient 的实现类进行注入时,Spring 容器将根据接口里的定义来调用其 getObject 方法,最终返回一个 SqlMapClient 接口的实现类。SqlMapClientFactoryBean 生成的对象拥有两个重要属性,configLocation 属性用来确定 sqlmap-config.xml,dataSource 属性用来确定数据源。
    • SqlMapClientDaoSupport:Spring 提供的数据库操作类,应用程序的持久层 DAO 则可以继承这个类。SqlMapClientDaoSupport 需要 Spring 为其注入 SqlMapClient 接口的实现对象,来确定使用何种数据源和使用何种 sqlmap-config.xml。

    回页首

    持久层的架构和设计

    如上节所述可知,如果要使传统的 Spring+iBATIS 框架支持动态的多数据源持久层,则需要对其进行改良。而数据源是由 SqlMapClient 对象的属性所定义的,所以要想办法通过变更 SqlMapClient 接口的实现对象来达到目的。Spring 是使用 XML 配置文件来存储 SqlMapClient 对象的信息,因此只需要能够根据数据源配置信息来动态生成该 XML 配置文件,来实现对 SqlMapClient 接口的动态注入即可。


    图 2. 持久层架构流程图(查看大图
    图 2. 持久层架构流程图

    持久层架构的具体处理流程如上图所示:

    1.创建配置文件生成类 SqlMapClientFactory,当应用服务器启动时,Spring 框架将启动 SqlMapClientFactory 类的 init 方法(每当数据源配置信息发生变化时也重新启动此方法),该方法将读取数据库或本地文件系统中存储的数据源配置信息,然后动态的生成 Spring XML 配置文件。在此 XML 配置文件中,根据不同的数据源定义了很多不同的 SqlMapClient 对象,并定义了其相对应的数据源和 sqlmap-config 文件。

    2.创建 SqlMapClient 接口的实现类 RoutingSqlMapClient,并通过 Spring 将生成的所有 SqlMapClient 对象以 Map 的结构形式注入到 RoutingSqlMapClient 中,当其被调用时将根据要求使用相应的 SqlMapClient 实现对象来对 RoutingSqlMapClient 的方法进行重写。

    3.将 RoutingSqlMapClient 注入到所有继承了 SqlMapClientDaoSupport 的 DAO 实现类中,DAO 将根据实际需求决定使用哪个数据源。

    回页首

    持久层的具体实现

    使用 SqlMapClientFactory 类生成 XML 配置文件

    如上文的描述,第一步应该创建 SqlMapClientFactory 类,并创建一个用来生成 SqlMapClient 的 XML 配置文件的方法。然后配置 Spring,使其能在程序启动时自动调用 SqlMapClient 的该方法。该方法要从本地文件系统或地址相对固定的数据库系统中读取数据源配置信息,SqlMapClientFactory 所读取的数据源配置信息的主要字段如下:

    注:<hostname> 是数据库所在的服务器地址,<portNum> 是数据库所用服务端口号,<databaseName> 是数据库名称,<userName> 是数据库用户名,<password> 是该用户的密码


    表 1 数据源配置信息
    ID Name Connection User Password DBType
    00001 PROJECTA jdbc:db2://<hostname>:<portNum>/<databaseName> <userName> <password> DB2
    00002 PROJECTB jdbc:microsoft:sqlserver://<hostname>:
    <portNum>
    ;DatabaseName=<databaseName>
    <userName> <password> sqlserver
    00003 PROJECTC jdbc:db2://<hostname>:<portNum>/<databaseName> <userName> <password> DB2
    00004 PROJECTD jdbc:db2://<hostname>:<portNum>/<databaseName> <userName> <password> DB2

    SqlMapClientFactory 将根据这些配置信息生成相应的 SqlMapClient 对象的 XML 配置文件。下面详细介绍一下该 XML 配置文件的主要构成。

    1,根据数据源配置信息的 ID 和 Name,生成所有 SqlMapClient 接口实现对象的 Map 列表。


    清单 1. routingSqlMapClient 配置
    				   <bean id="routingSqlMapClient" class="com.ibm.mbps.tsd.dao.RoutingSqlMapClient">    <property name="targetSqlMapClients">   <map key-type="java.lang.String">   <entry key="PROJECTA" value-ref="sqlmapClient_00001"/>   <entry key="PROJECTB" value-ref="sqlmapClient_00002"/>   <entry key="PROJECTC" value-ref="sqlmapClient_00003"/>   <entry key="PROJECTD" value-ref="sqlmapClient_00004"/>  		……     </map>   </property>   </bean>  

    2,为每个 SqlMapClient 接口实现对象创建数据源,数据源根据上文的配置信息生成。


    清单 2. data source 配置示例
    				   <bean id="datasource_00001" class="org.apache.commons.dbcp.BasicDataSource">   <property name="driverClassName">      <value>com.ibm.db2.jcc.DB2Driver</value>    </property>    <property name="url">      <value> jdbc:db2://hostname:portNum/databaseName</value>    </property>    <property name="username">      <Value>userName</value>    </property>    <property name="password">      <value>password</value>   </property>   </bean>  

    3,为每个 SqlMapClient 对象注入数据源和 sqlmap-config 配置文件,应该注意的是该 sqlmap-config 配置文件是针对某一类数据源的,比如多个数据源的数据库类型和数据库内容都相同,那么就应该使用同一张配置文件。


    清单 3. SqlMapClient 对象配置示例
    				   <bean id=" sqlmapClient_00001" class="org.springframework.orm.ibatis.SqlMapClient   FactoryBean">   <property name="configLocation" value="classpath:/sqlmap/db2/sql-map-config.xml"/>      <property name="dataSource">        <ref local=" datasource_00001"/>      </property>   </bean>  

    重写 SqlMapClient 接口的实现类 RoutingSqlMapClient

    生成了 SqlMapClient 对象后,我们还要创建一个 RoutingSqlMapClient 的实现类用来重写相应的 SqlMapClient 接口方法。RoutingSqlMapClient 将创建一个 Map 变量去承接上文生成的 SqlMapClient 实现对象的 Map 列表,然后根据关键字来判断用哪个实现对象来动态的重写 RoutingSqlMapClient 类。RoutingSqlMapClient 使用变量 targetSqlMapClients 来接收 SqlMapClient 对象列表。


    清单 4. RoutingSqlMapClient 类的代码片段
    				   public class RoutingSqlMapClient implements SqlMapClient {   private Map<String, SqlMapClient> targetSqlMapClients;   public void flushDataCache()   {   targetSqlMapClients.get(getDSType()).flushDataCache();   }   public SqlMapSession getSession()   {   return targetSqlMapClients.get(getDSType()).getSession();   }   public int delete(String id, Object parameterObject) throws SQLException   {   return targetSqlMapClients.get(getDSType()).delete(id,parameterObject);   }   public Object insert(String id, Object parameterObject) throws SQLException   {   return targetSqlMapClients.get(getDSType()).insert(id,parameterObject);   }   public List queryForList(String id, Object parameterObject) throws SQLException {   return targetSqlMapClients.get(getDSType()).queryForList(id,parameterObject);   }  ……  }  

    创建继承 SqlMapClientDaoSupport 的 DAO 类

    我们选择使用 RoutingSqlMapClient 重写 SqlMapClient 的实现方法,而不是将 SqlMapClient 实现对象直接注入到对应 DAO 中的原因是:一个 DAO 类有可能对应多个数据源,如果将只包含一个数据源的 SqlMapClient 实现对象直接注入 DAO,那将严重限制 DAO 的可重用性。因此我们将整个 SqlMapClient 实现对象的列表装载入 RoutingSqlMapClient 类,在逻辑层定义使用哪一个 SqlMapClient 对象对 RoutingSqlMapClient 进行重写,持久层的 DAO 架构如下图所示:


    图 3. 持久层 DAO 架构图(查看大图
    图 3. 持久层 DAO 架构图

    DAO 实体类继承 SqlMapClientDaoSupport 并实现相应不同的接口。如图所示,不同的接口对应不同的上层逻辑,而实现其逻辑的 DAO 实现类引用了不同的数据源和 sqlmap-config.xml,这些数据源和 XML 定义在 SqlMapClient 对象内,当我们调用持久层 DAO 类对数据库进行操作时需要先调用 RoutingSqlMapClient 内的 setDSType() 方法来确定使用哪个数据源,并使用对应的 SqlMapClient 实现对象对 RoutingSqlMapClient 进行重写,这样就可以把对应此数据源的 SqlMapClient 以 RoutingSqlMapClient 对象的形式传入到 DAO 内,实现多数据源并存的结构了。

    支持动态更新的多数据源持久层开发完毕后,还应该为用户开发一套 UI 组件来使用户能够对数据源信息进行更新和维护。而每次用户更新完毕都要调用 SqlMapClientFactory 类的 init 方法,来重新生成 SqlMapClient 的 XML 配置文件,这样就可以不重新启动服务器而实现数据源的动态更新和添加了。

    回页首

    总结

    本文描述了,可动态更新的多数据源持久层系统的一种实现方式,对于开发类似项目的开发者有一定的借鉴作用。但是由于本文的主要目的是阐述一 种理念方法而不是具体实现,所以一些相关技术及具体实现没有写出,但开发者可以根据本文的思路选用自己喜欢的方式来进行实现,此外对于一些名词和 iBATIS 及 Spring 的功能没有予以详细介绍,建议对 iBATIS 架构不熟的读者能够自行参考其它教程。本文选用 Spring+iBATIS 框架仅作为示例,但仅仅是建议使用,不对使用结果和效果做任何保证。(本文内容仅代表作者个人观点)

    posted @ 2012-02-14 11:56  ChaunceyHao  阅读(1536)  评论(0编辑  收藏  举报
  • 汽车羊毛坐垫长毛
  • 车垫四季通用
  • 御车宝
  • 凯美瑞坐垫四季通用
  • 手编冰丝坐垫
  • 珍珠戒指新款
  • 汽车皮坐垫四季垫
  • 汽车四季坐垫新款
  • 汽车皮坐垫四季通用
  • 汽车羊毛坐垫短毛
  • 包女
  • 汽车亚麻坐垫包邮
  • 汽车布坐垫
  • 汽车布坐垫套
  • 紫风铃亚麻四季坐垫
  • 蒙奇奇汽车
  • 蒙奇奇汽车毛绒坐垫
  • 蒙奇奇坐垫三件套
  • 尼罗河车坐垫
  • 尼罗河手编坐垫
  • 尼罗河四季垫
  • 羊剪绒坐垫
  • 牧宝冬季坐垫
  • 牧宝四季垫正品
  • 牧宝羽绒坐垫
  • 牧宝汽车垫羊毛
  • 高压洗车机
  • 高压洗车器
  • 高压洗车水泵
  • 高压洗车泵
  • 熊猫洗车
  • 洗车器高压220v
  • 洗车器便携高压
  • 高压水枪洗车机
  • 220v高压水枪洗车机
  • 家用洗车水枪高压枪
  • 汽车洗车水枪
  • 虎贝尔洗车水枪
  • 水枪头洗车
  • 洗车水枪水管
  • 洗车水枪套装
  • 洗车水枪接头
  • 佳百丽洗车水枪
  • 洗车工具套装
  • 洗车用品工具
  • 家用洗车工具
  • 汽车洗车工具
  • 洗车设备工具
  • 洗车刷子
  • 现代途胜保险杠
  • 现代新胜达保险杠
  • 保险杠车贴纸
  • 后保险杠车贴纸
  • 前保险杠车贴
  • 雨燕保险杠
  • 后保险杠贴纸
  • 前保险杠贴纸
  • 汽车保险贴纸
  • rav4后保险杠
  • 专业运动文胸htc c715e evo design 4g
  • htc evo 4g a9292
  • htc x515m g17 evo 3d
  • htc one x s720e
  • htc x920e
  • 名牌手表男正品
  • povos 奔腾 pffn3003苏泊尔电热水壶正品
  • tcl tcl电热水壶ta-kb181a
  • 乔邦181j
  • 乔邦不锈钢电热水壶
  • supor 苏泊尔 swf15j3-150
  • 逸动空气滤芯
  • 空气压缩机喷漆
  • 德国车载空气净化器
  • sr927w手表电池
  • cartier手表蓝气球
  • 机械手表男士名表
  • anne klein手表
  • 手表柜台展示柜
  • 女士皮带 头层牛皮
  • 女士皮带 头层纯牛皮
  • jeep皮带 纯牛皮
  • 女皮带 真皮 牛皮
  • 女士皮带 真皮
  • 头层牛皮皮带
  • 女士皮带 时尚
  • 真皮皮带头层牛皮女
  • 女士皮带 包邮
  • 皮带条 头层牛皮
  • 女士皮带 时尚 宽
  • 头层牛皮纯铜扣皮带
  • 女士皮带 纯牛皮
  • 女士皮带头层纯牛皮
  • 女士皮带头层牛皮
  • jeep皮带纯牛皮
  • 女皮带真皮牛皮
  • 女士皮带真皮
  • 女士牛皮皮带包邮
  • 女士皮带时尚
  • 三星微单镜头
  • 三星单反镜头
  • 三星50-200镜头
  • 三星7100镜头保护膜
  • 三星i9210
  • 三星i9210手机套面包蛋糕酸奶机
  • 鸡蛋牛奶面包干饼干
  • 面包片饼干
  • 摩托车机油