zoukankan      html  css  js  c++  java
  • 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还在使用和熟悉中……


                 

        




  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3784657.html
Copyright © 2011-2022 走看看