• ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解


                 这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务、日志控制等,在开发中主要用到的是写SQL语句以及熟悉ibatis xml文件都提供的一些标签,这些标签大部分是用来处理推断、逻辑,使得sql能够动态组装变的更灵活。

                 在写代码的工作量上ibatis要比hibernate高一些,在你写了服务层后还须要些dao层,dao层实现,然后这些在hibernate中不须要自己写,仅仅写到服务层就能够调用hibernate提供的对象直接操纵数据,利用hibernate自己封装的一些方法完毕数据库的增删该茶,hibernate是从java实体类映射到了数据库表,我们调用它提供的方法就能够完毕操作数据库,sql语句会更具调用了它的什么方法自己主动生成,ibatis是封装了java实体类到sql语句,运行sql到数据还须要一个过程也是ibatis封装实现,相比开发人员写的代码是不是少了非常多呢。

                 什么时候使用哪一个框架更好一些?

                 ibatis适合在须要往一个系统里面添加新功能,可是表结构不能够修改的情况,由于ibatis在数据库操作细节上比hibernate要灵活非常多,它是面向SQL语句的框架而hibernate直接面向表结构,假设要改变表结构修改的地方会比較多。

                 对于高并发、非常大的数据量系统中,使用ibatis效果要比hibernate好,我们能够自己写优化效率高的sql语句和存储过程来解决高数据量问题,从眼下开发来看hibernate写出来的hsql语句不easy优化,关系越复杂效率就会越慢,当然没有什么是一成不变的hibernate也会自己支持原生SQL语句,完好自己一些不完美的地方。

                 在一个系统的维护上也显然易见,ibatis占有明显优势它把sql写在了配置文件中面,维护的时候假如须要改变某个查询功能,在配置文件中面改改就能够完毕,假设是hibernate就须要修改代码并又一次编译。

                 以下这张是ibatis原理图


                  图中左边是传入參数类型、右边是返回结构类型,中间是配置文件信息,它支持基本数据类型(int/string/boolean)以及对象、map等类型数据,用起来也比較方便。

                  sqlMap-Config.xml相当于hibernate.cfg.xml文件,sqlmap.xml相当于资源文件,比例如以下配置信息

                  举一个查询的样例:一个简单的下拉列表框查询

                  select载入过程

                  当载入select标签的时候,默认选中option子标签有selected=true的那个option,选中标签之后会把option的value属性值赋给select标签的value属性,假设option的value为空,将<option>測试</option>这两个開始和结束标签值赋给select,该实现即是利用了这个赋值过程,value值分为给了0、1、2三个值表示三种类型的查询条件。

                  JSP页面例如以下

                 

    	<span class="STYLE1">
    		请选择查询方式:
    		<select name="selectType" value="">
    			<option  <%=selected=="default"? "selected=true" :"" %> value="0">按默认查询</option>
    			<option  <%=selected=="name"? "selected=true" :"" %> value="1">按类型查询</option>
    			<option  <%=selected=="companyname"? "selected=true" :"" %> value="2">按公司查询</option>
    		</select>
    	请输入keyword:
    	</span>
    


    	<!-- Transaction manager for a single JDBC DataSource DAO IoC -->
    	<bean id="transactionManager"
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource">
    			<ref local="dataSource" />
    		</property>
    
    	</bean>
    	<!-- Apache Database Connection Pool  -->
    	<bean id="dataSource"
    		class="org.apache.commons.dbcp.BasicDataSource"
    		destroy-method="close">
    		<property name="driverClassName">
    			<value>${db.driver}</value>
    		</property>
    		<property name="url">
    			<value>${db.url}</value>
    		</property>
    		<property name="username">
    			<value>${db.user}</value>
    		</property>
    		<property name="password">
    			<value>${db.password}</value>
    		</property>
    	</bean>
    	
    	<!-- sqlMapClient for DAOIbatisImpl  -->
    	<bean id="sqlMapClient"
    		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    		<property name="configLocation">
    			<value>classpath:sql-map-config.xml</value>
    		</property>
    		<property name="dataSource">
    			<ref bean="dataSource" />
    		</property>
    		<property name="lobHandler" ref="lobHandler"/> 
    	</bean>
     	<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>  

                sqlmap.xml代码

    	
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
    
    <!--
      Note: auto-generated at 2006-7-6 16:05:43.
    -->
    
    <sqlMap namespace="ns">
    
    
      <resultMap id="orgInfoChildId" class="com.zhjy.domain.Organization">
        <result column="id" property="id" jdbcType="VARCHAR" />
        <result column="parent_id" property="pid" jdbcType="VARCHAR" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="isParent" property="isParent" jdbcType="VARCHAR" />
        <result column="checked" property="checked" jdbcType="VARCHAR" />
        <result column="open" property="open" jdbcType="VARCHAR" />
      </resultMap>
    	<!-- 依据左側树查询记录语句開始    -->
    	<select id="ns.findContacts_count" resultClass="java.lang.Integer"
    		parameterClass="java.util.Map">
    		SELECT COUNT(ID)
    		FROM category,contactinfo,category_contactinfo
    		WHERE category.ID=category_contactinfo.CATEGORY_ID AND contactinfo.contactid=category_contactinfo.CONTACT_ID
    			
    			<isEqual prepend="and" property="selectType" compareValue="1">
    				<isNotEmpty prepend="" property="keyword">
    					name like '%$keyword$%'
    				</isNotEmpty>
    			</isEqual>
    			<isEqual prepend="and" property="selectType" compareValue="2">
    				<isNotEmpty prepend="" property="keyword">
    					companyname like '%$keyword$%'
    				</isNotEmpty>
    			</isEqual>
    			<isEqual prepend="and" property="selectType" compareValue="0">
    				<isNotEmpty prepend="" property="keyword">
    					(name like '%$keyword$%'
    				</isNotEmpty>
    				<isNotEmpty prepend="or" property="keyword">
    					companyname like '%$keyword$%')
    				</isNotEmpty>
    			</isEqual>
    			<isNotEmpty prepend="and" property="id">
    				id=#id:VARCHAR#
    			</isNotEmpty>
    	</select>
    
    </sqlMap>

                  这个是动态载入查询条件,以后假设新增了查询选项对应的改改配置文件就能够,不须要再修改代码里面的东西,比曾经灵活了i些。

                   ibatis还在使用和熟悉中……


                 

        




  • 相关阅读:
    给你的博客园加个面板娘!
    idea实现简单热部署
    idea 上传svn忽略文件
    谈一谈AOP面向切面编程
    做一个自定义注解
    使用aop切面编写日志模块
    数据结构之链表
    数据结构之队列
    数据结构之栈
    数据结构之线性表
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4260794.html
Copyright © 2020-2023  润新知