精华内容
下载资源
问答
  • 如果再算上3月20日湖南省区域性股权市场科技创新专板开板,安信生物作为首批16家企业之一在当日成功挂牌,今年以来,雨花区上市企业工作收获颇丰。 光从数量上来看,似乎并不算多,但对比长沙市上市企业整体...

    文 | 辰纹

    来源 | 螳螂财经(ID:TanglangFin)

    今年是雨花区企业上市的丰收年。

    4月7日,“民营加油站第一股”和顺石油登陆上交所主板。

    6月2日,宇新股份登陆深交所中小板市场。

    如果再算上3月20日湖南省区域性股权市场科技创新专板开板,安信生物作为首批16家企业之一在当日成功挂牌,今年以来,雨花区的上市企业工作收获颇丰。

    光从数量上来看,似乎并不算多,但对比长沙市的上市企业整体情况,上市企业总数为75家,今年新增7家上市企业,雨花区占了2席,换算成比例接近29%,在一定程度上也反映出雨花区经济底蕴的厚度。

    如果再联想到不久前知名智库“赛迪顾问”发布的《2020年中国城区高质量发展白皮书》评选出的全国百强城区榜单,雨花区位居第20位,为湖南五个上榜城区最高名次,进一步佐证了雨花区作为一个优秀“孵化器”的过硬实力。

    并不只有和顺石油和宇新股份,雨花还有一大批上市后备力量

    和顺石油4月7日在上交所主板上市时发行价格为27.79元,拟募资金9.28亿元,开盘价为33.35元,较发行价上涨20%,当日以40.02元报收,较发行价上涨44.01%。

    根据和顺石油招股书显示,2017年至2019年,和顺石油营业收入分别为20.7亿元、23.4亿元和19.4亿元,归属于上市公司股东净利润分别为1.92亿元、1.56亿元和1.62亿元。

    经过多年的发展,和顺石油的零售终端在湖南已经积累出一定优势,截至2019年底,和顺石油已拥有30座自营加油站。根据长沙市商务局统计数据,其在长沙市主城区加油站数量仅次于中石化、中石油,并远高于其他公司。

    图片2.png

    宇新股份成立于2009年,是雨花区“土生土长”的本土企业,公司主要业务是以LPG(液化石油气)为原料的有机化工产品的工艺研发、生产和销售,目前在惠州大亚湾国家级经济技术开发区石化产业园区陆续建成并投产了多套LPG深加工产品生产装置,主要合作伙伴包括中海油惠州石化、中海壳牌、中石化等大型石油化工企业。

    6月2日宇新股份在深交所中小板上市,发行价为39.99元,拟募资金10亿元,开盘价为47.99元,较发行价上涨20%,当日以57.59元报收,较发行价上涨44.01%。

    图片3.png

    事实上,早在2018年时,雨花区制定了《雨花区企业上市工作三年行动方案(2018-2020)》,定下了在2021前年要实现3到4家企业上市的目标,和顺石油和宇新股份就是雨花区两年前埋下种子孵化出的果实,就目前的工作进展来看,雨花区有望提前完成既定目标。

    完成目标固然可喜,然而在完成目标之后,雨花区还有多少潜力可挖呢?

    根据雨花区公布的信息显示,目前雨花区还有1家企业已向深交所递交资料,1家已完成湖南省证监局辅导备案,22家企业进入长沙市拟上市企业库,17家进入湖南省上市后备企业库,光从所列的名录数量来看,雨花区的上市企业工作显示出结构明晰的梯队层次。

    仔细分析雨花区22家进入长沙拟上市企业库的企业可以发现,这些企业覆盖了生物医疗、能源物流、智能装备、农业环保、商贸旅游、信息软件等多个行业,这也在一定程度上反应出雨花区产业经济多面开花、全面发展的特点,即每个领域都孵化出龙头企业领衔,一些优势产业比如智能制造、能源环保等还出现多个强势企业共同扛旗的局面,整条产业链也因此被搅活,这使得雨花在这几个产业的全省乃至全国范围的竞争中始终能够占有一席。

    雨花区这个优秀“孵化器”是如何炼成的?

    可能有些人心中会有疑问,雨花区推动企业上市的力量来自何处?如果将雨花区看做一个“孵化器”,其成长路径又是怎样的?

    我们先来看看雨花区的经济结构,由于有高桥大市场、红星大市场这两个全国有名的商贸市场的存在,再加上长沙本土的传统老牌商圈东塘商圈以及新近上位的红星商圈,雨花区的商贸经济非常发达。

    近年来,雨花区大力发展“一主一特”产业链,聚焦新能源汽车及零配件主导产业,发展人工智能及机器人(含传感器)特色产业,又取得了非常不错的成绩,雨花经开区在全省134个园区产业发展综合评价中,领跑全省,而且是连续5年排名第一。

    由此一来,雨花区孕育了非常活跃的市场主体。

    根据统计,截止目前,雨花区市场主体总量约179819户,稳居全省区县(市)第一;每万人拥有市场主体数约为1938户,位居中部省会城区第一;特别是2019年5月份实行优化营商环境改革以来,新增企业12552户,同比增长高达51.5%。

    传统商贸底子厚,产业园区发展势头强劲,加之市场主体基数庞大,自然会有相当数量的优秀企业跑出上市。

    如果说这是雨花区有意营造出的外部环境,那么在内部推动上,雨花区更相信事在人为。

    首先,针对企业上市工作,雨花区成立了专门的上市工作领导小组,由区长刘素月亲任组长,按照“片区为主、联点牵头、分级负责”的原则每个季度定期对企业的上市筹备工作进行分析研究。

    对于企业上报的问题,雨花区划出了一周之内必给答复的红线,如果问题过于复杂,上报至市级层面,雨花区更是追在主管副市长的身后,最短在1天内即可回复企业。

    这里有一个典型案例,拟上市企业红星冷链在资产整理过程中,发现有10多万平米的厂房和办公物业的房产没有确权,为不拖累企业的上市速度,雨花区收到企业上报的问题后,立即对接长沙市企业上市联席办协调解决,市联席办又在第一时间组织相关部门专题研究,结果这个在红星冷链公司留存了多年的老大难在一个月时间完成了房产验收,目前已进入到正常办证流程。

    我们可以清晰的看到,政策落地高效执行,雨花区就像一个上足了发条的马达,所有的工作都以企业为中心铺设开来。

    区级上市政策全市第一个出台,企业问题第一时间解决,奖励资金第一时间发放……

    效率之下,企业也不敢懈怠,“我们上市过程中每到一定阶段,政府就会给我们一笔奖励,二三百万的奖金不算很多,但对于我们来说,是一种激励和肯定,促使我们对自己要求更高,对工作更投入。”和顺石油铜官公司总经理肖希认为公司上市过程中雨花区提供的各种服务让企业倍感贴心,“主要是减少了我们很多时间成本,一些具体问题我们只要一上报,马上有回复,润物细无声,政府就像一个隐形保镖,在背后为我们保驾护航。”

    政策落地高效执行到底又是用什么支撑起来的呢?

    之前曾有媒体用“厚道”来形容长沙,雨花在助推企业上市方面用不造概念的实干精神成为“厚道”的典范。

    除了上文提到企业主动上报问题,政府高效解决之外,雨花还积极主动走访企业提供专业指导,甚至邀请省、市金融监管部门及上交所、深交所专家到企业上门指导,帮助企业出谋划策。

    宇新股份上市之前,雨花区副区长易静、雨花区金融事务中心就多次到宇新股份走访,并到其惠州生产基地进行现场考察,对企业的发展提建议,对企业的诉求“领任务”。

    宇新股份2020年1月17日过会后,为加快筹备上市,需要拓展业务范畴,扩大产品经营范围,雨花区金融事务中心协助企业于3月26日向雨花区应急局提交了危险化学品经营许可申请。

    雨花区应急局副局长主动上门走访了解情况,经局党组商议后决定为该企业“特事特办”,把法定30个工作日办理完毕、区政府为优化营商环境规定15个工作日办理完毕的基础上,时间再缩短一半!

    4月8日,宇新股份成功办理经营许可范围变更,拿到《危险化学品经营许可证》;4月16日,宇新股份负责人、安全管理人员完成市应急局危险化学品行业集中培训报名。

    需要注意的一点,雨花区制定的产业政策也好,落地工作也好,都是以“可执行”为前置条件,不造概念,不玩花招,就一板一眼,一招一式的实干下去,这也是雨花企业上市工作的内核要素之一。

    企业密集上市的背后是持续优化的营商环境

    对于雨花区而言,企业上市是表露在外的成绩,其背后是政府持续不断优化营商环境所作出的努力和革新。

    如何让企业感受到雨花的“友好”呢?雨花区做的第一件事是让企业进入雨花时就留下好的印象,通过降低创业办企门槛的方式来激活市场活力。

    2019年,实现企业开办“零成本一日办结”。

    2020年,实行企业开办“即办”改革,做到线上“即传即办”、线下2小时内办结。

    此外,在水电气等要素保障、市场监管、政务服务等方面,雨花区也做了诸多站在企业角度,以企业为中心的改革,其核心思想就是放权简政,让企业尽可能的减少干扰,专心投身企业发展。

    很多城市对企业开办大开绿灯,对企业退出却锱铢必较,雨花区在这方面也看得很开,推出企业注销“最多跑一次”改革,解决“市场准入容易退出难”问题。目前雨花区已经实现“简易注销全程网办、一次都不跑;普通注销一窗通办、最多跑一次”。

    在这一进一退之间,雨花区既彰显出对自身经济活力充分自信的开放心态,又在企业之间落下“贴心为民”的良好口碑。

    雨花区提升营商环境不光服务企业,市民也有所收获从中受益。

    为了让企业“最多跑一次”,雨花区将很多职能部门的服务窗口进行了集成实行“一网通办”,其中涉及教育、卫健、人社、商务等225项政务服务事项均可在雨花区24小时政务自助服务厅内办理,雨花区的政务服务也从8小时向“白+黑”、“全天候”服务转变,市民平时逛街散步时顺便就可处理水电气费充值、社保证明打印等事项了。

    营商环境的政策红利完成了全民“普惠”,市民幸福感得到提升的同时,经济活力的那一池春水也就被搅动了。

    不久前,人民网还特别刊文《长沙市雨花区打造一流营商环境,释放发展动能、激发市场活力》,对雨花区提升营商环境工作进行了全面细致的梳理,甚至将雨花区一整套联席工作机制总结为“雨花样板”,足以显示出雨花区在助推区域经济高质量发展这项工作上走在了前列。

    回头再来审视雨花区优化营商环境的所有举措,创新点很多,然而根据中国40年改革开放的经验可知,创新的关键不在创造,而在打破除旧。

    雨花区营商环境之所以能够得到企业和市民认可,关键在于区领导班子在“破旧”时显示出巨大决心和作为当担。

    比如“一网通办”的推行,受到历史、系统、权限等诸多原因,部门间资料不互认、信息不联通、沟通不顺畅,雨花区领导班子强力介入,建立了一个健全的工作机制和沟通平台。

    再比如,区县在推进很多改革的过程中,存在权限不足问题,需要争取省市支持,获得许可或试点,方能实现突破,每每遇到这样的问题,雨花区领导班子往往都能担起责任,向上级领导和部门表达出“方案可行”、“我能行”的自信。

    *本文图片来源于网络

    欢迎来到财经爱好者聚集地,同好共同交流请添加微信:tanglangcaijing01

    此内容为【螳螂财经】原创,

    仅代表个人观点,未经授权,任何人不得以任何方式使用,包括转载、摘编、复制或建立镜像。

    部分图片来自网络,且未核实版权归属,不作为商业用途,如有侵犯,请作者与我们联系。

    螳螂财经(微信ID:TanglangFin):

    •泛财经新媒体。

    •微信十万+曝文《“维密秀”被谁杀死了?》等的创作者;

    •重点关注:新商业(含直播、短视频等大文娱)、新营销、新消费(含新零售)、上市公司、新金融(含金融科技)、区块链等领域。

    展开全文
  •  一、党建引领,以学促做,组织思想基础进一步夯实 一年来,我们按照“创新思路抓党建,科学引领促发展”思路,不断探索新形势下党建工作新方法,在抓班子、带队伍、强素质、争创一流业绩上下功夫,夯实党员干部...
  • 中新社深圳1月24日电 (郑小红 杨晶晶)南方电网深圳供电局24日发布数据显示,2018年深圳全口径客户平均停电时间(按国际通行IEEE-1366标准统计至低压客户)为0.68小时,与巴黎、伦敦等城市相当,达世界一流水平。...

    中新社深圳1月24日电 (郑小红 杨晶晶)南方电网深圳供电局24日发布的数据显示,2018年深圳全口径客户平均停电时间(按国际通行的IEEE-1366标准统计至低压客户)为0.68小时,与巴黎、伦敦等城市相当,达世界一流水平。其中,福田中心区高可靠性示范区客户年平均停电时间1.93分钟,供电可靠率99.9996%,跻身世界顶尖水平。

    根据2019年深圳政府工作报告,2018年深圳本市生产总值预计突破2.4万亿元人民币,比上年增长7.5%左右,经济总量居亚洲城市前五。这其中,电力营商环境为深圳经济发展提供了有力支撑。

    客户平均停电时间是世界银行营商环境评价中“获得电力”指标的关键因子,与之一同列入评价维度的还有办电流程、接电时间、接电成本等。2018年,深圳供电局加快技术、管理、服务创新,全力创建世界一流电力营商环境,连续第八年位居深圳市40项政府公共服务满意度第一名,第三方客户满意度85分,达国际一流水平。

    深圳供电局还积极借鉴国际先进经验,加强与法国电力合作,以网格化管理为抓手优化规划方法。特别是创造性提出并实施配网规划“3个一”行动:规划理念由中压延伸至低压,形成一套完整的顶层设计标准、一套可靠的基层保障系统和一套坚实的闭环管控机制,推动配网规划与运维工作协同发展。(完)

    展开全文
  • 开展“创一流环境、树开放新形象”大讨论活动月活动总结 根据*委办[XX]43号文件精神,我乡紧紧围绕“创一流环境、树开放新形象”主题,深入开展大讨论活动月活动,现将我乡开展大讨论活动月活动情况总结如下...
  • 环境监察大队工作总结 20XX年,在环保**分局里正确领导下,在大队领导带领下,以“xxxx”重要思想和党xx大精神为指导,以创建全市一流工作业绩为目标,全体同志按照上级安排,统一布置,夯实基础,大胆创作,...
  • 近年来,通过大量细致具体的工作,师生安全防范意识和自救本领显著增强,校园周边环境综合治理初显成效,学校实现了连续四年重大安全事故为零的目标。 现将我校校园环境综合治理工作汇报如下: 一、基本情况分析 ...
  • 近年来,通过大量细致具体的工作,师生安全防范意识和自救本领显著增强,校园周边环境综合治理初显成效,学校实现了连续四年重大安全事故为零的目标。 现将我校校园环境综合治理工作汇报如下: 一、基本情况分析 我...
  • MyBatis 是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis 能够使用简单的XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和POJO(普通java 对象)到数据库中的记录。所有的...

    MyBatis 是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis 能够使用简单的XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和POJO(普通java 对象)到数据库中的记录。所有的MyBatis 应用都以SqlSessionFactory 实例为中心。SqlSessionFactory 实例通过SqlSessionFactoryBuilder 来获得,SqlSessionFactoryBuilder 能够从XML 配置文件或者通过自定义编写的配置类(Configuration class),来创建一个SqlSessionFactory 实例。在非Spring环境下XML文件的配置如下

    <configuration>
      <environments default="development">
         <environment id="development">
         <transactionManager type="JDBC"/>
         <dataSource type="POOLED">
     <span style="white-space:pre">	</span>  <property name="driver" value="${driver}"/>
              <property name="url" value="${url}"/>
              <property name="username" value="${username}"/>
    <span style="white-space:pre">	</span>  <property name="password" value="${password}"/>
         </dataSource>
         </environment>
      </environments>
      <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
      </mappers>
    </configuration>
    
    上面为Mybatis配置了事务管理器以及数据源(数据库连接池)。一般在Spring环境下数据源以及事务管理器不需要在<configuration />文件中配置,而是借助于mybatis-spring包下的org.mybatis.spring.SqlSessionFactoryBean来注入第三方数据源。mybatis在Spring的 applicationContext.xml 中的配置如下

    <!-- 配置mybatis -->
    <bean id="mSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="mDataSource" />
    	<property name="configLocation"
    		value="classpath:/mysql-mapper/Configuration.xml" />
    	<property name="mapperLocations" value="classpath:/mysql-mapper/*Mapper.xml" />
    </bean>
    	
    <!-- 数据源配置, 使用应用中的DBCP数据库连接池 -->
    <bean id="mDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
    	<!-- Connection Info -->
    	<property name="driverClassName" value="${jdbc.driver}" />
    	<property name="url" value="${jdbc.url}" />
    	<property name="username" value="${jdbc.username}" />
    	<property name="password" value="${jdbc.password}" />
    
    	<!-- Connection Pooling Info -->
    	<property name="maxActive" value="${dbcp.maxActive}" />
    	<property name="maxIdle" value="${dbcp.maxIdle}" />
    	<property name="defaultAutoCommit" value="false" />
    	<!-- 连接Idle一个小时后超时 -->
    	<property name="timeBetweenEvictionRunsMillis" value="3600000" />
    	<property name="minEvictableIdleTimeMillis" value="3600000" />
    </bean>
    <!-- mybatis Dao -->
    <bean id="mBaseDao" class="com.rfidMidware.dao.BaseDao">
    	<property name="sqlSessionFactory" ref="mSqlSessionFactory" />
    </bean>
    由上面的配置可以看出,SqlSessionFactoryBean中注入了第三方dataSource,即dbcp数据源。同时在配置中给出了mybatis配置文件以及Mapper映射文件的路径。这时我们来看看Spring环境下的mybatis配置文件是怎么样的

    <configuration>
    	<properties resource="jdbc.properties" />
    	<settings>
    		<setting name="cacheEnabled" value="true" />
    		<setting name="lazyLoadingEnabled" value="false" />
    	</settings>
    	<typeAliases>
    		<typeAlias type="com.rfidMidware.model.controlManager.Manager" alias="Manager" />
    	</typeAliases>
    </configuration>
    观察上面的配置,可以看出已经不需要再配置数据源、事务管理器等选项了。顺便说说上面的配置吧,<properties />文件给出了外部属性文件。<settings />很重要,用于改变运行中mybatis的行为。可以看出我开了mybatis的二级缓存。我们知道Mybatis共分两级缓存(不知道的话可以点开链接哟,个人觉得很好的博客的链接)。一级缓存基于Session,二级缓存作用域为Mapper的范围。但是由于Spring环境下SqlSession是由Spring容器管理的,mybatis的一级缓存不再有效。<typeAlias />为类全名产生一个简短的别名,方便Mapper文件使用。
    配置好了,那么mybatis具体是如何工作的呢,首先,看一下我们在业务层读写数据库时使用的mybatis的接口吧(这只是使用mybatis的一种方式)

    public class BaseDao  extends SqlSessionDaoSupport {
    
    	public int  save(String key, Object object){
    		return getSqlSession().insert(key, object);
    	}
    	
    	public int update(String key, Object object){
    		return getSqlSession().update(key, object);
    	}
    	
    	public int  update(String key){
    		return getSqlSession().update(key);
    	}
    	
    	public int  delete(String key, Serializable id) {
    		return getSqlSession().delete(key, id);
    	}.................
    这里使用的是继承SqlSessionDaoSupport的方法。来看看这个类

    public abstract class SqlSessionDaoSupport extends DaoSupport {
    
    	  private SqlSession sqlSession;
    
    	  private boolean externalSqlSession;
    
    	  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    	    if (!this.externalSqlSession) {
    	      this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); 	    }
    	  }
    
    	  public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
    	    this.sqlSession = sqlSessionTemplate;
    	    this.externalSqlSession = true;
    	  }
    
    	  /**
    	   * Users should use this method to get a SqlSession to call its statement methods
    	   * This is SqlSession is managed by spring. Users should not commit/rollback/close it
    	   * because it will be automatically done.
    	   *
    	   * @return Spring managed thread safe SqlSession
    	   */
    	  public SqlSession getSqlSession() {
    	    return this.sqlSession;
    	  }
    	}
    当我们使用BaseDao接口,调用getSqlSession时会调用其基类SqlSessionDaoSupport相应的方法。而这个SqlSession是其子类SqlSessionTemplate 的一个实例。

    this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); 

    而在上面的配置文件中有这一句 <property name="sqlSessionFactory" ref="mSqlSessionFactory" />   ,由此处可以看出上句SqlSessionTemplate实例化传入的参数sqlSessionFactory即 org.mybatis.spring.SqlSessionFactoryBean。 

    先来看看SqlSessionTemplate的真面目

    public class SqlSessionTemplate implements SqlSession {
    
    	  private final SqlSessionFactory sqlSessionFactory;
    
    	  private final ExecutorType executorType;
    
    	  private final SqlSession sqlSessionProxy;
    
    	  private final PersistenceExceptionTranslator exceptionTranslator;
    
    	  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,
    		 PersistenceExceptionTranslator exceptionTranslator) {
    
    			notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");
    			notNull(executorType, "Property 'executorType' is required");
    
    			 this.sqlSessionFactory = sqlSessionFactory;
    			 this.executorType = executorType;
    			 this.exceptionTranslator = exceptionTranslator;
    			 this.sqlSessionProxy = (SqlSession) newProxyInstance(
    			  SqlSessionFactory.class.getClassLoader(), new Class[] { SqlSession.class },new SqlSessionInterceptor());			
    		} .......
    最重要的是最后一句,使用java的动态代理生成的SqlSessionProxy来执行具体的 数据库CRUD,JDK的动态代理是基于接口的。该代理实现SqlSession的接口,并使用SqlSessionIntercepter拦截器将mybatis方法引导到正确的由Spring事务管理器产生的SqlSession中去。我们知道动态代理中,当代理类调用相应的类方法时候会调用InvocationHandler中的invoke方法。而SqlSessionIntercepter是InvocationHandler的子类,这个拦截器中最重要的的是invoke方法

    private class SqlSessionInterceptor implements InvocationHandler {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          SqlSession sqlSession = getSqlSession(
              SqlSessionTemplate.this.sqlSessionFactory,
              SqlSessionTemplate.this.executorType,
              SqlSessionTemplate.this.exceptionTranslator);
          }

    拦截器中getSession方法调用org.mybatis.spring.SqlSessionUtils中的 静态 getSession方法;我们再观察这个方法(已精简)

    public static SqlSession getSqlSession(SqlSessionFactory sessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {
    
        //需同步时用holder来管理sqlSession
        SqlSessionHolder holder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
    
        if (holder != null && holder.isSynchronizedWithTransaction()) {
          if (holder.getExecutorType() != executorType) {
            throw new TransientDataAccessResourceException("Cannot change the ExecutorType when there is an existing transaction");
          }
          holder.requested();
    
          return holder.getSqlSession();
        }
       SqlSession session = sessionFactory.openSession(executorType);
        ................
        return session;
      }
    注意到这一句 SqlSession session = sessionFactory.openSession(executorType);  调用传递过来的sessionFactory来打开一个sqlSession。上文说到Spring注入的sqlSessionFactory是org.mybatis.spring.SqlSessionFactoryBean。  SqlSessionFactoryBean这个类是用来生成SqlSessionFactory的,这也是一般情况下在Spring环境下生成一个共享的SqlSessionFactory的方法。实际上依赖注入时向基于mybatis的DAO接口(此例中即为BaseDao)注入的是其内部生成的SqlSessionFactory

    public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
    
    			  private static final Log logger = LogFactory.getLog(SqlSessionFactoryBean.class);
    
    			  private Resource configLocation;
    
    			  private Resource[] mapperLocations;
    
    			  private DataSource dataSource;
    
    			  private TransactionFactory transactionFactory;
    
    			  private Properties configurationProperties;
    
    			  private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    
    			  private SqlSessionFactory sqlSessionFactory;
    
    			  private String environment = SqlSessionFactoryBean.class.getSimpleName(); // EnvironmentAware requires spring 3.1
    
    ; .............}
    可以看出SqlSessionFactoryBean中包含了dataSource、sqlSessionFactoryBuilder、sqlSessionFactory以及配置文件Configuration等等的实例,该类使用

    this.sqlSessionFactory = buildSqlSessionFactory(); 

    而buildSqlSessionFactory又调用 this.sqlSessionFactoryBuilder.build(configuration);

    再来看看这个build方法

    public SqlSessionFactory build(Configuration config) {
        return new DefaultSqlSessionFactory(config);
      }
    联系上文可知为BaseDao注入的SqlSessionFactory即为此处的 DefaultSqlSessionFactroy,同时传入配置文件Configuration的实例作为参数。所以上文调用openSession有两种方法 openSessionFromDataSource 和 openSessionFromConnection

    public class DefaultSqlSessionFactory implements SqlSessionFactory {
    
      private final Configuration configuration;
    
      public SqlSession openSession() {
        return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
      }
    private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
          Transaction tx = null;
          final Environment environment = configuration.getEnvironment();
          final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
          tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
          final Executor executor = configuration.newExecutor(tx, execType);  //<strong><span style="color:#ff0000;">这是实际执行SQL语句的执行器</span></strong>
          return new DefaultSqlSession(configuration, executor, autoCommit);  //<span style="color:#ff0000;"><strong>可知 这就是我们所用的SqlSession的本来面目</strong></span>
       
      }
    public SqlSession openSession(Connection connection) {
        return openSessionFromConnection(configuration.getDefaultExecutorType(), connection);
      }
    由上可知,我们实际上使用的SqlSession即为其子类 DefaultSqlSession.

    public class DefaultSqlSession implements SqlSession {
    
      private Configuration configuration;
      private Executor executor;
    
      private boolean autoCommit;
      private boolean dirty;
      
      public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
        this.configuration = configuration;
        this.executor = executor;
        this.dirty = false;
        this.autoCommit = autoCommit;
      }...............................
    DefaultSqlSession实现了SqlSession的所有接口,仔细查看源码可以明显看出 实际上负责执行SQL语句的是Executor。

    Executor的生成,则是通过 org.apache.ibatis.session.Configuration的 newExecutor方法生成。

    public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
    	    executorType = executorType == null ? defaultExecutorType : executorType;
    	    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
    	    Executor executor;
    	    if (ExecutorType.BATCH == executorType) {
    	      executor = new BatchExecutor(this, transaction);
    	    } else if (ExecutorType.REUSE == executorType) {
    	      executor = new ReuseExecutor(this, transaction);
    	    } else {
    	      executor = new SimpleExecutor(this, transaction);
    	    }
    	    if (cacheEnabled) {
    	      executor = new CachingExecutor(executor);
    	    }
    	    executor = (Executor) interceptorChain.pluginAll(executor);
    	    return executor;
    	  }
    可以看出,如果不开启cache的话,创建的Executor只是3中基础类型之一,BatchExecutor专门用于执行批量sql操作,ReuseExecutor会重用statement执行sql操作,SimpleExecutor只是简单执行sql没有什么特别的。开启cache的话(默认是开启的并且没有任何理由去关闭它),就会创建CachingExecutor,它以前面创建的Executor作为唯一参数。CachingExecutor在查询数据库前先查找缓存,若没找到的话调用delegate(就是构造时传入的Executor对象)从数据库查询,并将查询结果存入缓存中。Executor对象是可以被插件拦截的,如果定义了针对Executor类型的插件,最终生成的Executor对象是被各个插件插入后的代理对象。(mybatis的分页是基于内存的逻辑分页,数据量比较大时候往往会占用过多内存,一般提倡的分页方式是物理分页,这就需要自己通过拦截器来实现)。

    public class SimpleExecutor extends BaseExecutor {
    
    		  public SimpleExecutor(Configuration configuration, Transaction transaction) {
    		    super(configuration, transaction);
    		  }
    
    		  public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
    		    Statement stmt = null;
    		    try {
    		      Configuration configuration = ms.getConfiguration();
    		      StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
    		      stmt = prepareStatement(handler, ms.getStatementLog());
    		      return handler.update(stmt);
    		    } finally {
    		      closeStatement(stmt);
    		    }
    		  }
    可以看出,Executor的具体工作都交由 StatementHandler来执行。而StatementHandler也是在Configuration中生成的。

    public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, 
    						RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    
    	 StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
    
    	 statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
    
    	 return statementHandler;
     }
    可以看到每次创建的StatementHandler都是RoutingStatementHandler,它只是一个分发者,他一个属性delegate用于指定用哪种具体的StatementHandler。可选的StatementHandler有 SimpleStatementHandlerPreparedStatementHandlerCallableStatementHandler三种。选用哪种在mapper配置文件的每个statement里指定,默认的是PreparedStatementHandler。同时还要注意到StatementHandler是可以被拦截器拦截的,和Executor一样,被拦截器拦截后的对像是一个代理对象。由于mybatis没有实现数据库的物理分页,众多物理分页的实现都是在这个地方使用拦截器实现的。

     public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    
    		    switch (ms.getStatementType()) {
    		      case STATEMENT:
    			delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
    			break;
    		      case PREPARED:
    			delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
    			break;
    		      case CALLABLE:
    			delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
    			break;
    		      default:
    			throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
    		    }
    
    		  }
    StatementHandler创建后需要执行一些初始操作,比如statement的开启和参数设置、对于PreparedStatement还需要执行参数的设置操作等。在具体的 Executor中执行。代码如下:

     private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
    	    Statement stmt;
    	    Connection connection = getConnection(statementLog);
    	    stmt = handler.prepare(connection);
    	    handler.parameterize(stmt);
    	    return stmt;
    	  }
    其中handler的参数化方法 此handler即PreparedStatementHandler 

    public void parameterize(Statement statement) throws SQLException {
    	    parameterHandler.setParameters((PreparedStatement) statement);
    	  }
    其中 parameterHandler 在 PreparedStatementHandler的基类中BaseStatementHandler
    public abstract class BaseStatementHandler implements StatementHandler {
    
    		  protected final Configuration configuration;
    		  protected final ObjectFactory objectFactory;
    		  protected final TypeHandlerRegistry typeHandlerRegistry;
    		  protected final ResultSetHandler resultSetHandler;
    		  protected final ParameterHandler parameterHandler;
    
    		  protected final Executor executor;
    		  protected final MappedStatement mappedStatement;
    		  protected final RowBounds rowBounds;
    
    		  protected BoundSql boundSql;
    其中 this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql); 在Configuration中生成

    public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    		    ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);
    		    parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
    		    return parameterHandler;
    		  }
    其中 mappedStatement.getLang()返回languageDriver
    public class XMLLanguageDriver implements LanguageDriver {
     public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
       return new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);
     }
    即生成 DefaultParameterHandler

    public class DefaultParameterHandler implements ParameterHandler {
    
    		  private final TypeHandlerRegistry typeHandlerRegistry;
    
    		  private final MappedStatement mappedStatement;
    		  private final Object parameterObject;
    		  private BoundSql boundSql;
    		  private Configuration configuration;
    
    		  public DefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    		    this.mappedStatement = mappedStatement;
    		    this.configuration = mappedStatement.getConfiguration();
    		    this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
    		    this.parameterObject = parameterObject;
    		    this.boundSql = boundSql;
    		  }
    
    		  public Object getParameterObject() {
    		    return parameterObject;
    		  }
    
    		  public void setParameters(PreparedStatement ps) throws SQLException {
    		    ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
    		    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    		    if (parameterMappings != null) {
    		      for (int i = 0; i < parameterMappings.size(); i++) {
    			ParameterMapping parameterMapping = parameterMappings.get(i);
    			if (parameterMapping.getMode() != ParameterMode.OUT) {
    			  Object value;
    			  String propertyName = parameterMapping.getProperty();
    			  if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params
    			    value = boundSql.getAdditionalParameter(propertyName);
    			  } else if (parameterObject == null) {
    			    value = null;
    			  } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
    			    value = parameterObject;
    			  } else {
    			    MetaObject metaObject = configuration.newMetaObject(parameterObject);
    			    value = metaObject.getValue(propertyName);
    			  }
    			  TypeHandler typeHandler = parameterMapping.getTypeHandler();
    			  JdbcType jdbcType = parameterMapping.getJdbcType();
    			  if (value == null && jdbcType == null) jdbcType = configuration.getJdbcTypeForNull();
    			  typeHandler.setParameter(ps, i + 1, value, jdbcType);
    			}
    		      }
    		    }
    		  }
    
    		}
    这里面最重要的一句其实就是最后一句代码,它的作用是用合适的TypeHandler完成参数的设置。那么什么是合适的TypeHandler呢,它又是如何决断出来的呢?BaseStatementHandler的构造方法有这么一句:
    this.boundSql= mappedStatement.getBoundSql(parameterObject);
    它触发了sql 的解析,在解析sql的过程中,TypeHandler也被决断出来了,决断的原则就是根据参数的类型和参数对应的JDBC类型决定使用哪个TypeHandler。比如:参数类型是String的话就用StringTypeHandler,参数类型是整数的话就用IntegerTypeHandler等。
    参数设置完毕后,执行数据库操作(update或query)。如果是query最后还有个查询结果的处理过程。

    如果再结合Mybatis几个重要类来分析一下具体Sql语句的生成过程,了解一下MappedStatement、SqlSource等类 相信Mybatis的实现机制应该就比较清楚了。先写到这里了,如果有疏漏错误处,多多指出啊。

























    展开全文
  • 环境整治工作情况汇报五篇 还青山翠绿,还江河清澈,让空气更加清新,让花艳树影婆娑,让草绿鸟儿欢歌,让家园美丽生机勃勃,我们才能安享多彩生活。今天小编为大家带来是关于城镇环保范文,希望对大家有所...
  • 环境整治工作情况汇报五篇 还青山翠绿,还江河清澈,让空气更加清新,让花艳树影婆娑,让草绿鸟儿欢歌,让家园美丽生机勃勃,我们才能安享多彩生活。今天小编为大家带来是关于城镇环保范文,希望对大家有所...
  • 三流的父母想拥有一流的孩子,这是病 2017-02-04 12:38:47 89723 奋斗精神、职业道德,即使是努力本身,很大程度上也依赖于幸运的家庭环境。别自己懒的要死却成天做梦想生个孩子成为世界首富,比尔...

    三流的父母想拥有一流的孩子,这是病

    2017-02-04 12:38:47
    89723

    奋斗精神、职业道德,即使是努力本身,很大程度上也依赖于幸运的家庭环境。别自己懒的要死却成天做梦想生个孩子成为世界首富,比尔盖茨他爸妈不是又懒又穷。

    本文系网易News沸点工作室《槽值》栏目(公众号:caozhi163)出品,每周更新五期。

    除夕夜,云南镇雄县15岁的男孩小龙(化名)服农药自杀。

    小龙父母常年在外务工,对他也无暇过问。根据小龙遗书和邻居描述,父亲是个暴脾气,在外过得不如意,回家经常打骂孩子。

    性格孤僻又叛逆的小龙自尊心强,一直默默忍受,最后为了“给自己一个解脱”,选择报复性自杀。

    undefined

    遗书中,他指责父亲总给他压力,让他难受:

    我的爸妈在这些年里没有一天他们照顾过我,但我不恨他们,因为他们有很大的负担……但我受不了气,不要把脾气撒在自己儿女身上,他们是无辜的,上帝把他们送你们身边是希望他们得到爱,而不是父母的怒火……爸爸,我死了,你就高兴了,你句句逼人,我没有办法,独有一死方休止……你的不孝儿子,当然也是啥子事都干不了的一个儿子,自己珍重。”

    网友评论:很遗憾,有的人还未成人,心智却过早地负重。有的人,心智还不足以成熟,却过早地生儿育女。

    三毛说:“大部分的中国父母,将孩子当作命根,将孩子视为自己生命的延伸与继续,期望自己一生没完成的理想和光荣,都能在孩子身上实现,更认为,自己人生的经验,百分之百,都可以转移到教育下一代的身上去,又以为孩子是必须无条件听命于父母而不可反抗的,压力便由是产生了。”

    undefined

    一份涉及全国13个省1.5万名学生的报告显示,中学生每5个人中就有1人曾有过自杀的念头,而为自杀做过计划的占6.5%。

    一份心理咨询数据得出,青少年自杀的主要原因是学习。学习不好却被家长逼迫学习以及通过学习改变家庭命运的压力,都是造成自杀悲剧的导火线。

    “不好好学习,长大没出息”是父母常挂在嘴边的一句话。

    这份为子女未来着想的心当然没有错,可若是自己不努力,却要孩子拼命成为“有权势”“光宗耀祖”“有脸面”的人,就有点痴人说梦了。

    真正的教育就是拼爹,这样一种观念被越来越多的人接受。

    undefined资料出自哈佛公开课What’s a fair start?

    在美国,有人调查了146所院校,调查学生的家庭背景、经济背景。这些院校里,只有3%的学生出身贫寒,有超过70%的学生出身富足。家长本身就是孩子的起跑线。

    奋斗精神、职业道德,即使是努力本身,很大程度上也依赖于幸运的家庭环境。无论是你,还是我们,都不敢妄自邀功。

    undefined

    有太多父母不过是平凡普通的市民工人,甚至“光是活着就已经拼尽了全力”。

    以前有读者留言:

    我是普通人,没钱没势,但是我有足够的时间陪伴我的孩子。从幼儿园开始我会每天亲自送她上学,亲自接她回家,和她一起完成每一个作业,度过每一个周末。我根本不指望把她培养成什么了不起的人,我只希望她身体健康,品行端正,有一技之长。

    教育孩子“不飞黄腾达”就对不起全世界对不起双亲的理念,其实是家长的自卑。

    认清现实,敢承认自己的平凡,接受孩子的不完美,不把过多私人预期压在孩子身上,这样的家长才更难能可贵。

    自己从不读书看报,却要求孩子热爱学习;

    一边抠脚看剧刷小说,一边骂书桌前的孩子脑子太笨;

    整天往家里撺掇牌局,用钱打发走问题的孩子,又要求他功课不许落人后。

    在教育上,未必能做到“一流”,却想当然以为,自己的孩子必须成为“一流”。

    诸如此类的家长,只求最好结果,不想自己麻烦,孩子以后牛逼了,他觉得功劳在他;孩子以后没出息,他觉得责任主要在你。

    因此有人调侃:一想到身为父母不用考试就觉得很恐怖,对父母加强管理是构建和谐家庭的首要工作。

    想让孩子更容易出人头地,从自己开始努力拼去吧。别自己懒的要死却成天做梦想生个孩子成为世界首富,比尔盖茨他爸妈不是又懒又穷。

    还有一类家长,将孩子的成长道路规划成自己梦想的样子。

    孩子“不达标”,父母尚且要质问责骂,孩子迷惘时,又敢向谁发问:“我TM到底是为谁而活?”

    子女生来不是还债的,没有义务帮父母弥补人生。

    郎朗成名后,许多家长想让自己的孩子复制他的人生,不看孩子天分,不分孩子性格,硬是把自己的孩子“绑”在钢琴凳上,要求孩子“练不好就别下来”。对于这种家长,郎朗回复:“让这种家长自己去学吧!”

    undefined郎朗鼓励小朋友接触音乐,但不强求他们走职业道路

    以别人为标杆,让孩子去模仿,不如让自己成为孩子的起跑线。

    教育不是说出来的,而是把要说的话做给孩子看。

    杨澜谈及自己的教育经历:“别把劲儿都使在孩子身上,如果自己充实、快乐,有责任感,有情绪管理能力,孩子会模仿你的。”

    三流的家长看成绩,二流的家长看成长,一流的家长看自己。

    “望子成龙”哪有什么错,问题是,自己给孩子一个鸡窝,又怎么能指望孩子变凤凰?

    转载于:https://www.cnblogs.com/yiqianer/p/6596951.html

    展开全文
  • 办公室的学校工作总结 20**年,在大队领导的关心指导下,办公室围绕实现“搭一流的领导班子、建一流的城管队伍、树一流的队伍形象、争一流的执法业绩、创一流的城区环境的工作目标,结合办公室工作特点,致力于搭建...
  • 在开发过程的每个步骤中都使用相同的工作流和类似生产的Kubernetes环境。 常见用例: Kubernetes应用程序的集群内开发。 通过用于开发,测试,CI和共享构建与测试缓存的通用配置,快速且一致的CI管道。 在类似...
  • 一流的本科教育是一流大学的重要基础和基本特征,建设一流大学必须建设一流本科。高等学校要落实立德树人根本任务,高度重视本科教学工作,强化人才培养中心地位;深化教育教学改革,提高人才培养质量;从严治理,营造风清...
  • 其目标是简化分析工作流程并提高您生产率。 通过以下方式从PyPI安装Ibis: pip install ibis-framework 或通过conda-forge与 conda install ibis-framework -c conda-forge Ibis当前提供用于与以下系统进行...
  • 为贯彻落实好会议精神,我们今天召开这次会议,主要任务是传达县动员大会精神,进一步明确整顿经济秩序优化发展环境的任务和重点,动员全乡上下统一思想,提高认识,强化措施,齐抓共管,努力打造一流的环境,营造...
  • 二年级组长的个人工作计划 一、教育教学工作 1、新学期的开学,各个岗位的老师相互配合... 6、积极为老师们创造轻松和谐的工作环境,关注每一位老师的身心健康,使大家带着愉快的心情工作。 二、关注学生动态,?..
  • 20XX年中学综合治理的工作总结 20XX年,我校在县教育局有关部门的安排部署和具体指导下,站在维护社会稳定大局的政治高度,进一步完善综合治理领导责任制,紧紧围绕创建“和谐文明校园”主题,积极开展文明创建活动,以...
  • 要实现地方经济xxx崛起,我们必须围绕“项目兴县、环境立县、富民强县”发展战略,扑下身子,真抓实干,流血流汗,勇争一流。一、要提高认识,整改问题,彻底清除影响全县振兴各种错误思想 一是“三创”意识不强...
  • 深入学习和实践科学发展观,现将我区招商引资工作调研情况报告如下: 一、什么是招商引资 招商引资是指政府利用可支配资源进行政策引导,舆论宣传,开展基础设施建设,创造一流投资环境,吸引投资者到本地区进行...
  • 一年来,学校本着“创一流文明卫生校园环境,做特色教育教学质量品牌”办学理念,深化学校内部改革,全面提高教育质量,不断提高办学品位;以管理带科研、以服务促教研、以教研促发展,实施“三、三、五工程”即...
  • 20XX年学校上半年工作总结 在市教育局正确领导下,我校坚持以改革、创新、发展为指导思想,围绕“施一流管理,建一流师资,创一流环境,出一流质量”办学目标,着眼学生长远,突破三大瓶颈(职业倦怠、经费困难...
  • 实事求是,与时俱进,开拓创新,以创新的工作思路,科学的工作方法,拼搏的精神状态,争创一流的思想境界,务实高效,勤奋工作,在经济社会各个领域创造性地开展工作,取得了较好成绩,~完成了年初制定的目标,使##...
  • 膳食科工作的自我总结 为做好学校餐厅工作,维护学生切身利益,膳食科开展了“以学生为关注焦点”,“树饮食形象,创一流服务”活动,收到了较好效果。具体做法作自我总结如下: 一、制订并完善了各项管理制度,如...
  • workbench努力提供一流的开发环境,使 & 社区在实时算法和定量工作流中获得相同的生产力和性能优势。 产品特点 远程控制云中的交易实例 实时投资组合跟踪和历史快照 监视整个集群中的系统,研究和交易指标 追踪冷藏...
  • 交警大队工作的自我总结范文 县成立以来,全县经济快速发展,交通环境不断改善,机动车辆迅速增加,从1985年100多辆增加到了现在4000多辆。伴随着x县发展历程,作为政府道路交通安全管理职能部门县公安交通...
  • 劳教所岗位练兵的工作总结 根据法律部、省法律厅的安排,我所根据政治刚强、交易懂得、风格精良、法律刚正的总要求,凸起以应知应会根本知识和根本技巧为紧张内容,以强化警魂意识、进步本质本领、锻造过硬风格、...
  • 学生会工作计划工作预期 工作计划要有患未然的原则。要预先想到实行中可能发生的偏差,可能出现的故障,有必要的防范措施或...本学期的工作计划如下: 一、工作重点及指导思想 1.以养成学生良好行为习惯为重点,从...
  • 部门工作计划.doc

    2021-01-15 21:15:07
    部门工作计划 工作计划是一个好的工作的开始,做好了工作计划,就能在工作上减轻了不少,合理了安排时间和工作内容,不仅事倍功半还能省出不少的时间。以下是由小编为大家整理出来的部门工作计划范文,仅供参考。 ...
  • 作为“全国质量效益型先进企业”,国家电力公司“一流火力发电企业”和“双文明单位”一贯重视节能降耗工作,2005年本厂对2X300MW机组一台循环水泵采用国内某高压变频器厂家产品进行了变频调速节能改造试用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 533
精华内容 213
关键字:

一流的工作环境